【问题标题】:Creating a process in a non-zero session from a service in windows-2008-server?从 windows-2008-server 中的服务在非零会话中创建进程?
【发布时间】:2011-01-15 07:30:57
【问题描述】:

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

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

我试过打电话

OpenProcessToken(GetCurrentProcess,TOKEN_ALL_ACCESS,TokenHandle);

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

 CreateProcessAsUser(TokenHandle,.....)

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

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

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

【问题讨论】:

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


    【解决方案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 年的工作变得不那么痛苦 - 不再有烦人的弹出窗口。

    【讨论】:

    • 感谢您在此问题上的辛勤工作。当然,W7 Home Premium 用户将无法伪造这些设置,因为该版本缺少这些插件。我仍在寻找解决方案,以使 [link]synergy-foss.org 剪贴板在作为服务运行时正常工作。
    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2023-03-10
    • 2011-12-11
    • 2011-11-06
    相关资源
    最近更新 更多