#powershell
#powershell
Вопрос:
Я хочу скопировать файл с моего локального сервера на удаленный сервер без WINRM.Удаленный сервер получил учетные данные и не находится в локальной сети или локальном домене моего локального сервера. Пожалуйста, у вас есть решение?
I have this error:
MethodInvocationException: D:powershellip.ps1:23:1
Line |
23 | $WebClient.DownloadFile($Source, $Dest)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Exception calling "DownloadFile" with "2" argument(s): "An exception occurred during a WebClient request."
Here is my code:
$Source = "C:test10test10.txt"
$Dest = "\public_ipadress_serverC:test11test10.txt"
$Username = "administrator"
$Password= convertto-securestring -AsPlainText -Force -String password
$MyIP = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
$MyIP | Out-File $Source
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
$WebClient.DownloadFile($Source, $Dest)
Комментарии:
1. Я не могу использовать WINRM, потому что его слишком сложно настроить на моем сервере и на удаленном сервере. Я уже прочитал эту ссылку, поэтому я попробую другое решение. docs.microsoft.com/fr-fr/powershell/module /…
Ответ №1:
Можно ли использовать стандартную сетевую копию UNC? Я бы рассмотрел возможность сопоставления диска с общим ресурсом на вашем удаленном компьютере. команда net use позволит вам сделать это, введя учетные данные для удаленного компьютера. Затем вы можете скопировать файл через подключенный диск. Я также добавил некоторый код для предоставления учетных данных более безопасным способом. Не очень хорошая практика хранить пароли в виде открытого текста, что, похоже, вы можете делать.
$source = "C:test10test10.txt"
$desiredMappedDrive = "J"
$desiredMappedDrivePath = "\public_ipadress_serverC$" # Map to administrative C: drive share requires administrator credentials)
$destination = "${desiredMappedDrive}:test11test10.txt"
$passwordFile = "C:tempencryptedCred"
if (-not (Test-Path $passwordFile) ) {
$cred = Get-Credential
} else {
$fileContents = Get-Content $passwordFile
$userEncryptedString = $fileContents[0]
$passEncryptedString = $fileContents[1]
$userSecureString = $userEncryptedString | ConvertTo-SecureString
$passSecureString = $passEncryptedString | ConvertTo-SecureString
# convert secure string back to text
$userString = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto( [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($userSecureString) )
$cred = [pscredential]::new($userString, $passSecureString)
}
if ($cred) {
$response = net use ${desiredMappedDrive}: $desiredMappedDrivePath /USER:$($cred.UserName) $($cred.GetNetworkCredential().Password)
$response
if ($response -match "command completed successfully") {
$cred.UserName | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File $passwordFile
$cred.Password |ConvertFrom-SecureString | Out-File -Append $passwordFile
Write-Host "Credentials have been saved to $passwordFile. While file exists you will not be asked to enter credentials for future script executions"
}
Copy-Item $source -Destination $destination
}