求助:将程序注册为系统服务

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: tmplinshi, arcticir

abs
Posts: 15
Joined: 06 Jan 2014, 01:28

求助:将程序注册为系统服务

17 Jan 2014, 01:03

因为多人使用的服务器,需要监控IP切换,需要将一个AHK脚本注册为服务。
1. 利用命令行SC 将脚本添加为服务,
sc create SVCNAME binpath= "C:\Program Files\SVCNAME.exe" start= auto displayname= "SVCNAME"
sc description SVCNAME "Provides SVCNAME fuction."
sc start SVCNAME
---
参考了论坛的SERVICE()函数http://ahkscript.org/forum/viewtopic.php?t=34984,在脚本的开头加了这些代码:

Code: Select all

ServiceName := "SVCNAME"

    SCM_HANDLE := DllCall("advapi32\OpenSCManagerA" 
                        , "Int", 0 ;NULL for local 
                        , "Int", 0 
                        , "UInt", 0x1) ;SC_MANAGER_CONNECT (0x0001)    

    SC_HANDLE := DllCall("advapi32\OpenServiceA" 
                            , "UInt", SCM_HANDLE 
                            , "Str", ServiceName 
                            , "UInt", 0x10) ;SERVICE_START (0x0010) 
  
    DllCall("advapi32\StartServiceA" 
                        , "UInt", SC_HANDLE 
                        , "Int", 0 
                        , "Int", 0) 
但是从系统的控制面板->服务->启动不成功。
提示: ---错误1053:服务没有及时响应启动或控制请求。
查了网络,应该是一般应用程序没有通知系统服务,启动已经成功导致被强行关闭引起。
继续添加:
DllCall("Advapi32\SetServiceStatus" , "UInt", SvcStatusHandle , "UInt", &SvcStatus)
这样的函数来修改。但是或许我对这些函数的理解不对,一直不能成功。

求帮助,求指导。

非常感谢!
abs
Posts: 15
Joined: 06 Jan 2014, 01:28

Re: 求助:将程序注册为系统服务

17 Jan 2014, 01:38

备注:从命令行执行
sc start SVCNAME
和从控制面板点击启动的效果是一样的。。服务都被加载,然后大约30秒后被中断。
User avatar
amnesiac
Posts: 186
Joined: 22 Nov 2013, 03:08
Location: Egret Island, China
Contact:

Re: 求助:将程序注册为系统服务

17 Jan 2014, 02:43

我常常感觉API太复杂,以前曾用WMI操作服务,没有遇到这样的问题。
安装假想的服务 Db.exe:

Code: Select all

OWN_PROCESS := 16
NOT_INTERACTIVE := False
NORMAL_ERROR_CONTROL := 2
strComputer := "."
objWMIService := ComObjGet("winmgmts:" . "{impersonationLevel=impersonate}!\\" . strComputer . "\root\cimv2")
objService := objWMIService.Get("Win32_BaseService")
errReturn := objService.Create("DbService" ,"Personnel Database" , "c:\windows\system32\db.exe", OWN_PROCESS, NORMAL_ERROR_CONTROL, "Manual", NOT_INTERACTIVE, "NT AUTHORITY\LocalService", ""  )
MsgBox, % errReturn
linpinger
Posts: 20
Joined: 29 Dec 2013, 22:51
Location: 神州
Contact:

Re: 求助:将程序注册为系统服务

17 Jan 2014, 20:31

微软有两个小程序 Instsrv.exe srvany.exe 可以将任何exe注册为服务程序,应该能符合你的要求
abs
Posts: 15
Joined: 06 Jan 2014, 01:28

Re: 求助:将程序注册为系统服务

20 Jan 2014, 02:22

谢谢楼上2位。
① 后来用微软小程序 Instsrv.exe srvany.exe 注册和运行成功。
另外,linpinger ,好像你有在AHK8贴过SQL的代码,但是现在AHK-L操作SQL的代码似乎都改变了?你知道原因吗?
② 我仍然希望不借助其他程序,通过系统服务来解决。因此 amnesiac 大大的代码我有空的时候会再测试一下。
不管怎么样,我觉得WMI是个和DOM类似的控件,而且功能非常强大。并且这个思路我很喜欢:使用系统公开的服务来进行操作,尽量不要直接操作底层代码。
学习之。
abs
Posts: 15
Joined: 06 Jan 2014, 01:28

Re: 求助:将程序注册为系统服务

26 Jan 2014, 22:47

amnesiac wrote:我常常感觉API太复杂,以前曾用WMI操作服务,没有遇到这样的问题。
安装假想的服务 Db.exe:

Code: Select all

OWN_PROCESS := 16
NOT_INTERACTIVE := False
NORMAL_ERROR_CONTROL := 2
strComputer := "."
objWMIService := ComObjGet("winmgmts:" . "{impersonationLevel=impersonate}!\\" . strComputer . "\root\cimv2")
objService := objWMIService.Get("Win32_BaseService")
errReturn := objService.Create("DbService" ,"Personnel Database" , "c:\windows\system32\db.exe", OWN_PROCESS, NORMAL_ERROR_CONTROL, "Manual", NOT_INTERACTIVE, "NT AUTHORITY\LocalService", ""  )
MsgBox, % errReturn
在xp下测试了,仍然是是启动服务的时候提示1053错误。看来必须发送信息通知系统服务已经启动。。

Return to “请求帮助”

Who is online

Users browsing this forum: No registered users and 15 guests