2014-02-12 152 views
6

我們試圖將用戶密碼作爲安全字符串存儲在註冊表中,但似乎無法找到將其轉換回純文本的方式。這可能與SecureString?Powershell SecureString加密/解密爲純文本不起作用

這是我們正在嘗試使用簡單的測試腳本...

Write-Host "Test Start..." 
$PlainPassword = "@SomethingStupid" | ConvertTo-SecureString -AsPlainText -Force 

$BSTR = ` [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassword) 
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) 
Write-Host "Password is: " $PlainPassword 
Read-Host 

這是我們得到的錯誤...

The term ' [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR' 
is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
At C:\test.ps1:4 char:71 
+ $BSTR = ` [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR 
<<<< ($PlainPassword) 
    + CategoryInfo   : ObjectNotFound: (
[System.Runtim...ureStringToBSTR:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

Cannot find an overload for "PtrToStringAuto" and the argument count: "1". 
At C:\test.ps1:5 char:75 
+ $PlainPassword = 
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto <<<< ($BSTR) 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 
+1

嘗試沒有包裹$ BTSR符合反勾 –

+0

給我一個語法錯誤「意外令牌」的背景下... – devfunkd

+0

好吧,嘗試實際上將明文放在它自己的字符串變量中,就像在我認爲您正在查看的文章中一樣 - http://social.technet.microsoft.com/wiki/contents/articles/4546.working-with-passwords -secure-strings-and-credentials-in-windows-powershell.aspx –

回答

13

什麼是在$BSTR = ...反引號線?我同意上面的格雷厄姆。如果刪除了反引號它工作得很好:

$PlainPassword = "@SomethingStupid" | ConvertTo-SecureString -AsPlainText -Force 
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassword) 
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) 
Write-Host "Password is: " $PlainPassword 

輸出:

Password is: @SomethingStupid 

你不是想的東西像Windows RT或其他一些PowerShell的配置,其中語言限制運行此 - 你是?

11

下面就來解密安全字符串一個缺憾,但更簡單的方法,採取的事實PSCredential class具有接受的密碼作爲安全字符串和方法(GetNetworkCredential)構造的優勢,它返回密碼以純文本格式:

(New-Object System.Management.Automation.PSCredential 'N/A', $secure_string).GetNetworkCredential().Password 

雖然它旨在與憑證使用,沒有什麼阻止你使用這個來解密任何安全字符串*不分的宗旨,爲用戶名提供一個僞參數(參數username可以」 t爲null或空字符串,但任何我aningless字符串會做)。


*根據帳戶的加密該安全字符串,首先,當然

+1

完美。它允許我檢索存儲在文件中的以前的ConvertTo-SecureString密碼,然後將它傳遞給Invoke-SqlCmd。 – CloseISQ

+0

這是什麼「kludgy」?我可以將PS安全字符串存儲在數據庫字段中,檢索它,將其放入PSCredential對象中,並使用此方法對其進行解密。真棒! – Baodad

+1

這不僅僅是賬戶特定的,也是機器,除非您使用'ConvertFrom-SecureString'中的'-Key'或'-SecureKey'選項來移動它。 我喜歡這個,因爲它是一行代碼。 –