自定义PowerShell服务在Win10 1809无法启动求助
解决方案
问题原因
winhttpcertcfg.exe是一次性执行的控制台工具,并非符合Windows服务规范的程序(未实现服务控制管理器的接口)。Win10 1809及后续版本的服务控制器对非服务程序的启动校验更严格,会因程序执行后退出或未响应服务控制请求,触发Event ID 7000/7009的超时错误。
方案一:改用计划任务(推荐)
由于你的需求是系统启动时执行一次证书权限配置,计划任务比服务更适配这种一次性场景,执行完成后自动结束,不会触发超时问题:
$taskParams = @{ TaskName = "CertFixTask" Action = New-ScheduledTaskAction -Execute "c:\winhttpcertcfg.exe" -Argument "-g -c LOCAL_MACHINE\MY -s HOSTNAME -a USER" Trigger = New-ScheduledTaskTrigger -AtStartup Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest } Register-ScheduledTask @taskParams -Force
方案二:封装为服务运行(若必须保留服务形式)
通过PowerShell脚本封装命令,让脚本保持运行以满足服务控制器的存活要求:
- 创建脚本文件
c:\CertFixService.ps1:
# 执行证书权限配置 & c:\winhttpcertcfg.exe -g -c LOCAL_MACHINE\MY -s HOSTNAME -a USER # 保持进程存活,避免服务控制器判定启动失败 while ($true) { Start-Sleep -Seconds 30 # 可选:定期校验权限,防止被意外修改 # & c:\winhttpcertcfg.exe -c LOCAL_MACHINE\MY -s HOSTNAME -a USER }
- 创建服务:
$params = @{ Name = "CertFix" BinaryPathName = "powershell.exe -ExecutionPolicy Bypass -NoProfile -File c:\CertFixService.ps1" DependsOn = "NetLogon" DisplayName = "certfix" StartupType = "Automatic" Description = "Service to give USER permission on the machine certificate" User = "NT AUTHORITY\SYSTEM" } New-Service @params
注意:确保PowerShell执行策略允许运行脚本,若有必要可先执行
Set-ExecutionPolicy RemoteSigned(管理员权限)。
内容的提问来源于stack exchange,提问作者Néstor Veiga López
相关产品推荐
相关产品推荐

