2016-04-17 10 views
1

Ich versuche, Passwort aus Sicherungsstring im Batch zu extrahieren.Passwort aus Sicherungsstring im Stapel extrahieren

Dies ist in PS:

Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\Temp\Password.txt" 
$pass = Get-Content "C:\Temp\Password.txt" | ConvertTo-SecureString 
$stringValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass)); 

Es funktioniert wie erwartet.

ich den obigen Code in Batch-Konvertierung am:

powershell -Command "& {Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\Temp\Password.txt"}" 
powershell -command "& {$pass = Get-Content "C:\Temp\Password.txt" | ConvertTo-SecureString;^
$stringValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))}" 
FOR /F "usebackq delims=" %v IN (`stringValue`) DO set "d=%v" 
echo %d% 

Ich bin nicht sicher, ob das, was falsch ist, bekomme ich nur "powershell.exe -encodedCommand $ encodedCommand" auf echo% d% , nicht das Klartext Passwort.

+1

Powershell-Variablen auf magische Weise nicht werden Batch-Variablen. Sie müssen den PowerShell-Code in den Backticks ausführen und das entschlüsselte Kennwort dort ausgeben. –

+0

Ich habe es versucht. Ich bekomme das gleiche Ergebnis. – Prasu

+0

Warum überhaupt eine Batch-Datei verwenden? Verwenden Sie einfach PowerShell und Sie können die meisten schmerzhaften Verrenkungen vermeiden. –

Antwort

0

Sie müssen $stringValue aussprechen, bevor Sie es in cmd verwenden können. Sie können die Zuordnung zu $stringValue durch ein Echo des Konvertierungsergebnisses ersetzen und dieses in Ihre for "Schleife" einbetten.

EDIT:

Lassen Sie uns einige Code schreiben.

:: Write the password to File (unchanged) 
powershell -Command "& {Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\Temp\Password.txt"}" 

::Read in the file, echo it out. (changed at the end) 
powershell -command "& {$pass = Get-Content "C:\Temp\Password.txt" | ConvertTo-SecureString; $stringValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass));echo $stringValue}" 

Die letzte Zeile im obigen Code gibt das Passwort im Klartext aus. Jetzt betten Sie gerade diese letzte Zeile in die for-Schleife statt nur aus dem Passwort Echo:

FOR /F "usebackq delims=" %v IN (`powershell -command "& {$pass = Get-Content "C:\Temp\Password.txt" | ConvertTo-SecureString; $stringValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass));echo $stringValue}"`) DO set "d=%v" 

Und jetzt, Echo geben mir das Passwort:

C:\Temp> FOR /F "usebackq delims=" %v IN (`powershell -command "& {$pass = Get-Content "C:\Temp\Password.txt" | ConvertTo-SecureString; $stringValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass));echo $stringValue}"`) DO set "d=%v" 
C:\Temp> set "d=asdf" 
C:\Temp> echo %d% 
asdf 
C:\Temp> 
+0

Ich habe es versucht: set pscmd = powershell -Command "& {$ pass = Get-Inhalt 'C: \ Temp \ Password.txt' | KonvertierenTo-SecureString; $ bstr = [System.Runtime.InteropServices.Marshal]: : SecureStringToBSTR ($ übergeben); $ str = [System.Runtime.InteropServices.Marshal] :: PtrToStringBSTR ($ bstr); [System.Runtime.InteropServices.Marshal] :: ZeroFreeBSTR ($ bstr)} " for/f "usebackq delims =" %% p in ('% pscmd%') setze passwort = %% p echo% passwort% - Ich kann das Passwort immer noch nicht entschlüsseln. Ich bin mir nicht sicher, wie ich das anders wiedergeben könnte. Ich bin ziemlich neu in diesem Skript. Jede Hilfe wird sehr geschätzt. Vielen Dank. – Prasu

+0

Ersetzen Sie den zweiten PowerShell-Befehl und den Rest des Skripts mit 'powershell -command" & {$ pass = Get-Content "C: \ Temp \ Passwort.txt" | ConvertTo-SecureString; $ stringValue = [Runtime.InteropServices.Marshal ] :: PtrToStringAuto ([Laufzeit.InteropServices.Marshal] :: SecureStringToBSTR ($ pass)); echo $ stringValue} "'. Dies sollte das entschlüsselte Passwort wiedergeben. – Clijsters

+0

@Prasu: Ich habe meine Antwort geändert und die Lösung als Codeblock hinzugefügt. Versucht es lokal und es hat wie erwartet funktioniert. Bitte geben Sie ein Feedback dazu. – Clijsters