Удаленное копирование файлов с помощью Powershell
Я пишу a powershell скрипт, который я хочу запустить с сервере A. Я хочу подключиться к серверу B и скопировать файл на сервер в качестве резервного.
Если это невозможно сделать, то я хотел бы подключиться к серверу B с сервера A и скопировать файл в другой каталог на сервере B.
Я вижу, что они но я не вижу, как дать имя компьютеру.
Я бы подумал, что могу что-то сделать как
Copy-Item -ComputerName ServerB -Path C:Programstemptest.txt -Destination (not sure how it would know to use ServerB or ServerA)
Как я могу это сделать?
5 ответов:
просто использовать административные ресурсы для копирования файлов между системами. Так гораздо проще.
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
С PowerShell версии 5 года (входит в Windows Server 2016 и, загружается как часть WMF 5 для более ранних версий), это возможно с remoting. Преимущество этого заключается в том, что он работает, даже если по какой-либо причине вы не можете получить доступ к общим ресурсам.
чтобы это работало, в локальном сеансе, в котором инициируется копирование, должен быть установлен 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
.
Почему бы вам не использовать
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
Если для доступа к удаленному файлу требуются ваши учетные данные, вы можете создать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)
нет из ответов не работал для меня. Продолжал получать эту ошибку:
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 nanoserver}\C$