如何使用Windows上的其他用户帐户创建新进程?

问题描述:

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

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

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

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

+1

不错的想法,但这不起作用,因为你无法将密码传递给runas.exe。密码必须由用户输入。如果重定向进程输入,runas会以错误结束。 – Horcrux7 2008-12-15 13:42:48

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

例在http://www.rgagnon.com/javadetails/java-0014.html(末)

根据您的需求在Win32 API “CreateProcessWithLogonW” 更容易比 “CreateProcessAsUser/LogonUser的” 功能使用。

从MSDN文档:

 
The CreateProcessWithLogonW and CreateProcessWithTokenW functions are 
similar to the CreateProcessAsUser function, except that the caller 
does not need to call the LogonUser function to authenticate the user 
and get a token 

我对面的替代runas.exe程序调用MiniRunAs将于密码在命令行中运行 - http://www.source-code.biz/snippets/c/1.htm

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