2009-03-04 21 views
32

Estoy usando el CTP de powershell v2. Tengo una secuencia de comandos escrita que debe ir a varios recursos compartidos de red en nuestro dmz y copiar algunos archivos. Sin embargo, el problema que tengo es que, evidentemente, los cmdlets de PowerShell, como copy-item, test-path, etc. no admiten credenciales alternativas ...copy-item Con credenciales alternativas

¿Alguien tiene alguna sugerencia sobre cómo realizar mi tarea ...?

+0

Aquí hay una pregunta similar. http://stackoverflow.com/questions/10313/can-i-copy-files-to-a-network-place-from-a-script-or-the-command-line – notandy

Respuesta

-2

que evidentemente cmdlets de PowerShell como copia-elemento, prueba de ruta, etc no son compatibles con credenciales alternativas ...

Parece que lo hacen aquí, copia-elemento ciertamente incluye una -Credential parámetro.

 
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

Sigo recibiendo un mensaje de error indicando - no se admite la credencial – Jason

+2

TechNet (http://technet.microsoft.com/en-us/library/dd315340.aspx) dice "Este parámetro no es compatible con ningún proveedor instalado con Windows PowerShell". Por lo tanto, son demasiado perezosos para implementarlo y solo esperan que alguien que esté creando un nuevo proveedor lo haga. :( –

+1

Enviar es elegir;) La buena noticia es que finalmente eligieron implementarlo en PS3 – Jaykul

-6

Debería poder pasar las credenciales que desee al parámetro -Credential. Así que algo como:

$ cred = Get-Credential

[Enter] las credenciales

Copy-Item $ -path de -Destino $ a $ -Credential credibilidad

+0

Recibo un mensaje de error indicando que no se admite la credencial – Jason

+0

. Sospecho que es un problema con la ruta del disco entonces. – EBGreen

+0

bien, este es el error ... Ruta de prueba: no se pueden recuperar los parámetros dinámicos para el cmdlet. El proveedor no admite el uso de credenciales. Realice la operación nuevamente sin especificar credenciales. – Jason

0

Here es un puesto donde alguien lo consiguió para trabajar. Parece que requiere un cambio de registro.

+0

Ese tipo tiene doble salto dentro del mismo dominio. Necesito poder especificar una cuenta, ya que estoy accediendo a los archivos en un dominio diferente por completo ... – Jason

5

Intentaré asignar una unidad al sistema remoto (usando 'net use' o WshNetwork.MapNetworkDrive, ambos métodos soportan credenciales) y luego usar copy-item.

+0

Esta es la mejor respuesta porque el proveedor del sistema de archivos (y, por lo tanto, el elemento de copia) no admite credenciales. – halr9000

22

Desde PowerShell no admite "-Credential" el uso a través de muchos de los cmdlets ( muy molestos), y asignar una unidad de red a través de WMI demostrado ser muy fiable en PS, encontré pre-almacenamiento en caché de las credenciales de usuario a través de un comando net use para funcionar bastante bien:

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

Cualquier operación que utiliza \\ servidor \ C $ en el camino parece funcionar usando los cmdlets * -Item.

También puede eliminar el recurso compartido cuando haya terminado:

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

Esta parece ser la única opción para las rutas de estilo '\\ server \ C $'. – jpmc26

+0

Aunque parezca funcionar, cada vez que llamo a 'Copy-Item' desde la ruta de la red, me solicita el nombre de usuario y la contraseña, lo cual es bastante molesto. –

+0

@JimAho No me pide nombre de usuario y contraseña. – digz6666

38

me he encontrado con esto recientemente, y en las versiones más recientes de Powershell hay un nuevo BitsTransfer Module, que permite la transferencia de archivos utilizando BITS, y admite el uso del parámetro -Credential.

El siguiente ejemplo muestra cómo usar el módulo BitsTransfer para copiar un archivo desde un recurso compartido de red a una máquina local, utilizando un objeto PSCredential especificado.

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

Otra forma de manejar esto es usar el comando estándar "net use". Sin embargo, este comando no admite una contraseña de "seguridad", por lo que después de obtener el objeto de credencial, debe obtener una versión descifrada de la contraseña para pasar 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

Solo respondí, pero probé la pieza BITS, y funcionó a las mil maravillas. – OFConsulting

+0

¿Tengo que hacer 'Complete-BitsTransfer' para esperar a que termine, o es síncrono por defecto? – jpmc26

+2

Además, tenga en cuenta que esto no funciona con ubicaciones como '\\ servidor \ C $'. Ver http://serverfault.com/q/512558/172060. – jpmc26

8

Esta es una pregunta anterior pero la estoy actualizando para futuros buscadores.

PowerShell v3 ahora es compatible con el uso del parámetro -Credential para las operaciones del sistema de archivos.

Espero que esto ayude a los demás a buscar la misma solución.

+9

Parece que el parámetro '-credential' solo es compatible con New-PsDrive para el proveedor del sistema de archivos. Con 'copy-item' en v3 stil no funciona. –

+0

Correcto, eso se debe a que copy-item funciona contra PSDrives. Debe volver a montar la unidad con credenciales diferentes o crear una nueva PSDrive para el mismo recurso remoto, pero esto puede fallar a veces debido a limitaciones de O/S subyacentes (es decir, usar diferentes credenciales de red para el mismo recurso remoto en la misma sesión). – x0n

0

Recuperando esto de entre los muertos. Solucioné un problema de credenciales similar envolviendo el .ps1 en un archivo de proceso por lotes y haciendo el Win7, Shift + r.Haga clic en RunAs. Si quería, también se puede utilizar PsExec así:

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

PowerShell 3.0 ahora es compatible con las credenciales del proveedor de sistema de archivos. Para utilizar credenciales alternativas, basta con utilizar el parámetro de credenciales en el cmdlet New-PSDrive

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

Después de este comando ahora se puede acceder a la unidad recién creada y hacer otras operaciones, incluyendo copiar o mover archivos como unidad normal. aquí es la solución 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

¡Funciona perfecto para mí! ¡Gracias por compartir! – Fals

0

Aquí está mi script que se ejecuta como LocalSystem en una máquina, pero necesita credenciales de un usuario domaim acceder a una ubicación de archivos de red. Le permite almacenar la contraseña del usuario en un archivo cifrado "seguro"; eso solo puede ser leído por el usuario que lo escribió.

El ajuste y cambio de la contraseña se realiza copiando en la máquina un archivo con la contraseña de texto plano. Cuando se ejecuta la secuencia de comandos, lee la contraseña, la encripta y luego elimina la contraseña de texto plano.

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

Como un refinamiento adicional: El nombre de usuario también podría estar cifrada, así, en lugar de codificado.