2015-02-05 14 views
29

Tôi đang làm việc trong vỏ điện và tôi có mã có thể chuyển đổi thành công một người dùng nhập mật khẩu vào văn bản đơn giản:Chuyển đổi một chuỗi an toàn để plain text

$SecurePassword = Read-Host -AsSecureString "Enter password" | convertfrom-securestring | out-file C:\Users\tmarsh\Documents\securePassword.txt 

Tôi đã thử nhiều cách để chuyển đổi nó trở lại , nhưng không ai trong số họ có vẻ hoạt động tốt. Gần đây nhất, tôi đã thử với những điều sau:

$PlainPassword = Get-Content C:\Users\tmarsh\Documents\securePassword.txt 

#convert the SecureString object to plain text using PtrToString and SecureStringToBSTR 
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassword) 
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) 
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR) #this is an important step to keep things secure 

Điều này cũng cho tôi lỗi.

Cannot convert argument "s", with value: "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e43000000000200000000000366000 
0c0000000100000008118fdea02bfb57d0dda41f9748a05f10000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8 
bc271400000038c731cb8c47219399e4265515e9569438d8e8ed", for "SecureStringToBSTR" to type "System.Security.SecureString": "Cannot convert the "01000000 
d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e430000000002000000000003660000c0000000100000008118fdea02bfb57d0dda41f9748a05f10 
000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8bc271400000038c731cb8c47219399e4265515e9569438d8e8 
ed" value of type "System.String" to type "System.Security.SecureString"." 
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:14 char:1 
+ $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PlainPassw ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument 

Cannot find an overload for "PtrToStringAuto" and the argument count: "1". 
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:15 char:1 
+ $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 

Cannot convert argument "s", with value: "", for "ZeroFreeBSTR" to type "System.IntPtr": "Cannot convert null to type "System.IntPtr"." 
At C:\Users\tmarsh\Documents\Scripts\Local Admin Script\PlainTextConverter1.ps1:16 char:1 
+ [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($BSTR) #this is an important ste ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument 

Password is: 01000000d08c9ddf0115d1118c7a00c04fc297eb0100000026a5b6067d53fd43801a9ef3f8ef9e430000000002000000000003660000c0000000100000008118fdea02bfb57d0dda41f97 
48a05f10000000004800000a000000010000000c50f5093f3b87fbf9ee57cbd17267e0a10000000833d1d712cef01497872a3457bc8bc271400000038c731cb8c47219399e4265515e9569 
438d8e8ed 

Có ai biết cách làm việc này không?

Cảm ơn bạn!

Trả lời

51

Bạn đang đóng, nhưng thông số bạn chuyển đến SecureStringToBSTR phải là SecureString. Dường như bạn đang chuyển kết quả của ConvertFrom-SecureString, một chuỗi chuẩn được mã hóa. Vì vậy, hãy gọi ConvertTo-SecureString về điều này trước khi chuyển đến SecureStringToBSTR.

$SecurePassword = ConvertTo-SecureString $PlainPassword 
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword) 
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) 
+0

tôi đã thực hiện những thay đổi và nó hoạt động ngay bây giờ. Cảm ơn bạn đã giải thích và giúp đỡ! – tmarsh

+1

Tôi rất vui vì nó hoạt động. Hãy cẩn thận với chuỗi của bạn, bây giờ, nó là một biến chuỗi không an toàn có chứa một cái gì đó quan trọng như một mật khẩu - nó không còn an toàn trong bộ nhớ quá trình của bạn, vv – MatthewG

+0

Điều này thật tuyệt vời. Cảm ơn bạn. –

23

Bạn cũng có thể sử dụng PSCredential.GetNetworkCredential():

$SecurePassword = Get-Content C:\Users\tmarsh\Documents\securePassword.txt | ConvertTo-SecureString 
$UnsecurePassword = (New-Object PSCredential "user",$SecurePassword).GetNetworkCredential().Password 
+0

Tôi đã thử nghiệm cả hai phương pháp và cả hai đều đúng. – TheIncorrigible1

Các vấn đề liên quan