Копируйте файл удаленно с помощью PowerShell

Я пишу сценарий PowerShell, который хочу запустить с сервера А. Я хочу подключиться к серверу Б и скопировать файл на сервер А в качестве резервной копии.

Если это невозможно, я хотел бы подключиться к серверу B с сервера A и скопировать файл в другой каталог на сервере B.

Я вижу команду Copy-Item, но не вижу, как дать ей имя компьютера.

Я бы подумал, что мог бы сделать что-то вроде

Copy-Item -ComputerName ServerB -Path C:\Programs\temp\test.txt -Destination (not sure how it would know to use ServerB or ServerA)

Как я могу это сделать?

Ответ 1

Просто используйте административные ресурсы для копирования файлов между системами. Так намного проще.

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

Используя UNC-пути вместо локальных файловых систем, вы помогаете убедиться, что ваш скрипт исполняется из любой клиентской системы, имеющей доступ к этим UNC-путям. Если вы используете локальные пути файловой системы, то вы запускаете сценарий на определенном компьютере.

Это работает только тогда, когда сеанс PowerShell выполняется под пользователем, который имеет права на оба административных ресурса.

Я предлагаю использовать обычный сетевой ресурс на сервере B с доступом только для чтения для всех и просто позвонить (с сервера A):

Copy-Item -Path "\\\ServerB\SharedPathToSourceFile" -Destination "$Env:USERPROFILE" -Force -PassThru -Verbose

Ответ 2

Начиная с версии 5 PowerShell (входит в состав Windows Server 2016, загружается как часть WMF 5 для более ранних версий), это возможно с удаленным взаимодействием. Преимущество этого заключается в том, что он работает, даже если по какой-либо причине вы не можете получить доступ к общим ресурсам.

Чтобы это работало, в локальном сеансе, где начинается копирование, должен быть установлен PowerShell 5 или выше. Для удаленного сеанса не требуется устанавливать PowerShell 5 - он работает с версиями PowerShell от 2 и версиями Windows Server начиная с 2008 R2. [1]

С сервера A создайте сеанс на сервере B:

$b = New-PSSession B

А потом еще из А:

Copy-Item -FromSession $b C:\Programs\temp\test.txt -Destination C:\Programs\temp\test.txt

Копирование элементов в B выполняется с помощью -ToSession. Обратите внимание, что локальные пути используются в обоих случаях; Вы должны отслеживать, на каком сервере вы находитесь.


[1]: при копировании с или на удаленный сервер, на котором установлен только PowerShell 2, остерегайтесь этой ошибки в PowerShell 5.1, которая на момент написания означает, что рекурсивное копирование файлов не работает с -ToSession, по-видимому, копирование не вообще не работаю с -FromSession.

Ответ 3

Используйте net use или New-PSDrive для создания нового диска:

New-PsDrive: создайте новый PsDrive, видимый только в среде PowerShell:

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

Использование по сети: создайте новый диск, видимый во всех частях ОС.

Net use y: \\ServerName\Share
Copy-Item BigFile Y:\BigFileCopy

Ответ 4

На всякий случай, если для доступа к удаленному файлу нужны ваши учетные данные, вы можете сгенерировать объект System.Net.WebClient с помощью командлета New-Object для "Удаленного копирования файла", например, так:

$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)

Или, если вам нужно загрузить файл, вы можете использовать UploadFile:

$Dest = "\\192.168.x.x\somefile.txt"
$Source   = "C:\Users\user\somefile.txt"

$WebClient.UploadFile($Dest, $Source)

Ответ 5

Ни один из приведенных выше ответов не работал для меня. Я продолжал получать эту ошибку:

Copy-Item : Access is denied
+ CategoryInfo          : PermissionDenied: (\\192.168.1.100\Shared\test.txt:String) [Copy-Item], UnauthorizedAccessException>   
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand

Так что это сделал это для меня:

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

Затем с моего хоста моя машина в окне "Выполнить" я просто сделал это:

\\{IP address of nanoserver}\C$