如何在 Windows 上使用另一个用户帐户创建新进程?

Posted

技术标签:

【中文标题】如何在 Windows 上使用另一个用户帐户创建新进程?【英文标题】:How can I create a new process with another User Account on Windows? 【发布时间】:2010-09-26 14:33:38 【问题描述】:

是否可以使用不同的用户帐户在 Windows 上创建新进程?我知道有一个上下文菜单“运行方式”,但我想用 Java 来做。我有用户名和密码。

【问题讨论】:

【参考方案1】:

我刚刚遇到了一个名为 MiniRunAs 的 runas.exe 程序的替代方案,它将在命令行上获取密码 - http://www.source-code.biz/snippets/c/1.htm

如果您能够将它与您的应用程序一起安装,那可能比编写 JNI DLL 更简单。

【讨论】:

【参考方案2】:

根据您的需要,Win32 API“CreateProcessWithLogonW”比“CreateProcessAsUser / LogonUser”函​​数更易于使用。

来自 MSDN 文档:

CreateProcessWithLogonW 和 CreateProcessWithTokenW 函数是 类似于 CreateProcessAsUser 函数,不同之处在于调用者 不需要调用 LogonUser 函数来验证用户 并获得一个令牌

【讨论】:

是的,但您必须记住:“Windows XP SP2、Windows Server 2003 或更高版本:您不能从在“LocalSystem”帐户下运行的进程调用 CreateProcessWithLogonW,因为该函数使用调用者令牌中的登录 SID,并且“LocalSystem”帐户的令牌不包含此 SID。或者,使用 CreateProcessAsUser 和 LogonUser 函数。"【参考方案3】:

RUNAS 具有“/savecred”开关,可让您仅在第一次输入凭据。一个潜在的问题是,当 /SaveCred 保存凭据时,它会在 RUNAS 调用该用户帐户时保存它。这可能是一个巨大的安全风险,所以要小心使用它!

http://www.rgagnon.com/javadetails/java-0014.html 的示例(最后)

【讨论】:

【参考方案4】:

您需要使用Java Native Interface (JNI) 编写一个 DLL,因为您无法使用纯 Java 代码执行此操作。

DLL 本身需要调用 CreateProcessAsUser 函数来在另一个用户的上下文中创建一个进程。要成功创建该进程,您需要向函数提供访问令牌,该令牌本身是通过调用 LogonUser 函数创建的(它需要用户名和密码来验证其他用户)。

【讨论】:

【参考方案5】:

有一个名为“runas.exe”的程序。您可以运行该进程并为您的进程和用户名/密码提供适当的参数。我认为这是最简单的方法。

【讨论】:

好主意,但这不起作用,因为您无法将密码传递给 runas.exe。密码必须由用户输入。如果您重定向进程输入,则 runas 会因错误而终止。

以上是关于如何在 Windows 上使用另一个用户帐户创建新进程?的主要内容,如果未能解决你的问题,请参考以下文章

outlook2007如何从一个用户迁移到另一个用户

安全标识符

我如何使用一个变量的内容来创建另一个变量的名称? [重复]

怎样在电脑上创建一个新用户

关于创建windows用户的问题

VBS脚本获取安全标识符SID(Security Identifiers)的方法