使用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
但问题来了:服务创建成功后,启动的时候一直卡住,根本无法正常运行。有没有大佬能帮我排查下问题呀?
问题根源分析
你遇到的问题主要有这几个关键点:
- Process Explorer是GUI程序:Windows服务默认运行在会话0隔离环境里,普通GUI程序在这个环境下无法直接显示界面,会导致进程挂起。
type= interact的局限性:从Windows Vista开始,会话0隔离机制限制了服务与用户桌面交互,这个配置已经不能让服务直接弹出GUI界面了。- 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
相关产品推荐
相关产品推荐

