powershell - remove - copy-item con credenciales alternativas
powershell create folder (12)
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 ...
¿Alguien tiene una sugerencia sobre la mejor manera de llevar a cabo mi tarea ...?
que evidentemente los cmdlets de powershell como copy-item, test-path, etc. no admiten credenciales alternativas ...
Parece que lo hacen aquí, copy-item ciertamente incluye un parámetro -Credential.
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>] [...]
Aquí está mi script que se ejecuta como LocalSystem en una máquina, pero necesita credenciales de un usuario de domaim para acceder a una ubicación de archivo 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 un archivo con la contraseña de texto claro en la máquina. 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 refinamiento adicional: El nombre de usuario también podría ser encriptado, en lugar de codificado.
Dado que PowerShell no admite el uso de "-Credential" a través de muchos de los cmdlets ( muy molesto), y la asignación de una unidad de red a través de WMI demostró ser poco confiable en PS, encontré precaching de las credenciales de usuario a través de un comando net use para funciona bastante bien:
# cache credentials for our network path
net use //server/C$ $password /USER:$username
Cualquier operación que use // servidor / C $ en la ruta parece funcionar con los cmdlets * -item.
También puede eliminar el recurso compartido cuando haya terminado:
net use //server/C$ /delete
Debería poder pasar las credenciales que desee al parámetro -Credential. Entonces algo así como:
$ cred = Obtener Credencial
[Ingrese las credenciales]
Copiar-Ítem -Path $ desde -Destinación $ a -Credential $ credito
Esta es una vieja pregunta, pero solo la estoy actualizando para futuros buscadores.
PowerShell v3 ahora admite el uso del parámetro -Credential para las operaciones del sistema de archivos.
Espero que esto ayude a otros a buscar la misma solución.
Intentaría asignar un disco al sistema remoto (usando ''net use'' o WshNetwork.MapNetworkDrive, ambos métodos soportan credenciales) y luego usar copy-item.
Me he encontrado con esto recientemente, y en las versiones más recientes de Powershell hay un nuevo Módulo BitsTransfer , que permite transferencias de archivos usando BITS , y admite el uso del parámetro -Credential.
El siguiente ejemplo muestra cómo usar el módulo BitsTransfer para copiar un archivo de un recurso compartido de red a un equipo 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/
PowerShell 3.0 ahora admite credenciales en el proveedor de FileSystem. Para usar credenciales alternativas, simplemente use el parámetro Credencial 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 puede acceder a la unidad recién creada y realizar otras operaciones, como copiar o mover archivos como la unidad normal. aquí está 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"
Sé que PowerShell 3 ahora es compatible con esto , pero para el registro, si está atrapado en PowerShell 2, básicamente debe usar el comando de net use
heredado (como lo sugirieron varios otros), o el módulo Suplantación que escribí un tiempo específicamente para abordar esto.
Traer esto de entre los muertos de nuevo. 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 lo desea, también puede usar PsExec de esta manera:
psexec.exe /accepteula /h /u user /p pwd cmd /c "echo. | powershell.exe -File script.ps1"
Here hay una publicación donde alguien consiguió que funcione. Parece que requiere un cambio de registro.