2011-09-19 105 views
19

我想解密從System.Security.SecureString到可讀密碼的密碼。PowerShell - 解碼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 
+0

一旦你擁有了'PSCredentials'對象,你就可以: '''$ credentials.GetNetworkCredential()。Password''' – CubanX

回答

20

在這裏你去:

$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 

2P @ ssw0rd

+0

感謝你的回答!這幫助我很多!但爲什麼不可以使用與$ credentials.password相同的代碼? – LaPhi

+0

@manojlds感謝您的編輯。 –

+0

但爲什麼代碼nocht爲$ credentials.password工作?有不同的SecureStrings嗎?或者是另一個加密的關鍵? – LaPhi

3
($credentials.GetNetworkCredential()).Password 
10

對於 「System.Net.NetworkCredential」 對象,所有你需要做的是閱讀的字符串密碼。

$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對象,從以獲得更多信息,證書使用交互式命令

$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。

+0

這也適用於PS 3.0 – helb