大家来讨论讨论!一个Win2K下控制服务的问题!(50分)

  • 主题发起人 主题发起人 yangmingnian
  • 开始时间 开始时间
Y

yangmingnian

Unregistered / Unconfirmed
GUEST, unregistred user!
大家来讨论讨论!一个Win2K下控制服务的问题!
我研究了一下午,终于有了点成果,和大家一起分享,并希望大家一起讨论。
程序代码如下:
uses WinSvc;
……
procedure TForm1.Button1Click(Sender: TObject);
var
temp:SC_HANDLE;
p:PChar;
err:DWORD;
ss:SERVICE_STATUS;
begin
p:=nil;
temp:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
temp:=OpenService(temp,'MSSQLSERVER',SERVICE_ALL_ACCESS); // 在这里指出服务名
if StartService(temp,Cardinal(0),p) then // 启动服务,这里的p不能直接写成nil
showmessage('succeed!')
else begin
err:=getlasterror();
case err of
……
ERROR_INVALID_HANDLE:showmessage('ERROR_INVALID_HANDLE');
end;
end;
// ControlService(temp,SERVICE_CONTROL_STOP,ss); // 停止服务
end;

注意:OpenService函数的第二个参数指出了服务名称,例如:Telnet服务的名称为:TlntSvr
一部分服务名称可由“控制面板->管理工具->服务(点选具体服务)->属性->常规->服务名称(区别于显示名称)”中查出来。

我现在有两个问题:
1. 上述方法得不到http、ftp等服务的名称,不知道它们的名称如何获得。
2. 如果只知道服务的端口,如何确定其服务名称。
我试过查看winnt/system32/drivers/etc/services文件,但是它提供的服务名称在这里不适应。
好像它提供的服务名称只能用于TClientSocket和TServerSocket等类的service属性。
例如telnet服务,该文件中提供的服务名称就是telnet,对应端口/协议为23/tcp
而实际上这里要用到的Telnet服务的名称为:TlntSvr。
 
服务名称在
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
注意nt服务和services里面的服务完全是两码事,不要混为一谈
其实,http服务,apache和iis的都是不同名字的,没有一个固定的,你只能把你知道的放上去
 
Pipi.又是你,呵呵,谢谢,受教了!!
再问一下:
如果只知道服务的端口,如何确定其服务名称
如果只知道服务名称,如何确定其服务的端口
在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services里好像没有相应的端口啊
 
其实在msdn中查一下关于service的函数,然后看关联的函数说明就知道如何用了
还有个getservicestate之类的函数可以取service的状态,其实就重要的是
先取service database(好象msdn是这样说叫databse之类的)的handle,然后再从
service database的handle取得某一个service的handle,然后嘛,要启动、停止、取
服务状态就随你便了。
 
怎么取先取service database呢?
这个先取database在哪里?
 
咳,那个“先取service database”,还不就是你自己在开头说的 OpenSCManager
 
to Pipi. :
我看过联机帮助,我在程序中用到的那个
OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
只是打开默认的service database,但是我不知道这个database到底是在哪里啊?
也不知道这个database里到底是些什么东西啊?
如果我不是要打开默认的database的话,我该怎么办呢?


 
就是缺省的就对了,其他的什么备份的你要吗
没有什么数据库,就是系统用来保存services的基本信息的东西,你在
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services
都看见了
 
就是那个啊,明白了!thanks
 
后退
顶部