我正在尝试创建一个powershell脚本,该脚本将输入一个来自Credential Manager的密码到Python脚本的密码输入中。在this older post中,我找到了一些关于如何使用Powershell启动进程然后在STDIN中输入一些文本的信息,但出于某种原因,这种方法对我不起作用。我执行python脚本,它只是在Powershell命令行窗口中等待密码输入。
这是代码,它正确执行Python脚本,要求输入密码,但之后没有任何反应。我可以手动输入密码并单击回车,但这当然不是目的。然后我可以自己执行python脚本。
$executingScriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. $executingScriptDirectory\CredMan.ps1
$launcherScript = Join-Path $executingScriptDirectory "launcher.py"
$credTarget = 'some-target-in-credential-manager'
Write-Host "Loading password from Windows credmgr entry '$credTarget' ..."
[object] $cred = Read-Creds $credTarget
if ($cred -eq $null)
{
Write-Host ("No such credential found: {0}" -f $credTarget)
Exit 2
}
# Found the credential; grab the password and boot up the launcher
[string] $password = $cred.CredentialBlob
Write-Host "Launching $launcherScript ..."
Write-Host "Password: '$password'"
$psi = New-Object System.Diagnostics.ProcessStartInfo;
$psi.Arguments = "$launcherScript "
$psi.FileName = "python.exe";
$psi.UseShellExecute = $false; # start the process from its own executable file
$psi.RedirectStandardInput = $true; # enable the process to read from stdin
$p = [System.Diagnostics.Process]::Start($psi);
Start-Sleep -s 2 # wait 2 seconds so that the process can be up and running
$p.StandardInput.WriteLine($password);
$p.WaitForExit()
问题是什么?使用此行在python脚本中请求密码,因此使用getpass模块。
password = getpass.getpass("Enter your password: ")
感谢您的帮助。
如果您需要更多信息,请直接索取:)。
答案 0 :(得分:1)
我认为Python进程不会从STDIN流中读取密码,而是直接从进程附加到的终端读取密码。此终端流不受您在启动子进程之前安装的任何重定向的影响,因此写入进程的STDIN不会影响这一点。您可以直接使用键盘输入密码进入Python流程并且接受它,这一事实证明我是正确的,我会说。
在你的情况下,你需要调整Python进程以从其他地方读取PW,例如: G。通过传递一个特殊选项(完全取决于你的Python过程)或修补Python源本身。
也许还有特定于Windows的方法来模拟键盘按键,但我称之为非常难看的黑客,因此无法推荐。
答案 1 :(得分:1)
Alfe,谢谢你向我展示了解决这个问题的正确方向。
我已经调整了python脚本,以便它接受命令行上的参数,并且可以在-p选项之后给出密码参数,如下所示:
$ script.py -p "password"
要从powershell脚本执行此操作,我使用此代码首先从Windows Credential Manager中获取凭据,并将其作为参数提供给python脚本。
我使用现有脚本来获取凭据管理器中的凭据,即CredMan.ps1 script。
# Get the path of where this script is being invocated to reference to the script files in the same directory as this script.
$executingScriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
# Include external script to speak with Credential Manager
. $executingScriptDirectory\CredMan.ps1
$launcherScript = Join-Path $executingScriptDirectory "script.py"
$credentialTarget = "name-of-credential-in-manager"
[object] $cred = Read-Creds $credentialTarget
if ($cred -eq $null) {
Write-Host ("No such credential found: {0}" -f $credentialTarget)
Exit 2
}
# Found the credential; Grab the password and execute the script with the password
[string] $password = $cred.CredentialBlob
# Execute python script with password given as parameter
$exe = "python.exe"
&$exe $launcherScript -p $password
感谢您的帮助,我希望您理解给定的答案。