2009-03-04 13 views
32

Sto utilizzando il CTP di PowerShell v2. Ho scritto una sceneggiatura che deve uscire su varie condivisioni di rete nel nostro dmz e copiare alcuni file. Tuttavia, il problema che ho è che evidentemente i cmdlet di PowerShell come copia-elemento, percorso di test, ecc non supportano credenziali alternative ...copy-item Con credenziali alternative

Qualcuno ha un suggerimento su come meglio svolgere il mio compito ..?

+0

Ecco una domanda simile. http://stackoverflow.com/questions/10313/can-i-copy-files-to-a-network-place-from-a-script-or-the-command-line – notandy

risposta

-2

che evidentemente cmdlet di PowerShell quali copia-item, test-percorso, ecc non supportano credenziali alternative ...

Sembra che fanno qui, copia-voce include certamente un -Credential parametro.

 
PS C:\> gcm -syn copy-item 
Copy-Item [-Path] <String[]> [[-Destination] <String>] [-Container] [-Force] [-Filter <String>] [-I 
nclude <String[]>] [-Exclude <String[]>] [-Recurse] [-PassThru] [-Credential <PSCredential>] [...] 
+0

Continuo a ricevere un messaggio di errore che dichiara - credenziali non supportate – Jason

+2

TechNet (http://technet.microsoft.com/en-us/library/dd315340.aspx) dice "Questo parametro non è supportato da alcun provider installato con Windows PowerShell." Quindi sono troppo pigri per implementarlo e si aspettano che chiunque crei un nuovo provider per farlo. :( –

+1

Per spedire è scegliere;) La buona notizia è che finalmente hanno scelto di implementarlo in PS3 – Jaykul

-6

Si dovrebbe essere in grado di passare qualsiasi credenziale che si desidera al parametro -Credential. Quindi, qualcosa di simile a:

$ cred = Get-Credential

[Invio] le credenziali

Copy-Item -Path $ da -Destination $ a -Credential $ cred

+0

Continuo a ricevere un messaggio di errore che afferma -credential non è supportato – Jason

+0

Ho il sospetto che si tratti di un problema con pathing unc quindi. – EBGreen

+0

bene, questo è l'errore ... Test-Path: impossibile recuperare i parametri dinamici per il cmdlet. Il provider non supporta l'uso delle credenziali. Si prega di ripetere l'operazione senza specificare le credenziali. – Jason

0

Here è un post dove qualcuno l'ha fatto funzionare. Sembra che richieda una modifica del registro.

+0

Quel tizio fa doppio salto nello stesso dominio. Devo essere in grado di specificare un account mentre sto accedendo a file su un dominio diverso del tutto ... – Jason

5

Vorrei provare a mappare un'unità al sistema remoto (utilizzando 'net use' o WshNetwork.MapNetworkDrive, entrambi i metodi supportano le credenziali) e quindi utilizzare copia-elemento.

+0

Questa è la migliore risposta perché il provider del filesystem (e quindi copia-articolo) non supporta le credenziali. – halr9000

22

Dato PowerShell non supporta l'utilizzo "-Credential" via molti dei cmdlet (molto fastidioso), e di un'unità di rete tramite WMI dimostrato di essere molto affidabile in PS, ho trovato pre-caching le credenziali dell'utente tramite un comando net use per funzionare abbastanza bene:

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

Qualsiasi operazione che utilizza \\ server \ C $ nel percorso sembra funzionare utilizzando i cmdlet * -Item.

È possibile anche eliminare la condivisione quando hai finito:

net use \\server\C$ /delete 
+1

Questa sembra essere l'unica opzione per i percorsi di stile '\\ server \ C $'. – jpmc26

+0

Anche se sembra funzionare, ogni volta chiamo 'Copia-Oggetto' dal percorso di rete che mi richiede username e password, il che è abbastanza fastidioso. –

+0

@JimAho Non richiede nome utente e password per me. – digz6666

38

Ho incontrato questo di recente, e nelle più recenti versioni di PowerShell c'è una nuova BitsTransfer Module, che consente il trasferimento di file utilizzando BITS, e supporta l'uso del parametro -Credential.

Il seguente esempio mostra come utilizzare il modulo BitsTransfer per copiare un file da una condivisione di rete su un computer locale, utilizzando un oggetto PSCredential specificato.

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

Un altro modo per gestire questo è l'utilizzo del comando standard "net use". Questo comando, tuttavia, non supporta una password "securestring", quindi dopo aver ottenuto l'oggetto credenziale, è necessario ottenere una versione decrittografata della password per passare al comando "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\ 
+0

Appena interveno, ma ho provato il pezzo BITS, e ha funzionato come un fascino. – OFConsulting

+0

Devo eseguire il comando 'Complete-BitsTransfer' per attendere che finisca, o è sincrono di default? – jpmc26

+2

Inoltre, si noti che questo non funziona con posizioni come \\ \\ server \ C $ '. Vedi http://serverfault.com/q/512558/172060. – jpmc26

8

Questa è una vecchia domanda ma la sto solo aggiornando per cercatori futuri.

PowerShell v3 ora supporta l'utilizzo del parametro -Credential per le operazioni del filesystem.

Spero che questo aiuti gli altri alla ricerca della stessa soluzione.

+9

Sembra che il parametro '-credential' sia supportato solo per New-PsDrive per il provider del file system. Con 'copia-articolo' su v3 stil non funziona. –

+0

Giusto, questo è perché copia-elemento funziona contro PSDrives. È necessario rimontare l'unità con credenziali diverse o creare un nuovo PSDrive sulla stessa risorsa remota, ma questo a volte può non riuscire a causa di vincoli O/S sottostanti (vale a dire, utilizzando credenziali di rete diverse per la stessa risorsa remota nella stessa sessione). – x0n

0

Riportare questo da morto. Ho risolto un problema di credenziali simile avvolgendo il file .ps1 in un file batch e facendo il Win7, Shift + r.Click RunAs. Se si voleva, è anche possibile utilizzare PsExec così:

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

PowerShell 3.0 ora supporta le credenziali sul fornitore FileSystem. Per utilizzare credenziali alternative, è sufficiente utilizzare il parametro Credential nel cmdlet New-PSDrive

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

Dopo questo comando è ora possibile accedere all'unità appena creata e fare altre operazioni tra cui copiare o spostare file come unità normale. ecco la soluzione completa:

$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" 
+0

Funziona perfettamente per me! Grazie per aver condiviso! – Fals

0

Ecco il mio script che viene eseguito come LocalSystem su una macchina, ma ha bisogno di credenziali di un utente domaim per accedere a un percorso di file di rete. Permette di memorizzare la password dell'utente in un file crittografato "sicuro"; che può essere letto solo dall'utente che lo ha scritto.

L'impostazione e la modifica della password vengono eseguite copiando un file con la password in chiaro nella macchina. Quando lo script viene eseguito di nuovo, legge la password, la crittografa, quindi elimina la password in chiaro.

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

Come raffinatezza in più: il nome utente potrebbe anche essere crittografati così, piuttosto che hardcoded.