2013-02-13 62 views
2

我有一个在Windows XP及以下版本上作为LocalSystem运行的进程。我试图找到一种方法让它启动另一个进程来冒充另一个用户而不需要必须提供用户密码。在Windows上假冒用户为LocalSystem

原则上这应该是可能的,因为LocalSystem有权“作为操作系统的一部分行事”。但我无法找到正确的API。

有人能告诉我如何做到这一点无论是:

  • 与API,或从一个批处理文件

回答

2

您可以先通过WTSQueryUserToken获取用户的令牌,然后调用CreateProcessAsUser来启动该过程。请注意,您只能为当前登录系统的用户执行此操作。

+0

太好了,谢谢。为了验证,我将使用带有“\\。\”的WTSOpenServer来获取当前机器的句柄,WTSEnumerateSessions获取可用的会话ID,WTSQueryUserToken为其中一个会话获取用户令牌,并使用CreateProcessAsUser启动该过程? – ARF 2013-02-13 15:10:35

+1

@ArikRaffaelFunke你可以简单地调用'WTSGetActiveConsoleSessionId'获取活动的会话ID。另外,不要忘记通过调用'DuplicateTokenEx'来复制令牌。 – JosephH 2013-02-13 15:27:19

+0

+1。为了扩大这一点:理论上可能(但可能相当困难)为未登录的用户做同样的事情,尽管最终的过程无法访问任何加密的数据或通过网络。我相信你会通过注册为SSP/AP并使用CreateTokenEx和相关函数来实现这一点,但我从未尝试过,因此我不知道可能遇到什么样的问题。 – 2013-02-13 22:35:15