You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PowerShell创建启动Process Explorer的Windows服务时启动失败求助

使用PowerShell创建启动Process Explorer的Windows服务时启动失败求助

我在Windows Server 2016上尝试创建名为AppOneTest的服务,希望它能在services.msc中显示,并且启动时自动运行Process Explorer。我写了下面的PowerShell脚本:

$ServiceName = "ApplicationOneTest"
$ServiceDisplayName = "AppOneTest"
$ServiceDescription = "This launches process explorer"
$ExecutablePath = "C:\processexp\procexp64.exe"
$ScriptPath = "C:\Backup\LaunchScript.ps1"

$LaunchScript = @"
# Script to launch processexp
& '$ExecutablePath'
"@

$LaunchScript | Out-File -FilePath $ScriptPath -Encoding utf8

New-Service -Name $ServiceName -DisplayName $ServiceDisplayName -Description $ServiceDescription -BinaryPathName "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File $ScriptPath" -StartupType Automatic

sc.exe config $ServiceName obj= "domain\username" password= "******" type= interact

Start-Service -Name $ServiceName

但问题来了:服务创建成功后,启动的时候一直卡住,根本无法正常运行。有没有大佬能帮我排查下问题呀?


问题根源分析

你遇到的问题主要有这几个关键点:

  1. Process Explorer是GUI程序:Windows服务默认运行在会话0隔离环境里,普通GUI程序在这个环境下无法直接显示界面,会导致进程挂起。
  2. type= interact的局限性:从Windows Vista开始,会话0隔离机制限制了服务与用户桌面交互,这个配置已经不能让服务直接弹出GUI界面了。
  3. PowerShell脚本的执行方式:直接调用GUI程序而没有处理其运行上下文,会导致进程一直在后台挂起,服务状态无法变为“已启动”。

修复方案

这里给你几个可行的解决思路,你可以根据需求选择:

方案1:让Process Explorer在用户会话中启动

我们可以借助psexec.exe(Sysinternals工具集里的工具)来指定在用户的交互式会话中启动Process Explorer,绕过会话0的限制:

  • 先把psexec.exe放到C:\Windows\System32或者已加入环境变量的路径里
  • 修改你的启动脚本LaunchScript.ps1:
$ExecutablePath = "C:\processexp\procexp64.exe"
# 查找当前登录的用户会话ID(取第一个登录的用户会话)
$sessionId = (query user | Select-Object -Skip 1 | ForEach-Object { $_ -split '\s+' } | Select-Object -Index 2) | Select-Object -First 1
# 使用psexec在用户会话中启动Process Explorer
& psexec.exe -s -i $sessionId $ExecutablePath
  • 重新创建服务,确保服务账户有本地管理员这类足够的权限

方案2:调整脚本逻辑让服务正常完成启动

如果暂时不需要看到Process Explorer的界面,只是想让服务状态正常,可以修改启动脚本,让PowerShell启动程序后直接退出:

  • 把LaunchScript.ps1改成:
$ExecutablePath = "C:\processexp\procexp64.exe"
# 用Start-Process启动程序并立即返回,不等待其退出
Start-Process -FilePath $ExecutablePath -NoNewWindow
exit 0
  • 注意:这种方式下Process Explorer会在会话0后台运行,你看不到界面,但服务会正常显示“已启动”状态。

方案3:检查服务权限与配置细节

另外,再确认几个配置细节:

  • sc.exe config命令里的obj=后面的空格不能丢,你已经做对了,但要确保domain\username这个账户有登录本地服务和交互式登录的权限
  • 检查C:\processexp\procexp64.exe的路径是否正确,服务账户是否有读取和执行这个程序的权限
  • 可以去事件查看器的「Windows日志 -> 系统/应用程序」里找相关错误日志,日志里会有更具体的失败原因

备注:内容来源于stack exchange,提问作者mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:58:08