我想知道服务是否有一种简单的方法可以在用户会话中创建进程?
我的服务作为用户(管理员)帐户运行,而不是作为LocalSystem帐户运行,因此我无法使用WTSQueryUserToken函数。
我试过打电话
OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);
但是当我使用此令牌运行
时 CreateProcessAsUser(TokenHandle,.....)
我的进程仍在会话0中运行。 我该如何解决这个问题呢?
我正在使用Ole自动化,因此我并不关心进程将在哪个会话上运行,只要它不是会话0 - 因为Ole由于某种原因不会创建其进程(winword)例如.exe)在会话0中,而是在其他用户会话中创建它们。
欢迎任何建议。 提前谢谢。
答案 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年的工作减少了痛苦 - 没有更烦人的弹出窗口。