web-dev-qa-db-fra.com

copy-item avec des informations d'identification alternatives

J'utilise le CTP de powershell v2. J'ai un script écrit qui doit aller à divers partages réseau dans notre dmz et copier des fichiers. Cependant, le problème que j'ai est qu'il est évident que les applets de commande de powershell telles que copy-item, test-path, etc. ne prennent pas en charge d'autres informations d'identification ...

Quelqu'un a une suggestion sur la meilleure façon d'accomplir ma tâche ..?

35
xspydr

Je l’ai rencontré récemment et, dans les versions les plus récentes de Powershell, il existe un nouveau module BitsTransfer Module , qui autorise les transferts de fichiers à l’aide de BITS et prend en charge l’utilisation du paramètre -Credential.

L'exemple suivant montre comment utiliser le module BitsTransfer pour copier un fichier d'un partage réseau sur une machine locale, à l'aide d'un objet PSCredential spécifié.

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

Une autre façon de gérer cela consiste à utiliser la commande standard "Net Use". Toutefois, cette commande ne prend pas en charge le mot de passe "securestring". Par conséquent, après avoir obtenu l'objet d'informations d'identification, vous devez obtenir une version déchiffrée du mot de passe à transmettre à la commande "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\
39
chills42

Etant donné que PowerShell ne prend pas en charge l’utilisation "-Critential" via la plupart des applets de commande ( very ennoying), et la cartographie d’un lecteur réseau via WMI s’est avérée très peu fiable dans PS, j’ai trouvé la mise en cache des informations d’utilisateur via un La commande Net Use fonctionne assez bien:

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

Toute opération utilisant \\ serveur\C $ dans le chemin d'accès semble fonctionner à l'aide des applets de commande * -item.

Vous pouvez également supprimer le partage lorsque vous avez terminé:

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

PowerShell 3.0 prend désormais en charge les informations d'identification sur le fournisseur FileSystem. Pour utiliser d'autres informations d'identification, utilisez simplement le paramètre Credential de la cmdlet New-PSDrive.

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

Après cette commande, vous pouvez maintenant accéder au lecteur nouvellement créé et effectuer d'autres opérations, notamment copier ou déplacer des fichiers comme un lecteur normal. voici la solution complète:

$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

C'est une vieille question, mais je ne fais que la mettre à jour pour les futurs chercheurs.

PowerShell v3 prend désormais en charge l’utilisation du paramètre -Credential pour les opérations de système de fichiers.

J'espère que cela aidera les autres à rechercher la même solution.

8
x0n

Je voudrais essayer de mapper un lecteur sur le système distant (en utilisant «Net Use» ou WshNetwork.MapNetworkDrive, les deux méthodes prennent en charge les informations d'identification), puis utiliser copy-item.

6
Shay Levy

Je sais que PowerShell 3 prend immédiatement en charge cette option maintenant, mais pour mémoire, si vous êtes bloqué sur PowerShell 2, vous devez utiliser soit la commande héritée Net Use (comme suggéré par plusieurs autres), ou le module d'emprunt d'identité que j'ai écrit quelque temps en arrière spécifiquement pour résoudre ce problème.

2
Jaykul

Cette question répond à un problème très lié qui pourrait aider utiliser des partages réseau dans powershell .

0
eddiegroves

Ici est un poste où quelqu'un l'a fait fonctionner. Il semble que cela nécessite un changement de registre.

0
notandy

Voici mon script qui s'exécute en tant que LocalSystem sur une machine, mais nécessite les informations d'identification d'un utilisateur domaim pour accéder à un emplacement de fichier réseau. Il vous permet de stocker le mot de passe de l'utilisateur dans un fichier crypté "safe-ish"; cela ne peut être lu que par l'utilisateur qui l'a écrit.

La définition et la modification du mot de passe se font en copiant un fichier contenant le mot de passe en texte clair sur la machine. Lors de la prochaine exécution du script, il lit le mot de passe, le chiffre, puis supprime le mot de passe en texte brut.

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

Comme raffinement supplémentaire: le nom d'utilisateur pourrait également être crypté, plutôt que codé en dur.

0
Jason A

Ramener ceci d'entre les morts à nouveau. J'ai contourné un problème similaire d'identification en encapsulant le fichier .ps1 dans un fichier de commandes et en effectuant Win7, Shift + r.Click RunAs. Si vous le souhaitez, vous pouvez également utiliser PsExec comme suit:

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