服务中的CreateProcessWithLogonw返回代码5:访问被拒绝

时间:2012-11-29 13:09:32

标签: delphi winapi windows-services

我有一个带有StartType = stSystem的Windows服务。

它使用CreateProcessWithLogonW执行应用程序。

 usr := 'myuser';
 dmn := 'mydomain';
 pwd := 'thepassword';
 cmd := 'c:\myapp.exe -calculate';
 wdir := 'c:\';

 fillchar(si, sizeof(si), 0);
 si.cb := sizeof(si);

 if not CreateProcessWithLogon(
           PWideChar(usr),
           PWideCharOf(dmn),
           PWideChar(pwd),
           LOGON_WITH_PROFILE,
           nil,
           PWideChar(cmd),
           NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
           nil,
           PWideChar(wdir),
           si,
           pi
         )
        then
          RaiseLastOSError; // raises Code 5: Access Denied

在服务之外运行此代码,一切顺利!

为什么CreateProcessWithLogon引发系统错误代码5:访问被拒绝?


这可能是原因吗?

MSDN article on CreateProcessWithLogonW说:

  

Windows XP SP2和Windows Server 2003:您无法从LocalSystem帐户下运行的进程调用CreateProcessWithLogonW,因为该函数使用调用者令牌中的登录SID,而LocalSystem帐户的令牌不包含此SID。或者,使用CreateProcessAsUser和LogonUser函数。

我正在使用Windows 7 PRO x64

2 个答案:

答案 0 :(得分:2)

您正在 LocalSystem 帐户下运行该服务,并且the documentation清楚地说:

  

您无法从 LocalSystem 帐户下运行的进程调用CreateProcessWithLogonW,因为该函数使用调用方标记中的登录SID,而LocalSystem帐户的标记不包含此SID。

因此,要么更改服务运行的用户帐户,要么切换到CreateProcessAsUser(),就像文档说的那样。

答案 1 :(得分:0)

LocalSystem帐户应该有足够的权限来读取和执行本地系统上的任何程序(除非你遇到特定的麻烦否认它访问某些东西)。鉴于此,我猜测你正在执行的程序可能存在于其他计算机上。这会导致失败的原因是因为LocalSystem没有网络标识,并且通常无法访问远程共享。您是否可以检查该程序是否肯定驻留在本地驱动器上,而不是网络共享(可能被映射驱动器屏蔽)?

如果这不是问题,我会尝试使用ProcMon来调试问题。这将显示系统上的所有文件和注册表活动,包括成功访问和失败。如果你运行它然后重现问题,我希望你会看到一个带有ACCESS DENIED结果的条目,这应该指向你的原因。您可以使用过滤功能将输出限制为服务进程和产生的进程。如果您在Vista / 2008或更高版本上运行,则需要以提升的权限运行ProcMon。

您还可以检查Windows事件日志,尤其是安全日志。如果尚未启用,则可能需要enable audit logging;我将启用"审核对象访问","审核登录事件","审核帐户登录事件"和"审核权限使用",包括成功与失败。根据我的经验,这些更改可能需要一段时间才能生效,因此如果您不开始查看日志,则可能会重新启动测试系统。一旦日志记录正常,请重试CreateProcessWithLogon并查看显示的事件。您还可以将事情发生时生成的一系列事件与事情不起作用的一系列事件进行比较,这可能有助于显示错误。

相关问题