2

我想知道是否有一种简单的方式让服务在用户会话中创建一个进程?从windows-2008-server中的服务在非零会话中创建进程?

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

我已经打过电话

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle); 

但是当我使用此令牌运行

CreateProcessAsUser(TokenHandle,.....) 

我的过程是在会话0 仍在运行,如何解决这个问题呢?

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

任何建议将受到欢迎。 在此先感谢。

回答

1

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

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

所以我做了什么?是找了一个过程的一个标志,是不是在会话0中运行。 当您将其进程ID作为OpenProcessToken的参数时。 比CreateProcessAsUser会在同一会话中创建进程(并且可能与您选择的进程具有相同的混合物);

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

也是为了在招succeeed,你必须发挥一点点与系统的安全性,为了让这个进程要求提高安全性: 什么我都选择得到提高的是: SeDebugPrivilege - 用于查找有关正在运行的进程的信息 SeAssignPrimaryTokenPrivilege - 为了使用从用户会话进程中提取的令牌运行新进程(即explorer.exe) SeCreateTokenPrivilege - 我不知道是否需要,但是我做到了因为它听起来有关系。

为了成功提升此权限 - 您必须将在run-> gpedit.msc或run-> secpol中运行此进程的用户添加到所有此权限中的相关用户。MSC(本地计算机策略\计算机配置\ Windows设置\安全设置\ LocalPolicies \用户权限分配)

您的帐户添加到以下权利(compaitable与上面的Previleges):
创建令牌对象
调试程序
替换进程级别令牌

就是这样! :) 它一直在努力! 顺便说一句,你可能想禁用所有的UAC的东西......我不知道它是否与之相关,但它使2008年的工作不那么痛苦 - 没有更多恼人的弹出窗口。

+0

感谢您在这个问题上的辛勤工作。当然,W7 Home Premium用户将无法使用这些设置,因为该版本缺少这些管理单元。我仍然在寻求解决方案,以便在作为服务运行时使[链接] http://synergy-foss.org剪贴板正常工作。 – Barton 2012-05-13 20:08:03