Delphi 2009在创建服务(仅限于Windows 2008 R2)时崩溃

4

我有以下代码,在所有操作系统(32位和64位)上都可以正常运行,但在Windows 2008 R2(SP0和SP1)上无法正常运行。

fSvcMgr := OpenSCManagerW(PwideChar(FOptions.ComputerName), nil,
      SC_MANAGER_ALL_ACCESS);
    if fSvcMgr = 0 then
    begin
      iserror := true;
      RaiseLastWin32Error;
    end;
...
fSvc := OpenServiceW(fSvcMgr, pwidechar(Service_name),SERVICE_ALL_ACCESS);
if fSvc = 0 then
begin
  fSvc := CreateServiceW(fSvcMgr,
          pwidechar(Service_name),
          pwidechar(Service_name),
          SERVICE_ALL_ACCESS, 
          SERVICE_WIN32_OWN_PROCESS,
          SERVICE_DEMAND_START,
          SERVICE_ERROR_IGNORE,
          pwidechar(fServiceName), nil, nil, nil, nil, nil);
  if fSvc = 0 then
  begin
     iserror := true;
     RaiseLastWin32Error;
  end;
end;

当连接到远程32位计算机时会出现以下情况:

在调试 Delphi 时,创建服务(CreateserviceW)行会导致崩溃,并显示消息“应用程序定义的异常(代码 0x000006d1)于... 进程已停止。在 CreateserviceW 周围使用 try/except 并没有任何区别。

当连接到远程64位计算机时,一切正常!


你确定 scm 的句柄是有效的吗?请展示更多的代码… - Remko
句柄有效,已添加额外代码。 - WilfriedVS
我已经找到问题所在:在代码的其他地方,我使用了“ADsEnumerateNext”,但没有使用“ADsFreeEnumerator”,这从未引起过任何问题,除了这个特定情况(仅在win2008R2中),我是偶然发现了这个问题。 - WilfriedVS
2个回答

0

这个错误在Microsoft SBS Server 2011上也很明显。

你遇到的问题似乎是基于权限的,你没有以具有正确权限的用户的范围运行应用程序。

您是否尝试向应用程序添加清单以确保其正确提升,在测试目的中,您可能希望使用管理员凭据编译应用程序(调用者)并运行。

需要注意的是,Microsoft Windows 2008和2011存在范围限制,因此您不能与低于或高于自己的进程或服务进行交互。这种安全功能已经引起了许多头痛。

因此,如果您拥有权限,请尝试不使用权限。


谢谢,但我已经尝试过启用和禁用UAC,使用requireAdministrator uac.manifest和不使用(问题是相同的)。 - WilfriedVS
@WilfriendVS - 可以再提供一些代码吗?因为在考虑了UAC的情况后,我无法再现这个问题。 - Reallyethical

0

调用CreateService会生成一个RPC调用,该调用可以是RCreateServiceWRCreateServiceWOW64。RPC调用将返回0x000006d1,它代表RPC_S_PROCNUM_OUT_OF_RANGE,这意味着底层的RPC层失败了(请求的操作号不存在)。这可能是一个错误...


我尝试嵌入来自Windows 7 - 32位的advapi32.dll文件,并从该DLL运行CreateService,但错误仍然存在。这可能与Reallyethical所建议的安全功能有关。 - WilfriedVS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接