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

自定义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脚本封装命令,让脚本保持运行以满足服务控制器的存活要求:

  1. 创建脚本文件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
}
  1. 创建服务:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:05:17