delphi 列举系统服务,停止启动所选服务


本文整理自网络,侵删。

 { FileName: Unit1.pas
功用: 列举系统服务,停止和启动所选服务,设置服务启动类型
最后更新: 2005-04-20
日期: 2005-04-19
作者: yanxizhen yanxizhen#163.com
}
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Winsvc, ComCtrls, ExtCtrls,Registry, Menus;

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
LView1: TListView;
Splitter2: TSplitter;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure LView1ColumnClick(Sender: TObject; Column: TListColumn);
procedure LView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
procedure PopupMenu1Popup(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }

{ 返回服务状态 }
function GetServiceState( dwCurrentState: DWord): String;

{ 读取注册表中的服务信息 }
function ReadFromRegistry( ServiceName: String;KeyName: String;IsInt:Integer=0): String;

{ 打开一个服务 }
function MyOpenService(ServiceName: PChar):Boolean;

{ 控制服务的状态: 暂停,停止,继续 }
function MyControlService(ServiceName: PChar;ControlCode: DWORD):Boolean;

{ 启动一个服务 }
function MyStartService(NumServiceArgs: DWord=0;ServiceArgVectors: PChar=nil): Boolean;

{ 查询一个服务当前的运行状态 }
function MyQueryServiceStatus(): DWord;

{ 写入一个值到注册表 }
procedure WriteIntegerToRegistry( ServiceName: String;KeyName: String;KeyValue: Integer);

public
{ Public declarations }
{ 定义本地服务数据库的句柄,定义服务查询返回信息结构 }
hScm,hService: SC_HANDLE;
RtnStatus: TServiceStatus;
end;

var
Form1: TForm1;
ColumnToSort: Integer; // 指定要排序的列的index值

implementation

{$R *.dfm}


{ 打开一个服务 }
function TForm1.MyOpenService(ServiceName: PChar):Boolean;
begin
Result := False;
hService := OpenService(hScm,ServiceName,SERVICE_ALL_ACCESS);
Result := (hService <> 0);

end;

{ 控制服务的状态: 暂停,停止,继续 }
function TForm1.MyControlService(ServiceName: PChar;ControlCode: DWORD):Boolean;
var
ServiceStatus: TServiceStatus;
begin
Result := ControlService(hService,ControlCode,ServiceStatus);
end;


{ 启动一个服务 }
function TForm1.MyStartService(NumServiceArgs: DWord=0;ServiceArgVectors: PChar=nil):Boolean;
begin
Result := StartService(hService,NumServiceArgs,ServiceArgVectors);
end;

{ 查询一个服务当前的运行状态 }
function TForm1.MyQueryServiceStatus(): DWord;
var
ServiceStatus: TServiceStatus;
begin
Result := 0;
QueryServiceStatus(hService,ServiceStatus);
Result := ServiceStatus.dwCurrentState;
end;


{ 读取注册表中的服务信息 }
function TForm1.ReadFromRegistry( ServiceName: String;KeyName: String;IsInt:Integer=0): String;
var
reg: TRegistry;
begin
reg := TRegistry.Create;

try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+ServiceName,False);

if IsInt<>0 then
begin
case reg.ReadInteger(KeyName) of
2: Result := '自动';
3: Result := '手动';
4: Result := '禁用';
end;
end
else
Result := reg.ReadString(KeyName);

finally
reg.CloseKey;
reg.Free;
end;

end;


{ 写入一个整型值到注册表 }
procedure TForm1.WriteIntegerToRegistry( ServiceName: String;KeyName: String;KeyValue: Integer);
var
reg: TRegistry;
begin
reg := TRegistry.Create;

try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+ServiceName,False);
reg.WriteInteger(KeyName,KeyValue);

finally
reg.CloseKey;
reg.Free;
end;

end;


{ 返回服务状态 }
function TForm1.GetServiceState( dwCurrentState: DWord): String;
begin
Result := '无效值';

case dwCurrentState of
SERVICE_STOPPED:
Result := ('已停止');
SERVICE_START_PENDING :
Result := ('正在启动...');
SERVICE_STOP_PENDING :
Result := ('正在停止...');
SERVICE_RUNNING :
Result := ('已启动');
SERVICE_CONTINUE_PENDING :
Result := ('SERVICE_CONTINUE_PENDING');
SERVICE_PAUSE_PENDING :
Result := ('正在暂停...');
SERVICE_PAUSED :
Result := ('暂停');
end;

end;


{ 列举当前系统的所有服务 }
procedure TForm1.Button1Click(Sender: TObject);
var
ByteNeeded, SrvRtn, ResumeHandle: DWord;
ServiceArr: Array[0..500] of TEnumServiceStatus;
i: Dword;
item: TListItem;
begin
LView1.Clear;
ResumeHandle := 0;


EnumServicesStatus(hScm,SERVICE_WIN32,SERVICE_STATE_ALL,ServiceArr[0],
SizeOf(ServiceArr),ByteNeeded,SrvRtn,ResumeHandle);


for i := 0 to SrvRtn -1 do
begin
item := LView1.Items.Add();
item.Caption := IntToStr(i+1);
item.SubItems.Add(ServiceArr[i].lpServiceName); // 服务名
item.SubItems.Add(ReadFromRegistry(ServiceArr[i].lpServiceName,'Description')); // 描述
item.SubItems.Add(ReadFromRegistry(ServiceArr[i].lpServiceName,'Start',1)); // 启动类型
item.SubItems.Add(GetServiceState(ServiceArr[i].ServiceStatus.dwCurrentState)); // 当前状态

end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{ 打开Service Manager 数据库 }
hScm := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if ( hScm < 0 ) then
begin
ShowMessage('打开SCM失败!');
end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
Panel1.Height := (Self.Height * 3) div 4;
end;

{ ListView的Column Header的单击事件
里面的代码用来排序
}
procedure TForm1.LView1ColumnClick(Sender: TObject; Column: TListColumn);
begin
if LView1.Items.Count > 0 then
begin
ColumnToSort := Column.Index;
(Sender as TCustomListView).AlphaSort;
end;

end;

{ 对各列进行排序 }
procedure TForm1.LView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if LView1.Items.Count >0 then
begin
if ColumnToSort = 0 then
Compare := CompareText(Item1.Caption,Item2.Caption)
else begin
ix := ColumnToSort - 1;
Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
end;
end;

end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
i: integer;
selItem: TListItem;
begin
selItem := LView1.Selected;

if selItem = nil then
begin
for i:=0 to popupmenu1.Items.Count-1 do
begin
popupmenu1.Items[i].Enabled := false;
end;
exit;
end;



if selItem <> nil then
begin
popupmenu1.Items[2].Enabled := True;

if (selItem.SubItems.Strings[3] = '已启动') then
begin
popupmenu1.Items[0].Enabled := True;
popupmenu1.Items[1].Enabled := False;
end;
if (selItem.SubItems.Strings[3] = '已停止') then
begin
popupmenu1.Items[1].Enabled := True;
popupmenu1.Items[0].Enabled := False;

end;
end;

end;

{ 启动 菜单 }
procedure TForm1.N2Click(Sender: TObject);
var
selItem: TListItem;
begin
selItem := LView1.Selected;
try

if MyOpenService(PChar(selItem.SubItems.Strings[0])) then
begin
if MyStartService() then
begin
selItem.SubItems.Strings[3] := '已启动';
ShowMessage('启动成功!')
end
else
ShowMessage('MyStartService调用失败! 错误代码: '+IntToStr(GetLastError()));
end
else
ShowMessage('MyOpenService调用失败! 错误代码: ' + IntToStr(GetLastError()));

finally
CloseServiceHandle(hService);
end;


end;

{ 停止 服务 }
procedure TForm1.N1Click(Sender: TObject);
var
selItem: TListItem;
begin
selItem := LView1.Selected;
try

if MyOpenService(PChar(selItem.SubItems.Strings[0])) then
begin
if MyControlService(PChar(selItem.SubItems.Strings[0]),SERVICE_CONTROL_STOP) then
begin
selItem.SubItems.Strings[3] := '已停止';
ShowMessage('停止服务成功!')
end
else
ShowMessage('MyControlService调用失败! 错误代码: '+IntToStr(GetLastError()));
end
else
ShowMessage('MyOpenService调用失败! 错误代码: ' + IntToStr(GetLastError()));

finally
CloseServiceHandle(hService);
end;


end;

{ 设置为自动启动 }
procedure TForm1.N4Click(Sender: TObject);
var
selItem: TListItem;
begin
selItem := LView1.Selected;

if selItem.SubItems.Strings[2] <> '自动' then
begin
WriteIntegerToRegistry(selItem.SubItems.Strings[0],'Start',2);
selItem.SubItems.Strings[2] := ReadFromRegistry(selItem.SubItems.Strings[0],'Start',1);
end;

end;

{ 设置为手动启动 }
procedure TForm1.N5Click(Sender: TObject);
var
selItem: TListItem;
begin
selItem := LView1.Selected;

if selItem.SubItems.Strings[2] <> '手动' then
begin
WriteIntegerToRegistry(selItem.SubItems.Strings[0],'Start',3);
selItem.SubItems.Strings[2] := ReadFromRegistry(selItem.SubItems.Strings[0],'Start',1);
end;

end;

{ 设置为禁止启动 }
procedure TForm1.N6Click(Sender: TObject);
var
selItem: TListItem;
begin
selItem := LView1.Selected;

if selItem.SubItems.Strings[2] <> '禁止' then
begin
WriteIntegerToRegistry(selItem.SubItems.Strings[0],'Start',4);
selItem.SubItems.Strings[2] := ReadFromRegistry(selItem.SubItems.Strings[0],'Start',1);
end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseServiceHandle(hScm);
end;

end.


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/oury/archive/2005/07/14/424433.aspx

相关阅读 >>

如何使用Delphi 10 seattle的android应用做intent的发送和接收

Delphi 合并文件

Delphi获得系统当前时间日期和格式化时间

Delphi中的instrrev函数(倒找文本)

Delphi 获取所有窗口标题

Delphi crc算法的实现

rightstr 返回字符串右边指定个数的新字符(串)

Delphi xe可执行文件上启用dep和aslr

Delphi的tclientsocket组件和tserversocket组件(c/s)说明

Delphi tfile

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...