2

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

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

我试过打电话

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

但是当我使用这个令牌运行时

 CreateProcessAsUser(TokenHandle,.....)

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

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

任何建议都将受到欢迎。提前致谢。

4

1 回答 1

1

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

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

所以我所做的……是寻找未在会话 0 中运行的进程的令牌。当您将其进程 ID 作为 OpenProcessToken 的参数时。比 CreateProcessAsUser 将在同一个会话中创建进程(并且可能与您选择的进程具有相同的凭据);

问题是我无法获得使用该函数的大多数进程的任何详细信息:QueryFullProcessImageName - 因为它有一个错误,并且它不适用于从包含空格的路径创建的进程(如 C: \Program 文件)和我猜该功能的另一个问题是,因为我正在使用用户凭据运行原始进程,所以我无法访问使用本地系统帐户运行的进程的信息。这很糟糕,因为我想将 winlogon.exe 作为我的进程(因为它表示新打开的会话)。

同样为了成功使用该技巧,您必须对系统的安全性进行一些尝试,以允许该过程要求提升安全性:我选择提升的目​​的是:SeDebugPrivilege - 用于查找有关正在运行的进程 SeAssignPrimaryTokenPrivilege - 为了使用我从用户会话进程(即 explorer.exe)中提取的令牌运行新进程 SeCreateTokenPrivilege - 我不知道是否需要它,但我还是这样做了,因为它听起来很相关。

为了成功提升此权限 - 您必须在 run->gpedit.msc 或 run->secpol.msc (在本地计算机策略\计算机配置\ Windows 设置\安全设置\LocalPolicies\用户权限分配)

将您的帐户添加到以下权限(与上述权限兼容):
创建令牌对象
调试程序
替换进程级别令牌

就是这样!:) 它一直在工作 顺便说一句,您可能想要禁用所有 UAC 的东西...我不知道它是否相关,但它使 2008 的工作变得不那么痛苦 - 不再有烦人的弹出窗口。

于 2010-02-10T23:13:21.520 回答