delphi 写的windows服务 安装成功 开启时失败 权限问题?

鸟类学 2016-10-26 04:37:54
用delphi写了一个windows服务程序A,然后另一个应用程序B来控制(安装 ,启动,停止,卸载等)出现了问题。
表现如下:
1 如果以管理员在cmd 模式下安装与启动 服务A 都没有问题
2 如果用B来控制 服务A "安装服务"是成功的,但是"启动失败" 错误代码是5,查了一下是权限问题 ,但是我前面的OpenSCManager,OpenService都给了最高权限,只是在StartService这步失败 。。
3 我以管理的身份来运行B来控制服务A同样 安装服务成功,启动服务失败 。。
4 如果我用B来安装服务A,但以管理员在cmd 模式下来是失败 显示错误代码5 ,我建立服务时给的是SERVICE_ALL_ACCESS啊

下面是我的代码

//开启服务
function StartServices(Const SvrName: String): Boolean;
var
a,b:SC_HANDLE;
c:PChar;
cErrCode :Cardinal;
begin
Result:=False;

a:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS{STANDARD_RIGHTS_EXECUTE});

if a <=0 then Exit;

b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS{SERVICE_START});

if b <=0 then Exit;
try
c := nil;
Result:=StartService(b,0,c);
CloseServiceHandle(b);
CloseServiceHandle(a);
cErrCode := GetLastError ;
if not Result and (cErrCode = ERROR_SERVICE_ALREADY_RUNNING) then
Result := True;
except
CloseServiceHandle(b);
CloseServiceHandle(a);
Exit;
end;
end;

{建立服务}
function CreateServices(Const SvrName,FilePath: String): Boolean;
var
a,b:SC_HANDLE;
Service: THandle;
begin
Result:=False;
if FilePath ='' then Exit;

a := OpenSCManager(nil,nil,{SC_MANAGER_CREATE_SERVICE}SC_MANAGER_ALL_ACCESS);

if a <= 0 then Exit;
try
Service := OpenService(a, PChar(SvrName), SERVICE_ALL_ACCESS);
if Service = 0 then
begin
b := CreateService(a,PChar(SvrName),
PChar(SvrName),
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
PChar(FilePath),nil,nil,nil,nil,nil);
if b <= 0 then
begin
ShowMessage( SysErrorMessage( GetlastError ));
Exit;
end;
end;

CloseServiceHandle(a);
CloseServiceHandle(b);

Result := True;
except
CloseServiceHandle(a);
CloseServiceHandle(b);
Exit;
end;
end;


是不是要提升当前进程的权限? 大家帮我一下,谢谢
...全文
1211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wen226 2017-12-13
  • 打赏
  • 举报
回复
这个问题怎么解决了,我现在也是和你遇到同样的问题。
鸟类学 2016-10-31
  • 打赏
  • 举报
回复
恩 是服务的exe有问题,改一下就好了,控制服务的代码没有问题。谢谢大家。
鸟类学 2016-10-28
  • 打赏
  • 举报
回复

procedure TService28.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Collector :=TCollectorThread.Create(False);
  Collector.FreeOnTerminate := True;
  Started := True;
end;

procedure TService28.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    Sleep(10);
    ServiceThread.ProcessRequests(False);
  end;
end
又改了一下还是不行。
鸟类学 2016-10-27
  • 打赏
  • 举报
回复
引用 1 楼 kiboisme 的回复:
代码没问题, XP,Win7,Win10都可以啊 被杀毒/防火墙软件等软件拦截了?
电脑没启动任何杀毒软件,你在xp win7 win10试过可以?我的win7 用户为管理员,创建服务可以 但没法启动。。在cmd 模式下可以安装并启动,但用上面的代码就无法启动。我找了几提升权限的函数调用也还是一样。。。。
鸟类学 2016-10-27
  • 打赏
  • 举报
回复
引用 7 楼 kiboisme 的回复:
我的代码和你的类似,从XP用到Win10,都可以 如更没有防火墙,初步怀疑你的Exe文件的访问权限有问题,检查Exe以及Exe所在目录的权限,System不能访问?或者该服务指定的启动用户无法访问Exe文件
我改了一下我的服务的exe程序代码,现在不报5 权限错误 ,而报的1053:The service did not respond to the start or control request in a timely fashion(服务没有及时响应控制) 同样cmd模式下可以正常启动,代码就报这个错误,我想应该是我的具体服务的exe代码的问题。但为什么cmd是可以正常启动 执行起来的功能也正常的呢,代码控制就不行??

procedure TService28.ServiceStart(Sender: TService; var Started: Boolean);
begin
  Started := True;
end;

procedure TService28.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Collector.Terminate;
  Stopped := True;
end;

procedure TService28.ServicePause(Sender: TService; var Paused: Boolean);
begin
  Collector.Suspend;
  Paused := True;
end;

procedure TService28.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  Collector.Resume;
  Continued := True;
end;


procedure TService28.ServiceExecute(Sender: TService);
var
 
begin

  while True do
  begin
    if......
    begin
       Collector :=TCollectorThread.Create(False);
       Collector.FreeOnTerminate := True;
    end;
  end;
end;
这样做有问题吗
lyhoo163 2016-10-27
  • 打赏
  • 举报
回复
1、权限受到限制。 2、杀毒软件的制约。
蓝色光芒 2016-10-27
  • 打赏
  • 举报
回复
我的代码和你的类似,从XP用到Win10,都可以 如更没有防火墙,初步怀疑你的Exe文件的访问权限有问题,检查Exe以及Exe所在目录的权限,System不能访问?或者该服务指定的启动用户无法访问Exe文件
  • 打赏
  • 举报
回复
b:=OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS{SERVICE_START}); if b = 0 then Exit; try c := nil; Result:=StartService(b,0,c); cErrCode := GetLastError ; CloseServiceHandle(b); CloseServiceHandle(a);
鸟类学 2016-10-27
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
可以试试: Result:=StartService(b,0,c); SleepEx(300, false); CloseServiceHandle(b); CloseServiceHandle(a);
不行
  • 打赏
  • 举报
回复
可以试试: Result:=StartService(b,0,c); SleepEx(300, false); CloseServiceHandle(b); CloseServiceHandle(a);
蓝色光芒 2016-10-26
  • 打赏
  • 举报
回复
代码没问题, XP,Win7,Win10都可以啊 被杀毒/防火墙软件等软件拦截了?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧