delphi 启动系统服务(100)

  • 主题发起人 主题发起人 xernet
  • 开始时间 开始时间
X

xernet

Unregistered / Unconfirmed
GUEST, unregistred user!
//看了一些相关的代码和文章自己动手写了一个启动系统服务的代码,{功能:启动已经停止或者暂停的系统服务}Procedure ServiceStart;varschService:SC_HANDLE;//服务句柄。schSCManager:SC_HANDLE;//服务管理句柄。ssStatus:TServiceStatus; //服务状态。lpServiceArgVectors:Pchar; //保存启动参数。ServiceName: array[0..3] of Pchar;//保存服务名称。I:integer;begin lpServiceArgVectors:=nil; ServiceName[0]:='Messenger';//显现名称:'Messenger' ServiceName[1]:='RasMan';//显现名称:'Remote Access Connection Manager' ServiceName[2]:='Alerter';//显现名称:'Alerter' ServiceName[3]:='RpcLocator';//显现名称:'Remote Procedure Call (RPC) Locator' //以所有权限打开服务管理。 schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); for I:=0 to length(ServiceName) do begin //以所有权限打开服务。 schService:=OpenService(schSCManager,ServiceName,SERVICE_ALL_ACCESS); QueryServiceStatus(schService,ssStatus); //查询服务状态。 if (ssStatus.dwCurrentState = SERVICE_STOPPED) or (ssStatus.dwCurrentState = SERVICE_PAUSED) then//如果服务状态是停止或者暂停就启动服务。 begin StartService(schService,0,lpServiceArgVectors); CloseServiceHandle(schService);//关闭该Service句柄 end; end; CloseServiceHandle(schSCManager);end;我发现有些系统服务可以有些就不能够启动,比如'Alerter'服务和'Messenger'服务就能正常的启动起来,'Netman'就不能启动,类似'Alerter'的服务名称和显示名称是一样的,就能启动,类似'Netman'的服务名称和显示名称不一样的不能启动,这是为何?
 
是不是有关联的服务没有启动所致?
 
TO:de410我测试过,相关的服务所依赖的服务,好象不是这样所导致的,其他人还有更好的办法吗?
 
直接调用Dos命令试试:winexec('net Start "Messenger"',0);
 
谁说不行,Netman后面还有一空格,你加上试试'Netman '没有空格的是另外一个服务,
 
问题就是要启动没有空格的这个服务,随便修改下这个程序的小BUG,"for I:=0 to length(ServiceName) do"这句应该改成 for I:=0 to length(ServiceName)-1 do
 
function wServiceStart(const sMachine, sService: string) : Boolean;var schm,schs: SC_Handle; ss: TServiceStatus; psTemp: PChar; dwChkP: DWord;begin ss.dwCurrentState := 0; schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT); if (schm>0) then begin schs := OpenService(schm, PChar(sService), SERVICE_START or SERVICE_QUERY_STATUS); if (schs>0) then begin psTemp := nil; if (StartService(schs, 0, psTemp)) then if (QueryServiceStatus(schs, ss)) then while (SERVICE_START_PENDING<>ss.dwCurrentState) do begin dwChkP := ss.dwCheckPoint; Sleep(ss.dwWaitHint); if (not QueryServiceStatus(schs, ss)) then Break; if ss.dwCheckPoint <> 0 then Break; end; CloseServiceHandle(schs); end; CloseServiceHandle(schm); end; Result := SERVICE_RUNNING=ss.dwCurrentState;end;wServiceStart('','Netman')还是可以启动的
 
启动服务用户的用户组权限限制?
 
多人接受答案了。
 
后退
顶部