FeiFan 阅读(911) 评论(8)

服务(Service)的概念及常见问题

                作者:非凡

概念:

1.         只在Windows NT以上的版本中才有服务。

2.         用服务管理器(SCM)来管理服务(启动、停止、禁用等)

3.         服务的启动方式:

a)         自动:当操作系统启动后自动启动,在登录前就已经启动

b)        手动:必须手工启动。

4.         服务所用的账号:SYSTEM(系统账号)

 

 

常见问题:

1.         账号问题:在服务中直接调用GetUserName得到的账号是SYSTEM,如果想得到当前登录用户的账号,必须模拟用户。

2.         服务启动的程序问题:在服务中直接调用CreateProcess或者ShellExec启动的进程还是服务,即该进程运行在SYSTEM账号下,如果想启动用户进程,需要使用CreateProcessAsUser

3.         注册表:在服务中访问HKEY_CURRENT_USER注册表键下的值,通过regedit一般看不到,如果想访问当前登录用户的注册表,必须模拟用户,并且还要注意先关闭HKEY_CURRENT_USER键,即RegCloseKey(HKEY_CURRENT_USER)

4.         访问文件:在服务中访问文件最好是给出文件的全路径,因为服务是由系统启动的,所以当前的路径不是exe文件的路径。

5.         UI显示:一般情况下,不在服务中显示UI,而应该由服务启动用户进程来显示UI。如果必须在服务中显示UI,则需要在安装服务时,把服务的属性加上SERVICE_INTERACTIVE_PROCESS

6.         删除服务:用API删除,不用命令行参数。

 


评论列表
周星星
re: 服务(Service)的概念及常见问题
“6. 删除服务:用API删除,不用命令行参数。”
------ 听不明白。
非凡
TO:周星星
98下的服务我也知道,由于98下不存在用户权限和安全性的问题,正像你说的,其实现机制不同,并且MSDN上也没有把98下的服务列在Service之中,所以就没有添加这一部分内容。

另外,“删除服务:用API删除,不用命令行参数。”是指用DeleteService等API来删除服务,不用xxx.exe /unregserver或其它命令行方式来删除。由于是给内部开发人员培训时写的,所以说的不是很详细。
luoxm
re: 服务(Service)的概念及常见问题
我在服务里 通过fopen打开通过网络映射的盘符里的文件,提示"访问拒绝",我该怎么办呢??
周星星
to luoxm:
没提供用户名和密码的就是网络黑户,当然要"访问拒绝",所以应该先 WNetAddConnection2 一下。
非凡
to luoxm:
除了周星星说的,还要注意用全路径。
另外,你可以先试试你的程序不作为服务运行时是否正常。
luoxm008
re: 服务(Service)的概念及常见问题
不作为服务运行时是正常!
非凡
to:luoxm008
在服务中除了账户不同外,还有权限的问题,有一些功能不能在服务中实现,比如在服务中加入域或者安装打印机都不行,你的这个操作应该和用户相关,你可以单独写一个进程实现打开文件的功能,在服务中调用CreateProcessAsUser就行了。需要先得到用户进程的Token,你可以用OpenProcess打开“explorer.exe”进程

发表评论
切换编辑模式