从windows-2008-server中的服务创建非零会话中的进程?

时间:2010-02-10 14:59:45

标签: windows-server-2008 winlogon createprocessasuser session-0-isolation

我想知道服务是否有一种简单的方法可以在用户会话中创建进程?

我的服务作为用户(管理员)帐户运行,而不是作为LocalSystem帐户运行,因此我无法使用WTSQueryUserToken函数。

我试过打电话

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

但是当我使用此令牌运行

 CreateProcessAsUser(TokenHandle,.....)

我的进程仍在会话0中运行。 我该如何解决这个问题呢?

我正在使用Ole自动化,因此我并不关心进程将在哪个会话上运行,只要它不是会话0 - 因为Ole由于某种原因不会创建其进程(winword)例如.exe)在会话0中,而是在其他用户会话中创建它们。

欢迎任何建议。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

我自己已经能够解决这个问题,感谢所有看过这个问题的人。

好的,正如我上面提到的 - 令牌属于在会话0中运行的进程......

所以我所做的...寻找一个没有在会话0中运行的进程的标记。 当你把它的进程id作为OpenProcessToken的参数时。 而CreateProcessAsUser将在同一个会话中创建进程(并且可能与您选择的进程具有相同的cridentals);

问题是我无法使用函数获取大多数进程的任何细节:QueryFullProcessImageName - 因为它有一个bug,并且它不适用于从包含空格的路径创建的proccesses(例如C:\ Program files) 我想这个函数的另一个问题是,因为我使用用户cridentals运行原始进程,所以我无法访问使用本地系统帐户运行的进程的信息。这是非常糟糕的,因为我想把winlogon.exe作为我的进程(因为它表明一个新的打开会话)。

同样为了成功完成这个技巧,你必须对系统的安全性稍作一点,以便让进程要求提高安全性: 我选择提升的是: SeDebugPrivilege - 用于查找有关正在运行的进程的信息 SeAssignPrimaryTokenPrivilege - 为了使用从用户会话进程中提取的令牌(即explorer.exe)运行新进程 SeCreateTokenPrivilege - 我不知道是否需要,但我还是做了,因为它听起来很相关。

为了成功提升此权限,您必须将运行该流程的用户添加到run-> gpedit.msc或run-> secpol.msc(在本地计算机下)的所有权限中的相关用户Policy \ Computer Configuration \ Windows Settings \ Security settings \ LocalPolicies \ User Rights Assignments)

将您的帐户添加到以下权限(与上述Previleges相比):
创建一个令牌对象
调试程序
替换进程级别标记

就是这样! :) 它一直很好用! 顺便说一句,你可能想要禁用所有UAC的东西...我不知道它是否相关,但它使得2008年的工作减少了痛苦 - 没有更烦人的弹出窗口。