PowerShell - Decode System.Security.SecureString для чтения пароля
Я хочу декодировать пароль из System.Security.SecureString на удобочитаемый пароль.
$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")
Эта часть кода работает нормально, я могу использовать объект $credentials.
Но позже в моем коде мне нужен пароль в читаемом формате. Потому что методу нужен пароль в читаемой строке. Поэтому я должен декодировать пароль.
Как можно декодировать пароль из объекта $credentials?
Обновление
Не работает:
$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
Ответы
Ответ 1
Здесь вы идете:
$password = ConvertTo-SecureString '[email protected]' -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
Ответ 2
Для объекта "System.Net.NetworkCredential" все, что вам нужно сделать, это прочитать пароль String.
$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;}
Если вы закончите с объектом PSCredential, из интерактивной команды, такой как Get-Credential, используйте
$credentials=Get-Credential
$credentials.GetNetworkCredential().UserName
TestUsername
$credentials.GetNetworkCredential().Domain
TestDomain
$credentials.GetNetworkCredential().Password
TestPassword
Подробнее см. http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/26/decrypt-powershell-secure-string-password.aspx.
Примечание. Я использовал PS 4 для этого примера.
Ответ 3
Подробности объясняются http://blogs.msdn.com/b/besidethepoint/archive/2010/09/21/decrypt-secure-strings-in-powershell.aspx
и у меня есть еще один немного другой способ сделать это.
$pass=convertto-securestring "[email protected]" -asplaintext -force | ConvertFrom-SecureString
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR( (ConvertTo-SecureString $pass) ))
P @ssw0rd
Ответ 4
($credentials.GetNetworkCredential()).Password