copy-item с альтернативными учетными данными - PullRequest
37 голосов
/ 04 марта 2009

Я использую CTP powershell v2. У меня есть сценарий, который должен выходить на различные сетевые ресурсы в нашем dmz и копировать некоторые файлы. Однако проблема, с которой я столкнулся, заключается в том, что командлеты powershell, такие как copy-item, test-path и т. Д., Не поддерживают альтернативные учетные данные ...

У кого-нибудь есть предложения о том, как лучше всего выполнить мою задачу ..?

Ответы [ 12 ]

40 голосов
/ 23 марта 2011

Я столкнулся с этим недавно, и в самых последних версиях Powershell появился новый Модуль BitsTransfer , который позволяет передавать файлы с использованием BITS и поддерживает использование Параметр учетных данных.

В следующем примере показано, как использовать модуль 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\
25 голосов
/ 17 февраля 2010

Поскольку 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
16 голосов
/ 03 июня 2015

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"
9 голосов
/ 03 мая 2012

Это старый вопрос, но я просто обновляю его для будущих искателей.

PowerShell v3 теперь поддерживает использование параметра -Credential для операций с файловой системой.

Надеюсь, это поможет другим, ищущим то же решение.

6 голосов
/ 05 марта 2009

Я бы попытался сопоставить диск с удаленной системой (используя «net use» или WshNetwork.MapNetworkDrive, оба метода поддерживают учетные данные), а затем использовал copy-item.

2 голосов
/ 25 сентября 2012

Я знаю, что PowerShell 3 теперь поддерживает это из коробки , но для справки: если вы застряли в PowerShell 2, вам, в основном, придется либо использовать устаревшую команду net use предложенный несколькими другими), или модуль олицетворения, который я написал некоторое время назад специально для решения этой проблемы.

0 голосов
/ 24 августа 2017

Вот мой сценарий, который запускается как 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:\"

В качестве дополнительного уточнения: имя пользователя также может быть зашифровано, а не жестко закодировано.

0 голосов
/ 23 ноября 2012

Возвращение этого из мертвых снова. Я справился с подобной проблемой с учетными данными, обернув .ps1 в командный файл и выполнив Win7, Shift + r.Click RunAs. Если вы хотите, вы также можете использовать PsExec таким образом:

psexec.exe /accepteula /h /u user /p pwd cmd /c "echo. | powershell.exe -File script.ps1"
0 голосов
/ 11 марта 2009

Этот вопрос решает очень связанную проблему, которая может помочь при использовании общих сетевых ресурсов в powershell .

0 голосов
/ 04 марта 2009

Здесь - пост, где кто-то заставил его работать. Похоже, это требует изменения реестра.

...