2014-02-12 4 views
6

Wir versuchen, ein Benutzerkennwort in der Registrierung als sichere Zeichenfolge zu speichern, aber wir scheinen keine Möglichkeit zu finden, es wieder in Nur-Text umzuwandeln. Ist das mit SecureString möglich?Powershell SecureString Verschlüsseln/Entschlüsseln im Nur-Text-Format funktioniert nicht

Hier ist die einfache Testskript wir versuchen, zu verwenden ...

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 

Dies ist der Fehler, den wir sind ...

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

versuchen, ohne die $ BTSR Linie mit dem Rücken tick Einwickeln –

+0

mir einen Syntaxfehler geben ... „Unexpected Token“ – devfunkd

+0

Ok, versuchen Sie, den Klartext tatsächlich in eine eigene String-Variable zu setzen, wie in dem Artikel, von dem ich glaube, dass Sie ihn angesehen haben - http://social.technet.microsoft.com/wiki/contents/articles/4546.working-with-passwords -secure-strings-and-credentials-in-windows-powershell.aspx –

Antwort

13

bekommen, was mit dem Graviszeichen im $BSTR = ... ist Linie? Ich stimme Graham oben zu. Wenn ich die Graviszeichen entfernen arbeiten, um es ganz gut:

$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 

Ausgänge:

Password is: @SomethingStupid 

Sie sind nicht zu laufen diese auf so etwas wie Windows-RT oder eine andere Powershell-Konfiguration versuchen, wo die Sprache beschränkt ist - bist du?

11

Hier ist ein kludgy aber viel einfacher Weg, um eine sichere Zeichenfolge zu entschlüsseln, unter Ausnutzung der Tatsache, dass die PSCredential class einen Konstruktor hat, der das Kennwort als sichere Zeichenfolge und ein Verfahren akzeptiert (GetNetworkCredential), die das Passwort zurück im Klartext:

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

Obwohl es für die Verwendung mit Anmeldeinformationen bestimmt ist, gibt es nichts, was Sie von der Verwendung dieses jede sichere Zeichenfolge * unabhängig von Zweck zu entschlüsseln, verhindert, ein Dummy-Argument für die Benutzername (die Benutzername Argument an kann‘ t sein null oder eine leere Zeichenfolge, aber ich Aningless String wird tun).


* Unter dem Kontext des Kontos, das die sichere Zeichenfolge beginnen verschlüsselte, natürlich

+1

Perfekt. Dadurch konnte ich ein zuvor in einer Datei gespeichertes ConvertTo-SecureString-Passwort abrufen, um es dann an Invoke-SqlCmd weiterzuleiten. – CloseISQ

+0

Was ist "kludgy" dazu? Ich kann einen PSicherungsstring in einem Datenbankfeld speichern, abrufen, in ein PSCredential-Objekt einfügen und diese Methode zum Entschlüsseln verwenden. Genial! – Baodad

+1

Es ist nicht nur Account-spezifisch, sondern auch Maschine, es sei denn, Sie haben die '-Key' oder' -SecureKey' Optionen in 'ConvertFrom-SecureString' verwendet, um sie zu verschieben. Ich liebe das, weil es ein One-Liner ist. –

Verwandte Themen