2016-04-17 3 views
1

securestringからパスワードを一括抽出しようとしています。securestringからのパスワードをバッチで抽出します。

これは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)); 

期待どおりに動作します。

私はバッチで上記のコードを変換しています:

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% 

私が間違っているものを、私は唯一のエコー%D%の "たpowershell.exe -encodedCommand $ encodedCommand" を得ればわかりません、平文のパスワードではありません。

+1

PowerShellの変数は魔法のようになることはありませんバッチ変数。バックチックの内部でPowerShellコードを実行し、そこに復号化されたパスワードをエコーする必要があります。 –

+0

私はそれを試しました。私は同じ結果を得る。 – Prasu

+0

なぜバッチファイルを使用するのですか? PowerShellを使用するだけで、苦しい曲げのほとんどを避けることができます。 –

答えて

0

cmdで使用するには、$stringValueをエコーアウトする必要があります。 $stringValueへの代入を変換結果のエコーで置き換えて、これを "ループ"に埋め込むことができます。

EDIT:

のは、いくつかのコードを書いてみましょう。

:: 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}" 

上記のコードの最後の行は、パスワードをプレーンテキストで示しています。 は今、あなたはちょうどだけでなく、パスワードからエコーのループのためにあなたに、この最後の行を埋め込む:

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> 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

私はこれを試しました:set pscmd = powershell -Command "&{$ pass = Get-Content 'C:\ Temp \ Password.txt' | ConvertTo-SecureString; $ bstr = [System.Runtime.InteropServices.Marshal]: :$ str = [System.Runtime.InteropServices.Marshal] :: PtrToStringBSTR ($ bstr); [System.Runtime.InteropServices.Marshal] :: ZeroFreeBSTR($ bstr)} " for/"%p"(%pscmd%)でパス​​ワードを設定してください。echo%password% - 私はまだパスワードを解読できません。私は別の方法でエコーする方法はわかりません。私はこのスクリプティングには全く新しいものです。どんな助けも大歓迎です。ありがとう。 – Prasu

+0

2番目のPowerShellコマンドと残りのスクリプトを 'powershell -command"&{$ pass = Get-Content "C:\ Temp \ Password.txt" | ConvertTo-SecureString; $ stringValue = [Runtime.InteropServices.Marshal ] :: PtrToStringAuto([Runtime.InteropServices.Marshal] :: SecureStringToBSTR($ pass)); echo $ stringValue} "'。このouldは、復号化されたパスワードをエコーし​​ます。 – Clijsters

+0

@Prasu:答えを変更し、コードブロックとして解決策を追加しました。ローカルで試してみましたが、期待通りに機能しました。これについてのフィードバックをお願いします。 – Clijsters