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谢谢,我调整了答案以包含此输入。