Kopiuj plik zdalnie za pomocą Powershell

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 tego nie da się zrobić, to chciałbym połączyć się z serwerem B z serwera a i skopiować plik do innego katalogu w serwerze B.

Widzę Copy-Item komendę, ale nie widzę, jak nadać jej nazwę komputera.

Myślałem, że mogę 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ć?
Author: A-Sharabiani, 2012-05-24

5 answers

Po prostu użyj udziałów administracyjnych do kopiowania plików między systemami. Tak jest łatwiej.

Copy-Item -Path \\serverb\c$\programs\temp\test.txt -Destination \\servera\c$\programs\temp\test.txt;

Używając ścieżek UNC zamiast ścieżek lokalnego systemu plików, pomagasz upewnij się, że skrypt jest wykonywalny z dowolnego systemu klienta z dostęp do tych ścieżek UNC. Jeśli używasz lokalnych ścieżek systemu plików, to zmuszasz się do uruchomienia skryptu na określonym komputerze.

To działa tylko wtedy, gdy sesja PowerShell działa pod użytkownikiem, który ma prawa do obu udziałów administracyjnych. ProponujÄ ™ uĹźyÄ ‡ zwykĹ 'ego uĹźytkowania sieci na serwerze B z dostÄ ™ pem readonly do kaĹźdego i po prostu wywoĹ' aÄ ‡(z serwera a): {]}

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose
 77
Author: Trevor Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 16:45:34

Po zainstalowaniu systemu Windows Server 2016, można go pobrać jako część WMF 5 dla wcześniejszych wersji), jest to możliwe dzięki remotingowi. Zaletą tego jest to, że działa nawet jeśli z jakiegokolwiek powodu nie możesz uzyskać dostępu do akcji.

Aby to zadziałało, lokalna sesja, w której inicjowane jest kopiowanie, musi mieć zainstalowany PowerShell 5 lub wyższy. Zdalna sesja nie Nie musi mieć zainstalowany PowerShell 5 - działa z PowerShell wersje tak niskie, jak 2, i Windows Server wersje tak niskie, jak 2008 R2.[1]

Z serwera a, Utwórz sesję na serwerze B:

$b = New-PSSession B

A potem jeszcze od 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. Pamiętaj, że ścieżki lokalne są używane w obu przypadkach; musisz śledzić, na jakim serwerze się znajdujesz.


[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 zapis oznacza, że rekurencyjne kopiowanie plików nie działa z -ToSession, widocznie kopiowanie nie działa w ogóle z -FromSession.

 54
Author: Jeroen Mostert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 12:40:18

Dlaczego nie użyjesz net use lub New-PSDrive do utworzenia nowego dysku.

Nowy-PsDrive: utwórz nowy PsDrive widoczny tylko w środowisku powershell:

New-PSDrive -Name Y -PSProvider filesystem -Root \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Net use: utwórz nowy dysk widoczny we wszystkich częściach systemu operacyjnego.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy
 36
Author: JPBlanc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-24 17:11:40

Na wypadek, gdyby zdalny plik wymagał dostępu do twojego poświadczenia, możesz wygenerować obiekt System.Net. WebClient używając cmdlet New-Object , Aby "skopiować plik zdalnie", Tak

$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)
 13
Author: Scott YAN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 21:12:38

Żadna z powyższych odpowiedzi nie zadziałała. Ciągle dostaję 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 Run po prostu zrobić to \{ip nanoserver}\C$

 0
Author: RogerW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-20 09:55:33