Piszę skrypt PowerShell, który chcę uruchomić z serwera A. Chcę połączyć się z serwerem B i skopiować plik na serwer A jako kopię zapasową.
Jeśli nie można tego zrobić, chciałbym połączyć się z serwerem B z serwera A i skopiować plik do innego katalogu na serwerze B.
Widzę Copy-Item
polecenie, ale nie wiem, jak nadać mu nazwę komputera.
Myślałem, że mógłbym zrobić coś takiego
Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)
Jak mogę to zrobić?
powershell
powershell-2.0
chobo2
źródło
źródło
Odpowiedzi:
Działa to tylko wtedy, gdy sesja programu PowerShell jest uruchomiona przez użytkownika, który ma prawa do obu udziałów administracyjnych.
Sugeruję użycie zwykłego udziału sieciowego na serwerze B z dostępem tylko do odczytu dla wszystkich i po prostu zadzwoń (z serwera A):
Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
źródło
Copy-Item -FromSession
).Począwszy od wersji 5 programu PowerShell (zawartego w systemie Windows Server 2016, do pobrania jako część programu WMF 5 dla wcześniejszych wersji ) jest to możliwe dzięki zdalnej obsłudze. Zaletą tego jest to, że działa, nawet jeśli z jakiegokolwiek powodu nie możesz uzyskać dostępu do udziałów.
Aby to zadziałało, sesja lokalna, w której inicjowane jest kopiowanie, musi mieć zainstalowany program PowerShell 5 lub nowszy. Sesja zdalna nie musi mieć zainstalowanego programu PowerShell 5 - działa z wersjami PowerShell tak niskimi jak 2 i wersjami Windows Server tak niskimi, jak 2008 R2. [1]
Z serwera A utwórz sesję na serwerze B:
$b = New-PSSession B
A potem jeszcze z A:
Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt
Kopiowanie elementów do B odbywa się za pomocą
-ToSession
. Zwróć uwagę, że ścieżki lokalne są używane w obu przypadkach; musisz śledzić, na jakim serwerze jesteś.[1]: podczas kopiowania z lub na zdalny serwer, który ma tylko PowerShell 2, uważaj na ten błąd w PowerShell 5.1 , który w momencie pisania oznacza, że rekurencyjne kopiowanie plików nie działa
-ToSession
, najwyraźniej kopiowanie nie działa wszystko z-FromSession
.źródło
scp
nassh
Linux ... nie trzeba męczyć się z akcji brzydkie!Użyj
net use
lub,New-PSDrive
aby utworzyć nowy dysk:New-PsDrive: utwórz nowy PsDrive widoczny tylko w środowisku PowerShell:
New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share Copy-Item BigFile Y:\BigFileCopy
Wykorzystanie sieci: utwórz nowy dysk widoczny we wszystkich częściach systemu operacyjnego.
Net use y: \\ServerName\Share Copy-Item BigFile Y:\BigFileCopy
źródło
New-PSDrive : A specified logon session does not exist. It may already have been terminated
-> Myślę, że poprzednia sesja nadal trwa -> Więc próbowałem użyćRemove-PSDrive
-> nadal nie działa. Teżnet use <driveLetter> /delete
nie pomogło. Czy mogę jeszcze coś zrobić, aby móc uruchomić to polecenie w konfiguracji kompilacji oprogramowania?New-PSDrive
dwa razy, co powinieneśA drive with the name 'Y' already exists.
Na wypadek, gdyby zdalny plik wymagał Twojego poświadczenia, aby uzyskać do niego dostęp, możesz wygenerować obiekt System.Net.WebClient za pomocą polecenia cmdlet New-Object do „Kopiuj plik zdalnie”, na przykład
$Source = "\\192.168.x.x\somefile.txt" $Dest = "C:\Users\user\somefile.txt" $Username = "username" $Password = "password" $WebClient = New-Object System.Net.WebClient $WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) $WebClient.DownloadFile($Source, $Dest)
Lub jeśli chcesz przesłać plik, możesz użyć UploadFile:
$Dest = "\\192.168.x.x\somefile.txt" $Source = "C:\Users\user\somefile.txt" $WebClient.UploadFile($Dest, $Source)
źródło
Żadna z powyższych odpowiedzi nie zadziałała dla mnie. Ciągle otrzymuję ten błąd:
Copy-Item : Access is denied + CategoryInfo : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException> + FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand
Więc to zrobiło to dla mnie:
netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes
Następnie z mojego hosta moja maszyna w polu Uruchom właśnie zrobiłem to:
\\{IP address of nanoserver}\C$
źródło