wake-up-neo.net

copy-item Mit alternativen Anmeldeinformationen

Ich verwende das CTP von Powershell v2. Ich habe ein Skript geschrieben, das an verschiedene Netzwerkfreigaben in unserem dmz-Laufwerk gehen und einige Dateien kopieren muss. Ich habe jedoch das Problem, dass offensichtlich Cmdlets von PowerShell wie copy-item, test-path usw. alternative Anmeldeinformationen nicht unterstützen ...

Hat jemand einen Vorschlag, wie ich meine Aufgabe am besten erledigen kann?

35
xspydr

Ich bin dem kürzlich begegnet, und in den neuesten Versionen von Powershell gibt es ein neues BitsTransfer Module , das Dateiübertragungen mit BITS ermöglicht und die Verwendung des Parameters -Credential unterstützt.

Das folgende Beispiel zeigt, wie Sie mit dem BitsTransfer-Modul eine Datei mit einem angegebenen PSCredential-Objekt von einer Netzwerkfreigabe auf einen lokalen Computer kopieren.

Import-Module bitstransfer
$cred = Get-Credential
$sourcePath = \\server\example\file.txt
$destPath = C:\Local\Destination\
Start-BitsTransfer -Source $sourcePath -Destination $destPath -Credential $cred

Eine andere Möglichkeit, dies zu handhaben, ist die Verwendung des Standardbefehls "Net Use". Dieser Befehl unterstützt jedoch kein "Secureestring" -Passwort. Nachdem Sie das Berechtigungsnachweisobjekt abgerufen haben, müssen Sie eine entschlüsselte Version des Passworts anfordern, um an den Befehl "Net Use" übergeben zu werden.

$cred = Get-Credential
$networkCred = $cred.GetNetworkCredential()
Net Use \\server\example\ $networkCred.Password /USER:$networkCred.UserName
Copy-Item \\server\example\file.txt C:\Local\Destination\
39
chills42

Da PowerShell die Verwendung von "-Credential" über viele der Cmdlets ( very ärgerlich) nicht unterstützt und das Zuordnen eines Netzlaufwerks über WMI sich in PS als sehr unzuverlässig erwies, fand ich die Vor-Zwischenspeicherung der Benutzeranmeldeinformationen über ein Net Use-Befehl, um ganz gut zu funktionieren:

# cache credentials for our network path
Net Use \\server\C$ $password /USER:$username

Jede Operation, die \\ Server\C $ im Pfad verwendet, scheint mit den Cmdlets * -item zu funktionieren.

Sie können die Freigabe auch löschen, wenn Sie fertig sind:

Net Use \\server\C$ /delete
24
wes

PowerShell 3.0 unterstützt jetzt Anmeldeinformationen für den FileSystem-Anbieter. Verwenden Sie für die Verwendung alternativer Anmeldeinformationen einfach den Parameter Credential für das Cmdlet New-PSDrive

PS > New-PSDrive -Name J -PSProvider FileSystem -Root \\server001\sharename -Credential mydomain\travisj -Persist

Nach diesem Befehl können Sie jetzt auf das neu erstellte Laufwerk zugreifen und andere Vorgänge ausführen, einschließlich Kopieren oder Verschieben von Dateien wie ein normales Laufwerk. Hier ist die vollständige Lösung:

$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"
12
Santosh Panda

Dies ist eine alte Frage, aber ich aktualisiere sie nur für zukünftige Finder.

PowerShell v3 unterstützt jetzt die Verwendung des Parameters -Credential für Dateisystemvorgänge.

Hoffe, das hilft anderen bei der Suche nach der gleichen Lösung.

8
x0n

Ich würde versuchen, dem fernen System ein Laufwerk zuzuordnen (mithilfe von 'Net Use' oder WshNetwork.MapNetworkDrive, beide Methoden unterstützen Anmeldeinformationen) und dann copy-item.

6
Shay Levy

Ich weiß, dass PowerShell 3 dies sofort unterstützt now, aber für die Aufzeichnung: Wenn Sie auf PowerShell 2 hängen bleiben, müssen Sie entweder den Legacy-Befehl Net Use (wie von mehreren anderen vorgeschlagen) oder das Impersonation-Modul, das ich geschrieben habe eine Weile zurück, um dies speziell anzusprechen.

2
Jaykul

Diese Frage befasst sich mit einem sehr verwandten Problem, das mithilfe von Netzwerkfreigaben in Powershell helfen kann.

0
eddiegroves

Hier ist ein Beitrag, wo jemand es zur Arbeit gebracht hat. Es sieht so aus, als ob es eine Registrierungsänderung erfordert.

0
notandy

Hier ist mein Skript, das als LocalSystem auf einem Computer ausgeführt wird, jedoch Anmeldeinformationen eines domaim-Benutzers benötigt, um auf den Speicherort einer Netzwerkdatei zuzugreifen. Sie können das Kennwort des Benutzers in einer verschlüsselten "Safe-ish" -Datei speichern. das kann nur von dem Benutzer gelesen werden, der es geschrieben hat.

Das Einstellen und Ändern des Passworts erfolgt durch Kopieren einer Datei mit dem Klartextpasswort auf den Computer. Wenn das Skript das nächste Mal ausgeführt wird, liest es das Kennwort, verschlüsselt es und löscht dann das Klartext-Kennwort.

$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:\"

Als zusätzliche Verfeinerung: Der Benutzername kann auch verschlüsselt und nicht hartcodiert werden.

0
Jason A

Das wieder von den Toten holen. Ich bin um ein ähnliches Problem mit den Anmeldeinformationen herumgekommen, indem ich die .ps1-Datei in eine Batchdatei packte und die Win7-Funktion, Shift + r.Click RunAs ausführte. Wenn Sie möchten, können Sie PsExec auch so verwenden:

psexec.exe /accepteula /h /u user /p pwd cmd /c "echo. | powershell.exe -File script.ps1"
0
Phlebass