Windows系统怎样控制某个服务延迟启动Automatic(Delayed Start)的时间

2024-04-29 15:57:19 浏览数 (1)

结论先行:Windows系统层面做不到单个服务控制延迟时间(第三方方案可以实现),但可以控制全局服务延迟启动的时间,赋值的时候单位是毫秒,不是秒。

不改的话,默认延迟启动是120秒,考虑到系统启动有个过程且服务启动一般有depend,实际延迟启动的时间是大于120秒的。

看到了DelayedAutoStartAutoStartDelay有关的很多文档,没有一篇是正确的

有的说AutoStartDelay单位是毫秒,比如:

https://community.qlik.com/t5/Official-Support-Articles/Further-delay-Automatic-Delayed-Start-of-Services-to-prevent/ta-p/1717094

有的说AutoStartDelay单位是秒,比如:

https://social.technet.microsoft.com/Forums/en-US/d8f0e315-74d4-4890-a62f-ef427a8532e1/adjusting-the-autostart-delayed-start-time?forum=winservergen

https://knowledge.broadcom.com/external/article/29374/how-to-increase-the-default-delay-of-120.html

https://sevenitblog.com/2019/07/19/increase-a-service-time-automatic-delay-start-when-booting-a-windows-server/

有的说AutoStartDelay对2016/2019/2022不起作用,比如:

https://stackoverflow.com/questions/65861963/how-to-delay-the-start-of-a-specific-service-in-windows-services

结合本人实践,同步结论如下:

1、windows系统默认的延迟启动时间是120秒(考虑到服务启动有depend,实际延迟启动的时间是大于这个的)

Start then auto-delay service, the default delay is120 seconds, but it can be overridden by the creating an AutoStartDelay value in HKLMSYSTEMCurrentControlSetControl

2、延迟启动的全局配置项是HKLMSYSTEMCurrentControlSetControl下的AutoStartDelay单位是毫秒,不是秒),无法在单个服务级别设置延迟时间,也就是说并不存在单个服务级别的AutoStartDelay

像下图这种是错误的

比如设置240秒延迟,需要按240000毫秒赋值,应该这样操作:

AutoStartDelay value in HKLMSYSTEMCurrentControlSetControl

Dword, could be 0 above

代码语言:javascript复制
reg add "HKLMSYSTEMCurrentControlSetControl" /v "AutoStartDelay" /d 240000 /t REG_DWORD /f

3、对单个服务来说,AutoStartDelay生效的前提是DelayedAutoStart为1,如果DelayedAutoStart为0,即便你用sc.exe config servicename start= delayed-auto配置延迟启动也不起作用,因为DelayedAutoStart为0的情况下,重启机器后对应服务会变成start= auto。

DelayedAutoStart value in HKLMSYSTEMCurrentControlSetServices<servicename>

Dword, could be 0 or 1.

以上验证我专门整了非常方便的demo来观测,把下面的压缩包解压放到C盘根目录,然后执行下面的命令,然后重启机器等5分钟左右在C:addservice 目录看test.txt里5秒一次的时间戳,跟系统的启动时间做对比,执行如下powershell命令查看系统启动时间

13代表关机

6006代表系统日志停止记录

12代表开机

6005代表系统日志开始记录

powershell命令行执行如下代码查看系统启动时间:

代码语言:javascript复制
Get-WinEvent -FilterHashtable @{logname='System';id=@(12,13,6005,6006,6008,41,1074);StartTime=(Get-Date).AddDays(-1) } | Where-Object {$_.ProviderName -eq "Microsoft-Windows-Kernel-General" -or $_.ProviderName -eq "User32" -or $_.ProviderName -eq "EventLog" } |Sort-Object -Property TimeCreated

addservice.zip

cmd命令行执行如下代码添加服务:

代码语言:javascript复制
sc.exe create demo binpath= "C:addservicesrvany.exe" start= auto displayname= "demo"
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v "AppEnvironment" /t reg_multi_sz /d "temp=C:Windowstemp;PATH=C:addservice;C:Windows;C:WindowsSystem32;" /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v AppDirectory /t REG_SZ /d "C:addservice" /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v Application /t REG_SZ /d "C:addservicedemo.exe" /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemoParameters" /v AppParameters /t REG_SZ /d "" /f
sc.exe config demo depend= ""
sc.exe description demo "本软件作为服务置于后台时有个功能'每5秒钟打印一次时间戳'。这个Demo的作者特别棒,特意在title上写清了'我是WinForm,也是Windows服务'。demo.exe作为服务,会在demo.exe同目录下产生一个.txt文件,每5秒打印一下时间戳。demo.exe的代码参考:https://www.cnblogs.com/micro-chen/p/5885899.html、https://www.cnblogs.com/ldjbase/p/5405262.html。链接里第三个方案的下载压缩包里的srvany.exe才是ok的,这个srvany.exe是13KB,比8KB的srvany.exe更好一些。"
sc.exe config demo start= delayed-auto

reg add "HKLMSYSTEMCurrentControlSetControl" /v "AutoStartDelay" /d 240000 /t REG_DWORD /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemo" /v "DelayedAutoStart" /d 1 /t REG_DWORD /f
reg add "HKLMSYSTEMCurrentControlSetServicesdemo" /v "AutoStartDelay" /d 60000 /t REG_DWORD /f

如下图,我配置的全局240秒,但给单个服务加的60秒(实际我前面说了,单个服务级别无法添加延迟时间,这里添加就是为了验证是否起作用),实测结果就是单个服务级别添加的延迟时间不起作用。

第三方方案控制单个程序延迟启动:http://www.rjlsoftware.com/software/utility/delayexec/

代码语言:javascript复制
delayexec.exe "C:WindowsSystem32notepad.exe" 3
delayexec.exe "C:WindowsSystem32notepad.exe" 3 -max
delayexec.exe "C:WindowsSystem32notepad.exe" 3 -min

Example: delay.exe "C:Program FilesMicrosoft OfficeOfficeOUTLOOK.EXE" 60 -max

The example above would delay 60 seconds before launching Outlook, maximized.

0 人点赞