服务端程序开机自启实践

最近由于业务的要求,要将装在客户服务器上的服务端程序设置为开机自启动,百度良久基本得到三种方式:

本地最策略

在运行中输入gpedit.msc就进入了本地组策略编辑器

Alt text
通过“在用户登录时运行这些程序”能够设置登录时运行的程序,但是服务器重启后不一定会有用户登录,所以这个方案被pass了。

任务计划

Alt text
打开任务计划程序界面,可以创建任务并设置启动程序的时间,但是我的服务端程序启动时会读取一些配置文件,而用此方法启动的程序读取的目录不是我的程序目录而是c:/windows/system32,而且怎么都无法修改目录(也许是我太low,找不到方法),至于能否开机自启动也就没有测试了,此方法直接pass了。

windows服务

由于普通的程序根本无法在登录前启动,要想在服务器重启后且无人登录的情况下启动程序,就必须将需要启动的程序注册成windows服务,因为只有windows服务才能在登录前启用;按照教程sc create命令老老实实将我的程序注册成windows服务后,还暗自窃喜这么简单,然而在我启动服务后电脑无情的给了我一个提示:
Alt text
在服务启动还在读取进度条的期间我的应用可以访问到服务器,到报错提示后就不能访问了,再结合这个错误提示,我猜测应该是服务启动后我的程序没有给系统一个响应,但是我一个普通应用根本无法响应啊,又是各种搜索之后,又发现了instsrv.exe和srvany.exe这个两个小工具,instsrv.exe的作用是将程序注册成windows服务,srvany.exe的作用是将一个普通的程序封装成一个windows服务,就可以正常启动服务了。具体使用方法,有兴趣的同学可以自行百度,这个教程网上还是很多的。为了以后能偷懒,我将注册windows服务和修改注册表等一系列操作都放入以bat文件中,最后附上我的部分bat文件代码,以供参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@echo off
REM ________________________________________________________________
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
echo 请求管理员权限...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
REM ________________________________________________________________
rem 注册windows服务
call service.bat
rem 修改注册表
call regedit /s xlsysapp.reg
pause>nul

0%