bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 Delphi 管理 NT/2000 系統的服務
查看: 3178|回復: 0
go

管理 NT/2000 系統的服務 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2006-8-4 09:08 |只看該作者 |倒序瀏覽 |打印
  1. unit Service;

  2. interface

  3. uses
  4.   Windows,Classes,SysUtils,Winsvc,nb30,winsock;

  5. Type

  6.   {服务句柄信息}
  7.   TScmInfo = Record
  8.     HostName : String;
  9.     DataBaseName: String;
  10.     DesireAccess : DWORD;
  11.   End;

  12.   {服务信息}
  13.   TSvcInfo = Record
  14.     HscManager :Integer;
  15.     ServerName :String; //服务名
  16.     DisplayName :String; //服务的显示名
  17.     DesireAccess :DWORD; //
  18.     ServiceType :Dword; //服务的类别
  19.     StartType :Dword; //服务的启动方式
  20.     ErrorControl :Dword; //服务错误控制方式
  21.     BinaryPathName :String; //服务执行文件的具体路径
  22.     LoadOrderGroup :String;
  23.     TagId :Dword;
  24.     Dependencies :String; //依赖:有多个依赖的服务时,中间以空格隔开}
  25.     ServerStartName :String;
  26.     Password :String;
  27.   End;


  28. //需要注册的服务信息数组

  29. SvcArray = Array[1..20] of TSvcInfo;

  30. Type

  31. {服务控制类}
  32.   TService = Class(TObject)
  33.   Private
  34.     Scm_Info :TScmInfo;
  35.     Svc_Info :TSvcInfo;
  36.     ScmHandle :Integer;

  37.     {服务句柄}
  38.     SvcHandle :Integer;

  39.   Public
  40.     Constructor Create();
  41.     Destructor Destroy();Override;
  42.     Function SetScmInfo():Boolean;
  43.     Function OpenScmHandle():Integer;
  44.     Function SetServiceInfo(TmpSvc :TsvcInfo):Boolean;
  45.     Function CreateService0():Boolean;

  46.     {删除一服务}
  47.     Function Delete_AService(ServiceName :String):Boolean;

  48.     {建立一服务}
  49.     Function Open_Service(ServiceName :String):Boolean;

  50.     {/////////////////////////////////////////////////////////////////////}
  51.     {// 函数名称: IsSvcExists()
  52.     {// 函数功能: 判断系统中相关的服务是否存在
  53.     {// 参数信息: 需要判断的服务名
  54.     {// 返回值: TRUE : WINDOWS 中的服务已存在,FALSE :WINDOWS 中的服务不存在
  55.     {//
  56.     {/////////////////////////////////////////////////////////////////////}
  57.     Function isSvcExists(ServiceName :string):Boolean;

  58.     {/////////////////////////////////////////////////////////////////////////}
  59.     {// 函数名称: Start_Service()
  60.     {// 函数功能: 启动相关的服务进程
  61.     {// 参数信息: 需要启动的服务名
  62.     {// 返回值: TRUE :服务已经启动;FALSE:服务启动失败;
  63.     {/////////////////////////////////////////////////////////////////////////}
  64.     Function Control_Service(ServiceName : String; controlType :integer):Boolean;

  65.     {/////////////////////////////////////////////////////////////////////////}
  66.     {// 函数名称: IsServiceStart()
  67.     {// 函数功能: 判断服务是否启动
  68.     {// 参数信息: 需要判断的服务名
  69.     {// 返回值: TRUE :服务已经启动; FALSE :服务已停止
  70.     {/////////////////////////////////////////////////////////////////////////}
  71.     Function IsServiceStart(ServiceName:String):Boolean;

  72.   End;

  73. implementation

  74. { TService }

  75. constructor TService.Create;
  76. begin
  77.   try
  78.     ScmHandle := 0;
  79.     SetScmInfo();
  80.     ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
  81.   Except
  82.   End;
  83. end;

  84. {建立一服务}
  85. function TService.CreateService0(): Boolean;
  86. Var
  87.   i :Integer;
  88. begin
  89.   try
  90.     OpenScmHandle();
  91.     svc_info.HscManager := ScmHandle;
  92.     Result := False;
  93.     SvcHandle := CreateService(Svc_Info.HscManager ,
  94.       PChar(Svc_Info.ServerName),
  95.       PChar(Svc_Info.DisplayName), Svc_info.DesireAccess , Svc_INfo.ServiceType ,
  96.       Svc_Info.StartType, Svc_Info.ErrorControl,
  97.       PChar(Svc_Info.BinaryPathName),
  98.       PChar(''), LPDWORD(0), PChar(Svc_Info.Dependencies), PChar(Svc_info.ServerStartName),
  99.       PChar(Svc_Info.Password));

  100.     If SvcHandle <> 0 Then
  101.     begin
  102.       Result := True;
  103.       CloseServiceHandle(SvcHandle);
  104.     end ;
  105.     I := i + 1;
  106.   except
  107.   end;
  108. end;

  109. {注销一服务}
  110. function TService.Delete_AService(ServiceName: String): Boolean;
  111. Var
  112.   RHandle:Integer;
  113.   rc :Boolean;
  114. begin
  115.   try
  116.     OpenScmHandle();
  117.     Result := False;
  118.     If ScmHandle <> 0 Then
  119.     Begin
  120.       RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
  121.       If RHandle <> 0 Then
  122.       Begin

  123.         Rc := DeleteService(Rhandle);
  124.         Result := Rc;
  125.         {关闭句柄}
  126.         CloseServiceHandle(RHandle);
  127.       End Else Result := True;
  128.     end;
  129.   except
  130.   end;
  131. end;

  132. destructor TService.Destroy;
  133. begin
  134.   try
  135.     CloseServiceHandle(ScmHandle);
  136.   except
  137.   end;
  138. end;

  139. {打开数据库的句柄}
  140. function TService.isSvcExists(ServiceName: string): Boolean;
  141. Var
  142.   RHandle:Integer;
  143.   rc :Boolean;
  144. begin
  145.   Try
  146.     OpenScmHandle();
  147.     Result := False;
  148.     If ScmHandle <> 0 Then
  149.     Begin
  150.       RHandle := OpenService(ScmHandle,PChar(ServiceName), SERVICE_ALL_ACCESS);
  151.       If RHandle <> 0 Then
  152.       Begin
  153.         Result := true;
  154.         {关闭句柄}
  155.         CloseServiceHandle(RHandle);
  156.       end;
  157.     end;
  158.     except
  159.   end;
  160. end;

  161. function TService.OpenScmHandle: Integer;
  162. begin
  163.   try
  164.     SetScmInfo();
  165.     if ScmHandle <> 0 Then CloseServiceHandle(ScmHandle);
  166.     ScmHandle := 0;
  167.     ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
  168.     if ScmHandle = 0 then
  169.       ScmHandle := OpenSCManager(PChar(Scm_Info.HostName), Nil,Scm_Info.DesireAccess);
  170.   except
  171.   end;
  172. end;

  173. {打开一服务}
  174. function TService.Open_Service(ServiceName: String): Boolean;
  175. Var
  176.   SHandle :Integer;
  177. begin
  178.   try
  179.     Result := False;
  180.     sHandle := 0;
  181.     SHandle := OpenScmHandle();
  182.     If SHandle <> 0 Then
  183.     Begin
  184.       SvcHandle := OpenService(SHandle,PChar(ServiceName), SERVICE_ALL_ACCESS );
  185.       If SvcHandle <> 0 Then Result := True;
  186.     end;
  187.   except
  188.   end;
  189. end;

  190. function TService.SetScmInfo(): Boolean;
  191. Var
  192.   hostName : array [0..255] of char;
  193.   wsdata : TWSAData;
  194. begin
  195.   try
  196.     WSAStartup ($0101, wsdata);
  197.     Result := False;
  198.     gethostname (hostName, SizeOf(hostName));

  199.     If hostName = '' Then
  200.       Exit;

  201.     Scm_Info.HostName := HostName;
  202.     Scm_Info.DesireAccess := SC_MANAGER_ALL_ACCESS;
  203.   except
  204.   end;
  205. end;



  206. //设置需要注册的WINDOWS 服务的具体信息

  207. function TService.SetServiceInfo(TmpSvc: TsvcInfo): Boolean;
  208. begin
  209.   try
  210.     Result := False;
  211.     If ScmHandle > 0 Then
  212.     Begin
  213.       Svc_Info := TmpSvc;
  214.       Svc_Info.HscManager := ScmHandle;
  215.       Result := True;
  216.     end;
  217.     except
  218.     end;
  219. end;

  220. //控制WINDOWS 系统内部的服务

  221. function TService.Control_Service(ServiceName: String;controlType : Integer): Boolean;
  222. Var
  223.   RHandle:Integer;
  224.   rc :Boolean;
  225.   Rec_status :TServiceStatus;
  226.   serviceArg :Pchar;
  227.   i :Integer;
  228. begin
  229.   i :=0;
  230.   serviceArg := Pchar('');
  231.   Try
  232.     Result := False;
  233.     If ScmHandle <> 0 Then
  234.     Begin
  235.       RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
  236.       If RHandle <> 0 Then
  237.       Begin
  238.         Case controlType of
  239.         1: //启动服务器
  240.         Begin
  241.           //ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
  242.           StartService(rHandle, 0, servicearg);
  243.           i := 0;
  244.           While i < 30 Do
  245.           Begin
  246.             QueryServiceStatus(RHandle, Rec_status);
  247.             if rec_status.dwCurrentState = SERVICE_RUNNING then
  248.             Begin
  249.               result := True;
  250.               CloseServiceHandle(RHandle);
  251.               Break;
  252.             End;
  253.             Sleep(1000);
  254.             i := i + 1;
  255.           End;
  256.         End;
  257.         2: //暂停服务进程
  258.         Begin
  259.           ControlService(rHandle, SERVICE_CONTROL_PAUSE, rec_status);
  260.           i := 0;
  261.           While i < 30 Do
  262.           Begin
  263.             QueryServiceStatus(RHandle, Rec_status);
  264.             if rec_status.dwCurrentState = SERVICE_PAUSED then
  265.             Begin
  266.               result := true;
  267.               CloseServiceHandle(RHandle);
  268.               Break;
  269.             end;
  270.             Sleep(1000);
  271.             i := i + 1;
  272.           end;
  273.         end;
  274.         3: //唤醒服务进程
  275.         Begin
  276.           ControlService(rHandle, SERVICE_CONTROL_CONTINUE, rec_status);
  277.           i := 0;
  278.           While i < 30 do
  279.           Begin
  280.             QueryServiceStatus(RHandle, Rec_status);
  281.             if rec_status.dwCurrentState = SERVICE_RUNNING then
  282.             Begin
  283.               result := True;
  284.               CloseServiceHandle(RHandle);
  285.               Break;
  286.             End;
  287.             Sleep(1000);
  288.             i := i + 1;
  289.           end;
  290.         end;
  291.         4: //停止服务进程
  292.         begin
  293.           ControlService(rHandle, SERVICE_CONTROL_STOP, rec_status);
  294.           i := 0;
  295.           While i < 30 Do
  296.           Begin
  297.             QueryServiceStatus(RHandle, Rec_status);
  298.             if rec_status.dwCurrentState = SERVICE_STOPPED then
  299.             Begin
  300.               result  := True;
  301.               CloseServiceHandle(RHandle);
  302.               Break;
  303.             End;
  304.             Sleep(1000);
  305.             i := i + 1;
  306.           End;
  307.         End;
  308.         5: //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
  309.         Begin
  310.           rec_status.dwCurrentState := SERVICE_RUNNING;
  311.           ControlService(rHandle, SERVICE_CONTROL_STOP, rec_status);
  312.           i := 0;
  313.           While i < 30 Do
  314.           Begin
  315.             QueryServiceStatus(RHandle, Rec_status);
  316.             if rec_status.dwCurrentState = SERVICE_STOPPED then
  317.             Begin
  318.               result := True;
  319.               CloseServiceHandle(RHandle);
  320.               Break;
  321.             End;
  322.             Sleep(1000);
  323.             i := i + 1;
  324.           End;
  325.         End;
  326.       end;
  327.       Result := true;
  328.       {关闭句柄}
  329.       if rHandle <> 0 then
  330.         CloseServiceHandle(RHandle);
  331.     end;
  332.   end;
  333.   except
  334.   end;
  335. end;

  336. function TService.IsServiceStart(ServiceName: String): Boolean;
  337. Var
  338.   RHandle:Integer;
  339.   rc :Boolean;
  340.   Rec_status :TServiceStatus;
  341. begin
  342.   Try
  343.     OpenScmHandle();
  344.     Result := False;
  345.     If ScmHandle <> 0 Then
  346.     Begin
  347.       RHandle := 0;
  348.       RHandle := OpenService(ScmHandle, PChar(ServiceName), SERVICE_ALL_ACCESS );
  349.       If RHandle <> 0 Then
  350.       Begin
  351.         QueryServiceStatus(RHandle, Rec_status);
  352.         if rec_status.dwCurrentState = SERVICE_RUNNING then
  353.           result := True;

  354.         {关闭句柄}
  355.         CloseServiceHandle(RHandle);
  356.       End;
  357.     End;
  358.   Except
  359.   End;
  360. end;

  361. end.
複製代碼
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-5-5 13:18 , Processed in 0.012725 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.