模拟时在Windows会话用户下启动进程

时间:2014-08-22 22:30:39

标签: c# impersonation

我有一个可以使用进程模拟运行的桌面应用程序(不是服务)。我通过使用一个单独的应用程序来实现这一点,该应用程序用作启动器,并使用CreateProcessWithLogonW在不同的用户下运行应用程序。在用户注销应用程序后,我需要弄清楚如何使应用程序在Windows会话用户的凭据下运行启动程序进程而不提示输入密码。

我目前的策略是:

  1. 使用ProcessIdToSessionId从应用程序进程获取会话ID。
  2. 使用WTSQueryUserToken从会话ID中获取主要用户令牌。
  3. 将DuplicateTokenEx用于我不太清楚的事情。
  4. 使用CreateProcessAsUser运行该过程。
  5. 目前,WTSQueryUserToken失败,结果为ERROR_PRIVILEGE_NOT_HELD(http://msdn.microsoft.com/en-us/library/aa383840(v=vs.85).aspx)。我可以通过不同的方式获得该令牌吗?还有另一种策略可以完全适用于此吗?

    另外,我使用的是C#,而且是P / Invokes的新手。感谢

1 个答案:

答案 0 :(得分:0)

在这种情况下,您无法使用WTSQuerUserToken。

来自http://msdn.microsoft.com/en-us/library/aa383840(v=vs.85).aspx

"要成功调用此函数,调用应用程序必须在LocalSystem帐户的上下文中运行并具有SE_TCB_NAME权限。"

我仍然不知道你有多少exe,以及有多少进程正在执行,更重要的是为什么。也许你可以更详细地解释一下?

如果原始启动器仍在运行,则可能更容易向其发送消息并告诉它执行操作而不是从您的模拟过程启动另一个启动器。