PsExec不能在PowerShell脚本结束时关闭

ecfdbz9o  于 2024-01-08  发布在  Shell
关注(0)|答案(2)|浏览(144)

我写了一个PowerShell脚本来获取本地计算机组中的用户列表。执行时,CMD打开并输入变量值。输入变量后,PsExec在第二个CMD窗口中打开,执行命令后,两个窗口都关闭。

$computer=Read-Host "Computer"
$login=Read-Host "Login"
$password=Read-Host "Password" -AsSecureString
$group=Read-Host "Group"

Start-Process psexec -Verb runAs -ArgumentList "-i \\$computer -u $computer\$login -p $password -s net localgroup ""$group"""

字符串
我需要CMD与PsExec不关闭。这样我就可以看到用户列表。添加“暂停”在代码的末尾不允许你只关闭第一个CMD窗口。
“-NoNewWindow”参数应该阻止第二个窗口打开。和“pouse”一起使用是一个解决方案。但是“-NoNewWindow”不起作用(
还有其他的选择吗?或者如何使“-NoNewWindow”工作?

ztyzrc3y

ztyzrc3y1#

我得到的解决方案。显示用户列表,不关闭窗口。

  • 您需要以管理员权限运行,因为使用的是NoNewWindow而不是Verb Runas
$computer=Read-Host "Computer"
$login=Read-Host "Login"
$password=Read-Host "Password" -AsSecureString
$group=Read-Host "Group"

Start-Process -Wait -NoNewWindow psexec -ArgumentList "\\$computer -u $computer\$login -p $password -s net localgroup ""$group"""
pause

字符串

yqkkidmi

yqkkidmi2#

  • 要使Start-Process调用同步,请添加-Wait
  • -Verb Runas,即请求 elevation(以管理员权限运行)* 总是 * 在新窗口中运行提升的进程-这就是为什么它不能与-NoNewWindow组合。
  • psexec.exe调用中删除-i;当目标是远程机器时使用-i会导致进程在 * 远程 * 机器上的窗口中运行。
  • 为了在执行psexec命令后暂停,以便您可以检查其输出(和潜在的错误消息),请通过cmd.exe * 调用psexec *,这允许您附加pause调用。

因此,请尝试以下操作(使用here-string简化引号):

Start-Process -Wait -Verb RunAs cmd -ArgumentList @"
/c "psexec \\$computer -u $computer\$login -p $password -s net localgroup "$group" & pause"
"@

字符串
一个替代方案是使用提升运行PowerShell脚本 * 本身 *,在这种情况下,您根本不需要Start-Process,您可以 * 直接 * 调用psexec,因为提升进程启动的子进程也会提升。

#requires -RunAsAdministrator

$computer=Read-Host "Computer"
$login=Read-Host "Login"
$password=Read-Host "Password" -AsSecureString
$group=Read-Host "Group"

# Now that you know the script is running with elevation,
# you can invoke psexec directly.
# This is not only syntactically easier, but is synchronous by
# default and allows you to capture output, if needed.
psexec \\$computer -u $computer\$login -p $password -s net localgroup $group

  • 请注意#requires -RunAsAdministratorRequires statement,这使得PowerShell拒绝运行脚本,除非调用进程(PowerShell会话)被提升。
  • 一个更方便的解决方案是让你的脚本 * 自我提升 *,也就是说,让它在需要时通过提升来重新调用自己-参见this answer

相关问题