📄 winntservice.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 + -