Delphi:makeservicedelete函数
我想做一个服务删除功能Delphi:makeservicedelete函数,delphi,service,Delphi,Service,我想做一个服务删除功能 Function ServiceDelete(sMachine, sService: String): Boolean; Var schm, schs: SC_Handle; ss: TServiceStatus; dwChkP: dword; Begin Result := False; schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT); If schm > 0
Function ServiceDelete(sMachine, sService: String): Boolean;
Var
schm, schs: SC_Handle;
ss: TServiceStatus;
dwChkP: dword;
Begin
Result := False;
schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
If schm > 0 Then Begin
schs := OpenService(schm, PChar(sService), SERVICE_STOP Or SERVICE_QUERY_STATUS);
If schs > 0 Then Begin
If (QueryServiceStatus(schs, ss)) Then Begin
While (SERVICE_STOPPED <> ss.dwCurrentState) Do Begin
ControlService(schs, SERVICE_CONTROL_STOP, ss);
dwChkP := ss.dwCheckPoint;
Sleep(ss.dwWaitHint);
If (Not QueryServiceStatus(schs, ss)) Then
Break;
If (ss.dwCheckPoint < dwChkP) Then
Break;
End;
End;
DeleteService(schs);
CloseServiceHandle(schs);
End;
CloseServiceHandle(schm);
// If service does not exist, then everything is fine.
schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
If schm > 0 Then Begin
schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);
If schs = 0 Then Begin
If GetLastError = ERROR_SERVICE_DOES_NOT_EXIST Then
Result := True;
End Else Begin
CloseServiceHandle(schs);
End;
CloseServiceHandle(schm);
End;
End;
End;
函数ServiceDelete(sMachine,sService:String):布尔值;
变量
schm,schs:SC_手柄;
ss:服务状态;
dwChkP:dword;
开始
结果:=假;
schm:=OpenSCManager(PChar(sMachine)、Nil、SC_MANAGER_CONNECT);
如果schm>0,则开始
schs:=开放服务(schm、PChar(sService)、服务停止或服务查询状态);
如果schs>0,则开始
如果是(查询服务状态(SCH、ss)),则开始
虽然(服务已停止,ss.dwCurrentState)确实开始
控制服务(schs、服务控制停止、ss);
dwChkP:=ss.dwCheckPoint;
睡眠(ss.dwWaitHint);
如果(不是查询服务状态(SCH、ss)),则
打破
如果(ss.dwCheckPoint0,则开始
schs:=OpenService(schm、PChar(sService)、服务查询状态);
如果schs=0,则开始
如果GetLastError=ERROR\u服务\u不存在,则
结果:=真;
结束,否则开始
关闭服务手柄(schs);
结束;
关闭服务手柄(schm);
结束;
结束;
结束;
它打开服务管理器,打开服务,执行DeleteService,但不删除服务。函数返回false,服务仍然存在。
我做错了什么?根据and,您需要添加标准权利\u REQUIRED=$F0000代码>获取
schs := OpenService(schm, PChar(sService), STANDARD_RIGHTS_REQUIRED or SERVICE_STOP Or SERVICE_QUERY_STATUS);
schs := OpenService(schm, PChar(sService), Winapi.Windows._DELETE or SERVICE_STOP Or SERVICE_QUERY_STATUS);
此外,重要的是要使用管理员权限运行程序,并按照注释中的说明检查每个功能结果是否正常
编辑:
多亏了Remy Lebeau的评论,它有可能进一步缩小范围,只需要标准访问权限Winapi.Windows.\u DELETE=$00010000代码>获取
schs := OpenService(schm, PChar(sService), STANDARD_RIGHTS_REQUIRED or SERVICE_STOP Or SERVICE_QUERY_STATUS);
schs := OpenService(schm, PChar(sService), Winapi.Windows._DELETE or SERVICE_STOP Or SERVICE_QUERY_STATUS);
您似乎没有始终如一地检查错误。为什么不呢?非常感谢。标准权利是解决方案。(我知道管理员权限规则。)完美:)我相应地调整了答案。@trob如果你检查了错误,就会被告知访问被拒绝。我不明白为什么有人会故意忽略错误检查。如果您愿意,系统将帮助您。@ChristianHolmJørgensen:调用DeleteService()
,您不需要STANDARD\u RIGHTS\u REQUIRED
,您只需要DELETE
。在你的答案中,你链接到的两个页面都说明了这一点<代码>所需的标准权限
包括删除
,但也包括读取控制
、写入DAC
、以及写入所有者
,这些在这种情况下是不必要或不需要的<代码>开放服务(schm、PChar(sService)、删除或服务停止或服务查询状态)代码>@RemyLebeau谢谢,我调整了答案以包含此输入。