При копировании файлов на удаленный компьютер с помощью командлета Copy-Item могут возникнуть некоторые проблемы, и сегодня речь пойдет о том, как их можно обойти.
К примеру, нам необходимо скопировать файлы из локальной папки C:\Scripts на удаленный сервер DC02 в папку C:\Temp. Для начала попробуем такую команду:
Copy-Item -Path C:\Scripts -Destination \\DC02\Temp
В принципе команда правильная, но для того, чтобы она отработала, папка Temp на удаленном компьютере должна быть расшарена. Как вариант, можно воспользоваться административной шарой, которая есть на любом компьютере по умолчанию:
Copy-Item -Path C:\Scripts -Destination \\DC02\C$\Temp
Но чтобы попасть на административную шару необходимо выполнить команду от имени пользователя, имеющего административный доступ на удаленном компьютере. В противном случае получим ошибку доступа.
Для ввода альтернативных учетных данных у командлета Copy-Item имеется специальный ключ Credential, поэтому попробуем так:
Copy-Item -Path C:\Scripts -Destination \\DC02\C$\Temp -Credential $(Get-Credentials)
Однако и тут не все гладко. Оказывается Copy-Item не поддерживает ввод учетных данных для файловой системы.
Обойти это ограничение можно несколькими путями. Например командлет New-PSDrive позволяет указывать учетные данные, поэтому можно подмонтировать папку на удаленном компьютере как сетевой диск:
New-PSDrive -Name X -PSProvider FileSystem -Root ″\\dc02\C$\Temp″ -Credential $(Get-Credential)
Скопировать файлы с помощью Copy-Item:
Copy-Item -Path C:\Scripts -Destination ″X:″ -Recurse -Force
И удалить диск:
Remove-PSDrive -Name X -Force
Как вариант, можно удаленно расшарить нужную папку. Для начала создадим на удаленный компьютер CIM-сессию с правами администратора:
$session = New-CimSession -ComputerName dc02 -Credential $(Get-Credential)
Затем расшарим папку и выдадим к ней доступ:
New-SMBShare -Name ″Temp″ -Path ″C:\Temp″ -CimSession $session -Fullaccess ″Everyone″
На созданную шару скопируем нужные файлы:
Copy-Item -Path C:\Scripts -Destination \\DC02\Temp -Recurse -Force
И заметем следы:)
Remove-SMBShare -Name ″Temp″ -CimSession $session -Force
Remove-CimSession $session
И еще один вариант. В пятой версии PowerShell у командлета Copy-Item появились ключи ToSession и FromSession, дающие возможность копировать файлы прямо в удаленную сессию или из нее. Для примера создадим сессию на dc02:
$credentials = Get-Credential
$session = New-PSSession -ComputerName dc02 -Credential $credentials
После того, как сессия создана, можно свободно копировать файлы на удаленный компьютер:
Copy-Item -Path C:\Scripts -Destination C:\Temp -Recurse -ToSession $session
и обратно:
Copy-Item -Path C:\Temp -Destination C:\Temp -Recurse -Force -FromSession $session
Это самый удобный и, что немаловажно, безопасный способ. Но, к сожалению, он доступен только в PowerShell 5.0.
Есть еще один способ. Запускаете powershell от пользователя у которого есть права на сервер, и выполняете командлет copy-item с указанием административной шары.