Powershell 批量从securestring中提取密码

Powershell 批量从securestring中提取密码,powershell,batch-file,Powershell,Batch File,我正在尝试批量从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.Mar

我正在尝试批量从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%

我不确定是不是出了什么问题,我只在echo%d%上得到“powershell.exe-encodedCommand$encodedCommand”,而不是明文密码。

在cmd中使用它之前,您必须先回显
$stringValue
。 您可以用转换结果的回音替换对
$stringValue
的赋值,并将其嵌入for“循环”中

编辑:

让我们编写一些代码

:: 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循环中,而不只是回显密码:

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> 
现在,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"
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> 

PowerShell变量不会神奇地变成批处理变量。您需要在backticks中运行PowerShell代码,并在那里回显解密的密码。我已经尝试过了。我得到了同样的结果。为什么要使用批处理文件呢?只要使用PowerShell,您就可以避免大多数痛苦的扭曲。我尝试了以下方法:set pscmd=PowerShell-Command“&{$pass=Get Content'C:\Temp\Password.txt'| ConvertTo SecureString;$bstr=[System.Runtime.InteropServices.marshall]::SecureStringToBSTR($pass);$str=[System.Runtime.InteropServices.marshall]:$PtrToStringBSTR($bstr);[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)}“for/f”usebackq delims=“%%p in(
%pscmd%
)do set password=%%p echo%password%-我仍然无法解密密码。我不确定如何进行其他方式的回显。我对该脚本非常熟悉。非常感谢您提供的任何帮助。请使用
PowerShell-command“&{$pass=Get Content”C:\Temp\password.txt替换第二个PowerShell命令和脚本的其余部分“| ConvertTo SecureString;$stringValue=[Runtime.InteropServices.Marshall]::PtrToStringAuto([Runtime.InteropServices.Marshall]::SecureStringToBSTR($pass));echo$stringValue}”"
。这将回显解密后的密码。@Prasu:我更改了答案,并将解决方案添加为代码块。在本地尝试,效果与预期一致。请对此给出反馈。在第一行的最后一部分添加括号,否则,代码可能在本地运行,但在其他人运行时可能无法运行。这就是发生的情况到我的PowerShell脚本之一:do(设置密码=%%a)