copy-item с альтернативными учетными данными
Я использую CTP powershell v2. У меня есть сценарий, который должен выходить на различные сетевые ресурсы в нашем dmz и копировать некоторые файлы. Однако проблема, с которой я столкнулся, заключается в том, что, очевидно, командлеты powershell, такие как copy-item, test-path и т. Д., Не поддерживают альтернативные учетные данные...
У кого-нибудь есть предложения о том, как лучше всего выполнить мою задачу?
13 ответов
Я сталкивался с этим недавно, и в самых последних версиях Powershell появился новый модуль BitsTransfer, который позволяет передавать файлы с использованием BITS и поддерживает использование параметра -Credential.
В следующем примере показано, как использовать модуль BitsTransfer для копирования файла из общего сетевого ресурса на локальный компьютер с использованием указанного объекта PSCredential.
Import-Module bitstransfer
$cred = Get-Credential
$sourcePath = \\server\example\file.txt
$destPath = C:\Local\Destination\
Start-BitsTransfer -Source $sourcePath -Destination $destPath -Credential $cred
Другой способ справиться с этим - использовать стандартную команду "net use". Эта команда, однако, не поддерживает пароль "securestring", поэтому после получения объекта учетных данных необходимо получить расшифрованную версию пароля для передачи команде "net use".
$cred = Get-Credential
$networkCred = $cred.GetNetworkCredential()
net use \\server\example\ $networkCred.Password /USER:$networkCred.UserName
Copy-Item \\server\example\file.txt C:\Local\Destination\
Поскольку PowerShell не поддерживает использование "-Credential" с помощью многих командлетов (очень раздражает), а сопоставление сетевого диска через WMI оказалось очень ненадежным в PS, я обнаружил, что предварительное кэширование учетных данных пользователя с помощью команды net use позволяет работают довольно хорошо
# cache credentials for our network path
net use \\server\C$ $password /USER:$username
Кажется, что любая операция, которая использует \\server\C$ в пути, работает с помощью командлетов *-item.
Вы также можете удалить общий ресурс, когда закончите:
net use \\server\C$ /delete
PowerShell 3.0 теперь поддерживает учетные данные в поставщике файловой системы. Чтобы использовать альтернативные учетные данные, просто используйте параметр Credential в командлете New-PSDrive
PS > New-PSDrive -Name J -PSProvider FileSystem -Root \\server001\sharename -Credential mydomain\travisj -Persist
После этой команды вы можете получить доступ к вновь созданному диску и выполнять другие операции, включая копирование или перемещение файлов, как на обычном диске. вот полное решение:
$Source = "C:\Downloads\myfile.txt"
$Dest = "\\10.149.12.162\c$\skumar"
$Username = "administrator"
$Password = ConvertTo-SecureString "Complex_Passw0rd" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential($Username, $Password)
New-PSDrive -Name J -PSProvider FileSystem -Root $Dest -Credential $mycreds -Persist
Copy-Item -Path $Source -Destination "J:\myfile.txt"
Это старый вопрос, но я просто обновляю его для будущих искателей.
PowerShell v3 теперь поддерживает использование параметра -Credential для операций с файловой системой.
Надеюсь, что это помогает другим, ищущим такое же решение.
Я попытался бы сопоставить диск с удаленной системой (используя "net use" или WshNetwork.MapNetworkDrive, оба метода поддерживают учетные данные), а затем использовал copy-item.
Вот мой скрипт, который запускается как LocalSystem на компьютере, но для доступа к сетевому файлу требуются учетные данные пользователя domaim. Это позволяет хранить пароль пользователя в зашифрованном файле safe-ish; это может прочитать только пользователь, который написал это.
Установка и изменение пароля выполняется путем копирования файла с открытым текстом в нем на аппарат. При следующем запуске сценария он считывает пароль, шифрует его и затем удаляет незашифрованный пароль.
$plaintext_password_file = 'C:\plaintext.txt' # Stores the password in plain text - only used once, then deleted
$encryted_password_file = 'C:\copy_pass.txt' # Stores the password in "safe" encrypted form - used for subsequent runs of the script
# - can only be decrypted by the windows user that wrote it
$file_copy_user = 'OURDOMAIN\A_User'
# Check to see if there is a new plaintext password
if (Test-Path $plaintext_password_file)
{
# Read in plaintext password, convert to a secure-string, convert to an encrypted-string, and write out, for use later
get-content $plaintext_password_file | convertto-securestring -asplaintext -force | convertfrom-securestring | out-file $encryted_password_file
# Now we have encrypted password, remove plain text for safety
Remove-Item $plaintext_password_file
}
# Read in the encrypted password, convert to a secure-string
$pass = get-content $encryted_password_file | convertto-securestring
# create a credential object for the other user, using username and password stored in secure-string
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $file_copy_user,$pass
# Connect to network file location as the other user and map to drive J:
New-PSDrive -Name J -PSProvider FileSystem -Root "\\network\file_directory" -Credential $credentials
# Copy the file to J:
Copy-Item -Force -Verbose -Path "C:\a_file.txt" -Destination "J:\"
В качестве дополнительного уточнения: имя пользователя также может быть зашифровано, а не жестко закодировано.
Более новая версия PowerShell справляется с этим, и в документации MS есть отличный пример копирования файла с другими учетными данными.
$Session = New-PSSession -ComputerName "Server02" -Credential "Contoso\User01"
Copy-Item "D:\Folder002\" -Destination "C:\Folder002_Copy\" -ToSession $Session
Я знаю, что PowerShell 3 поддерживает это прямо из коробки, но, к сведению, если вы застряли в PowerShell 2, вам в основном придется либо использовать устаревшую версию. net use
команда (как предложено несколькими другими), или модуль Олицетворения, который я написал некоторое время назад специально для решения этой проблемы.
Этот вопрос решает очень связанную проблему, которая может помочь при использовании общих сетевых ресурсов в powershell.
Вернуть это из мертвых снова. Я справился с подобной проблемой с учетными данными, поместив.ps1 в командный файл и выполнив Win7, Shift + r.Click RunAs. Если вы хотите, вы также можете использовать PsExec таким образом:
psexec.exe /accepteula /h /u user /p pwd cmd /c "echo. | powershell.exe -File script.ps1"
Вот пост, где кто-то заставил его работать. Похоже, что это требует изменения реестра.
очевидно, что командлеты powershell, такие как copy-item, test-path и т. д., не поддерживают альтернативные учетные данные...
Похоже, что они делают здесь, copy-item, безусловно, включает параметр -Credential.
PS C: \> gcm -syn copy-item Copy-Item [-Path][[-Destination] ] [-Container] [-Force] [-Filter ] [-I nclude ] [-Exclude ] [-Recurse] [-PassThru] [-Credential ] [...]
Вы должны иметь возможность передавать любые учетные данные, которые хотите, в параметр -Credential. Так что-то вроде:
$ cred = Get-Credential
[Введите учетные данные]
Copy-Item -Path $ из -Destination $ в -Credential $credit