2015-02-05 10 views
29

ich in Power-Shell arbeiten, und ich Code, der erfolgreich ein Benutzerkennwort in Klartext eingegeben konvertiert:Konvertieren eine sichere Zeichenfolge in einfachen Text

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

ich mehr Möglichkeiten ausprobiert habe es zurück zu konvertieren , aber keiner von ihnen scheint richtig zu funktionieren. Zuletzt habe ich folgendes versucht:

$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 

Das gibt mir auch einen Fehler.

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 

Kennt jemand eine Möglichkeit, die dafür funktioniert?

Vielen Dank!

Antwort

51

Sie sind in der Nähe, aber der Parameter, den Sie an SecureStringToBSTR übergeben, muss ein SecureString sein. Sie scheinen das Ergebnis von ConvertFrom-SecureString, einer verschlüsselten Standardzeichenfolge, zu übergeben. So rufen Sie ConvertTo-SecureString auf diesem vor dem Übergang auf SecureStringToBSTR.

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

ich die Änderungen vorgenommen und es funktioniert jetzt. Danke für die Erklärung und die Hilfe! – tmarsh

+1

Ich bin froh, dass es funktioniert. Seien Sie vorsichtig mit Ihrer Zeichenkette, jetzt ist es eine ungesicherte Zeichenkettenvariable, die vermutlich etwas wichtiges wie ein Passwort enthält - es ist nicht mehr sicher in Ihrem Prozessspeicher usw. – MatthewG

+0

Das ist genial. Vielen Dank. –

23

Sie können auch PSCredential.GetNetworkCredential() verwenden:

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

Ich habe beide Methoden getestet und beide sind immer noch korrekt. – TheIncorrigible1