windwos 2000及NT 服务注册的具体实现

原创 2003年04月01日 09:03:00

windwos 2000及NT 服务注册的具体实现

{**************************************************************}

{*******************************************************}
{*  程序编写: 陈林茂
{*  编写日期: 2003-01-05
{*  联系作者: linmaochen@sohu.com
{*******************************************************}

interface
uses
   Windows,Classes,SysUtils,Winsvc,nb30,winsock;

Type

  {服务句柄信息}
  TScmInfo=Record
    HostName :String;
    DataBaseName:String;
    DesireAccess :DWORD;
  End;

  {服务信息}
  TSvcInfo=Record
    HscManager :Integer;
    ServerName :String; //服务名
    DisplayName :String; //服务的显示名
    DesireAccess :DWORD; //
    ServiceType :Dword; //服务的类别
    StartType :Dword; //服务的启动方式
    ErrorControl :Dword; //服务错误控制方式
    BinaryPathName :String; //服务执行文件的具体路径
    LoadOrderGroup :String;
    TagId :Dword;
    Dependencies :String;  //依赖:有多个依赖的服务时,中间以空格隔开}
    ServerStartName :String;
    Password :String;
  End;
 

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

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

  Type

   {服务控制类}
   TService=Class(TObject)
   Private
     Scm_Info  :TScmInfo;
     Svc_Info  :TSvcInfo;
     ScmHandle :Integer;

     {服务句柄}
     SvcHandle :Integer;


   Public
     Constructor Create();
     Destructor Destroy();Override;
     Function SetScmInfo():Boolean;
     Function OpenScmHandle():Integer;
     Function SetServiceInfo(TmpSvc :TsvcInfo):Boolean;
     Function CreateService():Boolean;

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

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

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

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

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

   End;

implementation

 

{ TService }

constructor TService.Create;
begin
  try
    ScmHandle :=0;
    SetScmInfo();
    ScmHandle:=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
  Except
  End; 


end;

{建立一服务}
function TService.CreateService(): Boolean;
Var
  i :Integer;
begin
  Try
    OpenScmHandle();
    svc_info.HscManager := ScmHandle;
    Result :=False;
    SvcHandle :=CreateService(svc_Info.HscManager ,Pchar(svc_Info.ServerName),Pchar(Svc_Info.DisplayName),Svc_info.DesireAccess ,
                    svc_INfo.ServiceType ,Svc_Info.StartType ,Svc_Info.ErrorControl,pchar(Svc_Info.BinaryPathName),
                    pchar(''),LPDWORD(0),Pchar(Svc_Info.Dependencies),Pchar(Svc_info.ServerStartName),Pchar(Svc_Info.Password));

   If SvcHandle <> 0 Then
    Begin
      Result :=True;
      CloseServiceHandle(SvcHandle);
    End ;
    I:=i+1;
  Except
  End;

end;


{注销一服务}
function TService.Delete_AService(ServiceName: String): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin

        Rc :=DeleteService(Rhandle);
        Result :=Rc;
        {关闭句柄}
        CloseServiceHandle(RHandle);
      End Else Result :=True;
    End;
  Except
  End;
end;

destructor TService.Destroy;
begin
  try
    CloseServiceHandle(ScmHandle);
  Except
  End;

end;

{打开数据库的句柄}
function TService.isSvcExists(ServiceName: string): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin

        Result :=true;
        {关闭句柄}
        CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;
end;

function TService.OpenScmHandle: Integer;
begin
  try
    SetScmInfo();
    if  ScmHandle <>0 Then CloseServiceHandle(ScmHandle);
    ScmHandle := 0;
    ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
    if ScmHandle = 0 then
      ScmHandle :=OpenSCManager(PChar(Scm_Info.HostName),Nil,Scm_Info.DesireAccess);
  Except
  End;
end;


{打开一服务}
function TService.Open_Service(ServiceName: String): Boolean;
Var
  SHandle :Integer;
begin
  Try
    Result :=False;
    sHandle := 0;
    SHandle :=OpenScmHandle();
    If SHandle<>0 Then
    Begin
      SvcHandle :=OpenService(SHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If SvcHandle <>0 Then Result :=True;
    End;
  Except
  End;

end;

function TService.SetScmInfo(): Boolean;
Var
  hostName : array [0..255] of char;
  wsdata : TWSAData;
begin
  try
    WSAStartup ($0101, wsdata);
    Result :=False;
    gethostname (hostName,sizeof(hostName));

    If HostName ='' Then
      Exit;

    scm_Info.HostName :=HostName;
    Scm_Info.DesireAccess :=SC_MANAGER_ALL_ACCESS;
  Except
  End;

end;

 

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

function TService.SetServiceInfo(TmpSvc: TsvcInfo): Boolean;
begin
  try
    Result :=False;
    If ScmHandle >0 Then
    Begin
      Svc_Info :=TmpSvc;
      Svc_Info.HscManager :=ScmHandle;
      Result :=True;
    End;
  Except
  End;

end;

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

function TService.Control_Service(ServiceName: String;controlType : Integer): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
  Rec_status :TServiceStatus;
  serviceArg :Pchar;
  i  :Integer;

begin
  i :=0;
  serviceArg := Pchar('');
  Try
    Result :=False;
    If ScmHandle <>0 Then
    Begin
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin
        Case controlType of
          1:  //启动服务器
            Begin
              //ControlService(rHandle,SERVICE_CONTROL_START,rec_status);
              StartService(rHandle,0,servicearg);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                sleep(1000);
                i:=i+1;
              End;
            End;
          2:     //暂停服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_PAUSE,rec_status);
              i:=0;
              While i<30 Do
              Begin
                 QueryServiceStatus(RHandle,Rec_status);
                 if rec_status.dwCurrentState =SERVICE_PAUSED then
                 Begin
                   result :=true;
                   CloseServiceHandle(RHandle);
                   Break;
                 End;
                 Sleep(1000);
                 i:=i+1;
              End;
            End;
          3:    //唤醒服务进程
            Begin
              ControlService(rHandle,SERVICE_CONTROL_CONTINUE,rec_status);
              i:=0;
              While i<30 do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_RUNNING then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
          4:   //停止服务进程
            begin
              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
          5:   //关闭服务程序 SERVICE_CONTROL_SHUTDOWN
            Begin
              rec_status.dwCurrentState :=SERVICE_RUNNING;

              ControlService(rHandle,SERVICE_CONTROL_STOP,rec_status);
              i:=0;
              While i<30 Do
              Begin
                QueryServiceStatus(RHandle,Rec_status);
                if rec_status.dwCurrentState =SERVICE_STOPPED then
                Begin
                  result :=True;
                  CloseServiceHandle(RHandle);
                  Break;
                End;
                Sleep(1000);
                i:=i+1;
              End;
            End;
        end;
        Result :=true;
        {关闭句柄}
        if rHandle <> 0  then
          CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;

end;

function TService.IsServiceStart(ServiceName: String): Boolean;
Var
  RHandle:Integer;
  rc :Boolean;
  Rec_status :TServiceStatus;
begin
  Try
    OpenScmHandle();
    Result :=False;
    If ScmHandle<>0 Then
    Begin
      RHandle := 0;
      RHandle :=OpenService(ScmHandle,PChar(ServiceName),SERVICE_ALL_ACCESS );
      If RHandle <>0 Then
      Begin
        QueryServiceStatus(RHandle,Rec_status);
        if rec_status.dwCurrentState =SERVICE_RUNNING then
           result :=True;

        {关闭句柄}
        CloseServiceHandle(RHandle);
      End;
    End;
  Except
  End;

end;

end.

NT Service 编程 操作 NT 服务

操作 NT 服务: OpenSCManager   打开目标计算机上的“服务控制管理器”-SCM,返回指向该管理器的指针。 OpenService     打开服务,返回指向该服务的指针。 St...
  • thanklife
  • thanklife
  • 2017年04月07日 16:29
  • 195

NT4源码编译环境

转自:http://yanshurong.spaces.live.com/blog/cns!33C6A79B73579F0!275.entry 2004年2月12号,有人将Microsoft ...
  • blizmax6
  • blizmax6
  • 2014年04月15日 02:16
  • 2405

怎样写一个 NT 服务程序

每个操作系统都需要有在后台执行任务的方法,无论是谁正在使用这部机器,这些任务都可以继续运行,后台任务可以处理各种重要的服务,包括系统的或者用户的。例如,一个信使服务可以监控网络,并且在接收到另一台机子...
  • thanklife
  • thanklife
  • 2017年04月07日 16:46
  • 233

微服务架构模式系列文章之五:服务端服务发现

熟悉我的朋友都知道,我很不喜欢翻译东西,因为在两种语言的思维方式之间做频繁切换对我来说是件很痛苦的事情。但是这次不一样,公司和同事的大力支持降低了我的痛苦指数,让我能够坚持把Chris Richard...
  • xn_sung
  • xn_sung
  • 2016年08月27日 20:03
  • 1677

Python 编写Windows服务程序:将Python作为Windows服务启动

Python程序作为Windows服务启动,需要安装pywin32包。下载路径: http://sourceforge.net/projects/pywin32/files/pywin32/ ...
  • GhostFromHeaven
  • GhostFromHeaven
  • 2013年02月23日 12:24
  • 23253

Windows下的服务控制管理器(SCM)

一、概要           服务管理器是用于管理系统服务的管理工具。一般常用于windows系统,使用这个工具你可以启动、停止服务;设置服务是自动、手动启动或禁用;查看某个服务的相关信息;设置...
  • u012541747
  • u012541747
  • 2016年03月26日 10:58
  • 596

VS2013写window服务,实现定时短信功能

http://www.cnblogs.com/fong/p/5137685.html 好久没来了,说要写博的,但人懒……一直没写过。最近做一个功能,这样的可能以后很少用到,时...
  • zdy0_2004
  • zdy0_2004
  • 2016年01月17日 22:05
  • 1261

vb创建NT服务

'* ************************************************************** *    '*    程序名称:modNtSrv    '*  ...
  • liaomin416100569
  • liaomin416100569
  • 2013年01月21日 16:58
  • 408

驱动开发(3)使用SCM加载NT驱动(用应用程序加载驱动)

在上一篇中,我简单介绍编写了一个NT驱动空壳,这一篇中,将介绍如何自己编写一个驱动程序加载器,即使用编程的方法加载驱动,而不是使用工具。 我在上一篇中也提到了,驱动程序是通过服务加载的,我以前写过SC...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年10月02日 11:02
  • 1672

NT Service服务详解

NT Service服务详解 http://www.panshy.com/articles/dev-124.html I、  摘要     WIN NT下的服务就类似*NIX下面的守护进程一样,...
  • thanklife
  • thanklife
  • 2017年04月07日 15:09
  • 125
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:windwos 2000及NT 服务注册的具体实现
举报原因:
原因补充:

(最多只允许输入30个字)