我有一个 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: Access Denied ?
这可能是原因吗?
关于 CreateProcessWithLogonW 的 MSDN 文章说:
Windows XP SP2 和 Windows Server 2003:不能从在 LocalSystem 帐户下运行的进程调用 CreateProcessWithLogonW,因为该函数使用调用者令牌中的登录 SID,而 LocalSystem 帐户的令牌不包含此 SID。作为替代方案,使用 CreateProcessAsUser 和 LogonUser 函数。
我正在使用 Windows 7 PRO x64