当我执行以下代码时:
$creds = Get-Credential -UserName other -Message none
# answering the creds dialogue with correct password here
Start-Process C:\Windows\system32\cmd.exe -Credential $creds
打开一个cmd
窗口(看起来完全正常,我可以更改设置……)但我无法在窗口中输入任何内容。无论它是普通用户还是管理员帐户,并且 powershell 本身是以普通用户还是管理员身份运行。除非当 Powershell 以系统身份运行(通过 Sysinternal 的psexec
):然后我收到以下错误:
Start-Process : This command cannot be run due to the error: Access denied
At line:1 char:1
+ Start-Process C:\Windows\system32\cmd.exe -Credential $creds
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Start-Process], InvalidOperationException
+ FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand
我将其与cmd.exe
和结合起来,而powershell
不是整个 cmd-path,并添加了参数-NoNewWindow
,但这些都没有任何区别(尽管有 ,但仍会打开一个新窗口-NoNewWindow
)。当运行“正常”程序时,notepad
一切都按预期工作 - 当我运行例如 时也是如此runas /user:other cmd
。我目前只有 Windows [Version 10.0.17134.165] 可以测试,我不确定其他版本是否也是如此,但我认为这是 Windows 10 特有的(?)。
Powershell 中的另一个令人扫兴的缺陷,还是我遗漏了什么?
答案1
这里肯定发生了一些奇怪的事情:启动新进程后,启动的 PowerShell 窗口和新的命令提示符似乎都停止接受输入。在两个窗口之间切换一段时间后,命令提示符暂时开始接受键盘输入,但在执行命令后又卡住了。
您可以使用 .NET Framework 的Process.Start
直接方法:
$creds = Get-Credential -UserName 'theUser' -Message ' '
[System.Diagnostics.Process]::Start('cmd', $creds.UserName, $creds.Password, '')
生成的命令提示符正常运行,现有的 PowerShell 窗口也是如此。如果您不希望 PowerShell 输出有关新进程的一些信息,请添加| Out-Null
到第二行的末尾。
答案2
这是 PSReadLine 中的一个错误,运行如下:
Remove-Module PSReadLine
在父进程中修复 stdin 重定向并允许您在控制台中输入。