PowerShell脚本执行后PsExec窗口自动关闭,-NoNewWindow无效怎么解决?
解决PsExec执行后窗口自动关闭的问题
核心问题分析
- 原脚本中
$password是SecureString类型,直接传给PsExec的-p参数会导致解析错误,因为PsExec需要明文密码。 - PsExec执行完指定命令后会自动退出窗口,需要让它启动一个保持打开的CMD会话。
- 使用
-Verb runAs请求权限提升时,Windows会强制创建新窗口,-NoNewWindow参数会被忽略,无法生效。
解决方案代码
$computer = Read-Host "Computer" $login = Read-Host "Login" $securePassword = Read-Host "Password" -AsSecureString # 将SecureString转换为明文密码,适配PsExec的参数要求 $password = [System.Net.NetworkCredential]::new("", $securePassword).Password $group = Read-Host "Group" # 通过cmd /k让PsExec执行完命令后保持窗口打开,注意引号转义 Start-Process psexec -Verb runAs -ArgumentList "-i \\$computer -u $computer\$login -p `"$password`" -s cmd /k `"net localgroup `"`"$group`"`"`""
关键说明
- 密码转换:利用
System.Net.NetworkCredential将安全字符串转为明文,解决PsExec无法识别密码的问题。 - 保持窗口打开:通过
cmd /k命令让CMD窗口在执行完net localgroup后不自动退出,方便查看输出结果。 - 引号转义:嵌套多层命令时,用
`"转义双引号,避免参数解析混乱。
关于-NoNewWindow无效的补充
如果不需要管理员权限(可去掉-Verb runAs),-NoNewWindow可以生效,此时可以直接在当前PowerShell窗口执行命令并通过pause阻止窗口关闭:
$computer = Read-Host "Computer" $login = Read-Host "Login" $securePassword = Read-Host "Password" -AsSecureString $password = [System.Net.NetworkCredential]::new("", $securePassword).Password $group = Read-Host "Group" & psexec -NoNewWindow -i \\$computer -u $computer\$login -p $password -s net localgroup "$group" pause
注意:这种方式无法获取系统权限(-s参数可能失效),仅适用于普通权限场景。
内容的提问来源于stack exchange,提问作者jbans
相关产品推荐
相关产品推荐

