【发布时间】:2014-03-09 14:38:06
【问题描述】:
我在这个问题上花了几天时间,尽管网上有很多不同的例子,但这是一个棘手的问题,我无法让它们在我的场景中工作。
我有一个在本地系统帐户下运行的 Windows 服务。它有一个监听 API 请求的 WCF 端点。当通过 API 告知时,该服务应该在系统会话 (0) 中启动一个新进程,并使用“Worker”帐户凭据。该进程是一个工作人员,它检查队列中的工作并执行它。如果它没有找到工作,它将休眠一段时间并再次检查。如果它确实找到了工作,它会在同一个会话中使用相同的凭据启动一个新进程并完成工作。完成后关闭。
“Worker”是域帐户,是机器上本地管理员组的成员,对可执行文件具有执行权限。该机器与帐户在同一个域中。
问题在于,当服务尝试启动进程时,它会从CreateProcessAsUser 方法中获得ERROR_ACCESS_DENIED (5) 错误代码。
我尝试在具有相同凭据的 Windows 7 机器上运行相同的代码,它工作正常,但在 Windows Server 2008 上运行时会收到该错误代码。
代码太大,这里无法展示,所以我把它放在了别处……
ProcessHelper:http://pastie.org/private/y7idu3nw4xv1fxzeizbn9g
服务调用StartAsUserFromService方法启动进程,建立会话后内部调用CreateProcessAsUser。该进程调用StartAsUserFromApplication方法来启动它的后继进程,它内部调用CreateProcessWithLogonW。
ImpersonationContext:http://pastie.org/private/xppc7wnoidajmpq8h8sg
服务需要获取用户令牌才能以他们的身份启动进程。该过程不需要它来启动其继任者。据我所知,模拟在 Server 2008 上是成功的,但它没有一些权限,我不知道是哪个。
编辑:
我在 Windows 7 机器上尝试了本地管理员帐户和域帐户,它们工作正常。但是它们都不能在 Server 2008 机器上工作。一定是某处缺少权限,但我不知道在哪里;错误消息没有帮助。
我也尝试在可执行文件的兼容性选项卡中勾选“以管理员身份运行”框,但没有任何区别。
编辑:
我使用进程监视器来查看服务中发生了什么,这就是它得到错误的地方......
Date & Time: 12/02/2014 11:44:03
Event Class: File System
Operation: CreateFile
Result: ACCESS DENIED
Path: D:\..\executable.exe
TID: 6244
Duration: 0.0000450
Desired Access: Read Data/List Directory, Execute/Traverse, Read Attributes, Synchronize
Disposition: Open
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: n/a
ShareMode: Read, Delete
AllocationSize: n/a
Impersonating: Domain\Worker
和
Date & Time: 12/02/2014 11:44:03
Event Class: File System
Operation: CreateFile
Result: ACCESS DENIED
Path: D:\..\executable.exe
TID: 6244
Duration: 0.0000480
Desired Access: Execute/Traverse, Synchronize
Disposition: Open
Options: Synchronous IO Non-Alert, Non-Directory File
Attributes: n/a
ShareMode: Read, Delete
AllocationSize: n/a
Impersonating: Domain\Worker
【问题讨论】:
-
域用户是否有作为服务登录的权限? technet.microsoft.com/en-us/library/cc739424(v=ws.10).aspx
-
@David 是的。即使它不应该需要它们,因为我没有使用
LogonType.Service将流程作为服务启动。我以LogonType.Interactive开头。 -
哦,我真傻。这是我问的一个愚蠢的问题。对不起。
-
@David 没关系,我愿意测试任何想法。我还尝试在服务管理器中勾选“允许服务与桌面交互”框,但没有帮助。进程/用户帐户是否有类似的权限?
-
您不希望您的服务与桌面交互。而且您可能不希望它在 LocalSystem 下运行。安全日志是否报告您登录失败的原因?