?? uprocessservice.pas
字號:
{*******************************************************}
{ }
{ 系統(tǒng)工具箱程序中服務(wù)管理過程單元 }
{ }
{ Copyright (c) 2005, MICHAEL }
{ http://xuhaohome.yeah.net OR xuhaohome.2008.cc }
{ E-Mail:x_h168@163.com QQ:10660578 8416321 }
{ }
{*******************************************************}
unit UProcessService;
interface
uses WinSvc,Classes,Windows,Sysutils;
function ServiceGetList(
sMachine : string;
dwServiceType,
dwServiceState : Dword;
slServicesList : TStrings )
: boolean; //List service
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;
type
PTcpInfo = ^TTcpInfo;
TTcpInfo = packed record
prev: PTcpInfo;
next: PTcpInfo;
state: UINT;
localip: UINT;
localport: UINT;
remoteip: UINT;
remoteport: UINT;
end;
PIds = ^TIds;
TIds = array[0..9] of UINT;
const
TcpIdentifiers: TIds = (1, 3, 6, 1, 2, 1, 6, 13, 1, 0);
UdpIdentifiers: TIds = (1, 3, 6, 1, 2, 1, 7, 5, 1, 0);
TcpState: array[0..11] of string[13] = ('未知狀態(tài)',
'已經(jīng)結(jié)束',
'監(jiān)聽狀態(tài)',
'SYN_SENT',
'SEN_RECEIVED',
'已經(jīng)建立',
'FIN_WAIT',
'FIN_WAIT2',
'結(jié)束等待',
'正在結(jié)束',
'LAST_ACK',
'超時等待');
M_CREATESOCKETERROR = '創(chuàng)建Socket失敗!' ;
M_TCPUDP = '雙擊獲得詳細信息' ;
M_PROCESS = '右鍵選擇結(jié)束進程' ;
M_SERVICE = '右鍵選擇啟動和停止服務(wù)';
implementation
const
//
// Service Types
//
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;
SERVICE_DRIVER =
(SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);
SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 =
(SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS);
SERVICE_INTERACTIVE_PROCESS = $00000100;
SERVICE_TYPE_ALL =
(SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);
//-------------------------------------
// Get a list of services
//
// return TRUE if successful
//
// sMachine:
// machine name, ie: \\SERVER
// empty = local machine
//
// dwServiceType
// SERVICE_WIN32,
// SERVICE_DRIVER or
// SERVICE_TYPE_ALL
//
// dwServiceState
// SERVICE_ACTIVE,
// SERVICE_INACTIVE or
// SERVICE_STATE_ALL
//
// slServicesList
// TStrings variable to storage
//
{----在WindowsNT下,各種Service都存在service control manager database中,因此我們可以通過對service control manager database進行操作來實現(xiàn)對Service的編程。下面介紹常用的函數(shù):
1:SC_HANDLE OpenSCManager(LPCTSTR lpszMachineName,
LPCTSTR lpszDatabaseName,
DWORD fdwDesiredAccess);
----Open SCManager 函數(shù)打開指定計算機上的service control manager database。其中參數(shù)lpszMachineName指定計算機名,若為空則指定為本機。參數(shù)lpszDatabaseName指定要打開的service control manager database,默認為空。
----參數(shù)fdwDesiredAccess指定操作的權(quán)限,可以為下面取值之一
SC_MANAGER_ALL_ACCESS //所有權(quán)限
SC_MANAGER_CONNECT //允許連接service control manager
SC_MANAGER_CREATE_SERVICE //允許創(chuàng)建服務(wù)對象并把它加入service control manager database
SC_MANAGER_ENUMERATE_SERVICE //允許枚舉service control manager database中的服務(wù)SC_MANAGER_LOCK //允許鎖住service control manager database
SC_MANAGER_QUERY_LOCK_STATUS //允許獲取servicecontrolmanagerdatabase的封鎖信息
----函數(shù)返回值:函數(shù)執(zhí)行成功則返回一個指向service control manager database的句柄,失敗則返回NULL。
2:SC_HANDLE OpenService(SC_HANDLE schSCManager,
LPCTSTR lpszServiceName,
DWORD fdwDesiredAccess);
----OpenService函數(shù)打開指定的Service。
----其中參數(shù)schSCManager是指向service control manager database的句柄,由OpenSCManager函數(shù)返回。
----參數(shù)lpszServiceName要打開的服務(wù)的名字,注意大小寫。
----參數(shù)fdwDesiredAccess指定操作的權(quán)限,可以為下面取值之一
SERVICE_ALL_ACCESS //所有權(quán)限
SERVICE_CHANGE_CONFIG //允許更改服務(wù)的配置
SERVICE_ENUMERATE_DEPENDENTS //允許獲取依賴于該服務(wù)的其他服務(wù)
SERVICE_INTERROGATE //允許立即獲取服務(wù)狀態(tài)
SERVICE_PAUSE_CONTINUE //允許暫停和喚醒服務(wù)
SERVICE_QUERY_CONFIG //允許獲取服務(wù)配置
SERVICE_QUERY_STATU //允許通過訪問service control manager獲取服務(wù)狀態(tài)
SERVICE_START //允許啟動服務(wù)
SERVICE_STOP //允許停止服務(wù)
SERVICE_USER_DEFINE_CONTROL //允許用戶指定特殊的服務(wù)控制碼
----函數(shù)返回值:函數(shù)執(zhí)行成功則返回指向某項服務(wù)的句柄,失敗則返回NULL。
3:BOOL QueryServiceStatus(SC_HANDLE schService,LPSERVICE_STATUS lpssServiceStatus);
----QueryServiceStatus函數(shù)返回指定服務(wù)的當前狀態(tài)。
----其中參數(shù)schService是指向某項服務(wù)的句柄,由OpenService函數(shù)返回,且必須SERVICE_QUERY_STATUS的權(quán)限。
----參數(shù)lpssServiceStatus中存放返回的服務(wù)狀態(tài)信息,結(jié)構(gòu)如下
typedefstruct_SERVICE_STATUS{
DWORD dwServiceType; //服務(wù)類型
DWORD dwCurrentState; //當前狀態(tài)
DWORD dwControlsAccepted; //服務(wù)可接受的控制碼
DWORD dwWin32ExitCode; //Win32出錯代碼
DWORD dwServiceSpecificExitCode;//服務(wù)出錯代碼
DWORD dwCheckPoint; //用于跟蹤服務(wù)長時間操作
DWORD dwWaitHint; //服務(wù)某一操作的最大允許時間,以毫秒為單位
}//SERVICE_STATUS,*LPSERVICE_STATUS;
{----函數(shù)返回值:函數(shù)執(zhí)行成功則返回True,失敗則返回False。
4:BOOLStartService(SC_HANDLE schService,DWORD dwNumServiceArgs,LPCTSTR * lpszServiceArgs);
----StartService函數(shù)啟動指定的服務(wù)。
----其中參數(shù)schService是指向某項服務(wù)的句柄,由OpenService函數(shù)返回,且必須有SERVICE_START的權(quán)限。
----dwNumServiceArgs為啟動服務(wù)所需的參數(shù)的個數(shù)。
----lpszServiceArgs為啟動服務(wù)所需的參數(shù)。函數(shù)返回值:函數(shù)執(zhí)行成功則返回True,失敗則返回False。
5:BOOL ControlService(SC_HANDLE hService,DWORD dwControl,LPSERVICE_STATUS lpServiceStatus);
----ControlService函數(shù)向Win32service發(fā)送控制碼。
----其中參數(shù)hService是指向某項服務(wù)的句柄,由OpenService函數(shù)返回。
----參數(shù)dwControl為控制碼,常用的有
SERVICE_CONTROL_STOP //停止服務(wù)
SERVICE_CONTROL_PAUSE //暫停服務(wù)
SERVICE_CONTROL_CONTINUE //喚醒暫停的服務(wù)
SERVICE_CONTROL_INTERROGATE//刷新某服務(wù)的狀態(tài)
----參數(shù)lpServiceStatus指向SERVICE_STATUS結(jié)構(gòu),用于存放該服務(wù)最新的狀態(tài)信息。
----函數(shù)返回值:函數(shù)執(zhí)行成功則返回True,失敗則返回False。
6:BOOL EnumServicesStatus(SC_HANDLE hSCManager,
DWORD dwServiceType,
DWORD dwServiceState,
LPENUM_SERVICE_STATUS lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle);
----EnumServicesStatus函數(shù)用于枚舉NT下存在的Service。
----其中參數(shù)hSCManager是指向service control manager database的句柄,由OpenSCManager函數(shù)返回,且必須有SC_MANAGER_ENUMERATE_SERVICE的權(quán)限。
----參數(shù)dwServiceType指定按服務(wù)的類型枚舉。
----參數(shù)dwServiceState指定按服務(wù)的狀態(tài)枚舉。
----參數(shù)lpServices指向ENUM_SERVICE_STATUS結(jié)構(gòu),用于存放返回的服務(wù)的名字和狀態(tài)信息。
----參數(shù)cbBufSize返回參數(shù)lpServices的長度,以字節(jié)為單位。
----參數(shù)pcbBytesNeeded返回獲取剩余的Service所需字節(jié)的個數(shù)。
----參數(shù)lpServicesReturned返回服務(wù)的個數(shù)。
----參數(shù)lpResumeHandle,當?shù)谝淮握{(diào)用時該參數(shù)為0,當該函數(shù)再次被調(diào)用以獲取另外的信息時,該參數(shù)表示下一個被讀的Service。
----函數(shù)返回值:函數(shù)執(zhí)行成功則返回True,失敗則返回False。
----值得注意的是通常情況下該函數(shù)返回的結(jié)果為FALSE,我們可以調(diào)用GetLastError()來獲取進一步信息。因為一臺機器上有多種服務(wù)存在,所以GetLastError()應(yīng)為ERROR_MORE_DATA,此時應(yīng)再次調(diào)用EnumServicesStatus函數(shù)以獲取正確的Service列表。
}
function ServiceGetList(
sMachine : string;
dwServiceType,
dwServiceState : Dword;
slServicesList : TStrings )
: boolean;
const
//
// assume that the total number of
// services is less than 4096.
// increase if necessary
cnMaxServices = 4096;
type
TSvcA = array[0..cnMaxServices]
of TEnumServiceStatus;
PSvcA = ^TSvcA;
var
//
// temp. use
j : integer;
//
// service control
// manager handle
schm : SC_Handle;
//
// bytes needed for the
// next buffer, if any
nBytesNeeded,
//
// number of services
nServices,
//
// pointer to the
// next unread service entry
nResumeHandle : DWord;
//
// service status array
ssa : PSvcA;
begin
Result := false;
// connect to the service
// control manager
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_ALL_ACCESS);
// if successful...
if(schm > 0)then
begin
nResumeHandle := 0;
New(ssa);
EnumServicesStatus(
schm,
dwServiceType,
dwServiceState,
ssa^[0],
SizeOf(ssa^),
nBytesNeeded,
nServices,
nResumeHandle );
//
// assume that our initial array
// was large enough to hold all
// entries. add code to enumerate
// if necessary.
//
for j := 0 to nServices-1 do
begin
slServicesList.
Add( StrPas(
ssa^[j].lpDisplayName ) );
end;
Result := true;
Dispose(ssa);
// close service control
// manager handle
CloseServiceHandle(schm);
end;
end;
function ServiceGetKeyName(
sMachine,
sServiceDispName : string ) : string;
var
//
// service control
// manager handle
schm : SC_Handle;
//
// max key name len
nMaxNameLen : DWord;
//
// temp. string
psServiceName : PChar;
begin
Result := '';
// expect a service key
// name shorter than 255
// characters
nMaxNameLen := 255;
// connect to the service
// control manager
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
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;
// close service control
// manager handle
CloseServiceHandle(schm);
end;
end;
function ServiceGetDisplayName(
sMachine,
sServiceKeyName : string ) : string;
var
//
// service control
// manager handle
schm : SC_Handle;
//
// max display name len
nMaxNameLen : DWord;
//
// temp. string
psServiceName : PChar;
begin
Result := '';
// expect a service display
// name shorter than 255
// characters
nMaxNameLen := 255;
// connect to the service
// control manager
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_CONNECT);
// if successful...
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -