web-dev-qa-db-fra.com

PowerShell - Décoder System.Security.SecureString en mot de passe lisible

Je veux décoder le mot de passe d'un System.Security.SecureString en un mot de passe lisible.

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")

Cette partie de code fonctionne bien, je peux utiliser l'objet $ credentials. Mais plus tard dans mon code, j'ai besoin du mot de passe dans un format lisible. Parce qu'une méthode a besoin du mot de passe dans une chaîne lisible. Je dois donc décoder le mot de passe.

Comment est-il possible de décoder le mot de passe de l'objet $ credentials?

Mise à jour

Ca ne fonctionne pas:

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($credentials.password)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
$result 
22
LaPhi

Voici:

$password = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($password)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
$result 

P @ ssw0rd

30
Shay Levy

Pour un objet "System.Net.NetworkCredential", il vous suffit de lire le mot de passe de chaîne.

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")
$credentials.Password
TestPassword

$credentials | gm

TypeName: System.Net.NetworkCredential

Name           MemberType Definition
----           ---------- ----------
Equals         Method     bool Equals(System.Object obj)
GetCredential  Method     System.Net.NetworkCredential GetCredential(uri uri, str
GetHashCode    Method     int GetHashCode()
GetType        Method     type GetType()
ToString       Method     string ToString()
Domain         Property   string Domain {get;set;}
Password       Property   string Password {get;set;}
SecurePassword Property   securestring SecurePassword {get;set;}
UserName       Property   string UserName {get;set;}

Si vous vous retrouvez avec un objet PSCredential, à partir d'une commande interactive comme l'utilisation de Get-Credential

$credentials=Get-Credential
$credentials.GetNetworkCredential().UserName
TestUsername
$credentials.GetNetworkCredential().Domain
TestDomain
$credentials.GetNetworkCredential().Password
TestPassword

Voir http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/26/decrypt-powershell-secure-string-password.aspx pour plus de détails.

Remarque: j'ai utilisé PS 4 pour cet exemple.

14
Greg Little
($credentials.GetNetworkCredential()).Password
5
user3234250

Les détails sont expliqués http://blogs.msdn.com/b/besidethepoint/archive/2010/09/21/decrypt-secure-strings-in-powershell.aspx

et j'ai encore une autre façon légèrement différente de le faire.

$pass=convertto-securestring "P@ssw0rd" -asplaintext -force  | ConvertFrom-SecureString
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR( (ConvertTo-SecureString $pass) ))

P @ ssw0rd

4
rob