环境:VC6 SP5,VS 2005,Win2k+,Platform SDK
为了在另一个用户上下文中启动程序,Win2k 提供了一个命令行程序工具——RunAs。在网上(如www.codeguru.com)也能找到同样功能的程序和代码。有人要求我为这个工具做一个图形用户界面的版本。本文就是为此而写的。为了不“重新发明轮子”,我的工作是基于前人的基础 来实现的。
本文程序具有良好的图形用户界面,免得你在命令行输入太多的参数,如图所示:
除此之外,你还可以:
在界面中选择目标桌面,在这个目标桌面上运行你想要的程序。我提供了一个桌面列表供选择,双击即可;
密码编辑框左边的按钮用来检查用户名/密码是否正确;
使用用户名右边的按钮可以从本地机器的用户名列表中选择用户,双击即可;
CreateProcessAsUser 和LogonUser 需要如下四个特权:
SeIncreaseQuotaPrivilege;
SeAssignPrimaryTokenPrivilege;
SeChangeNotifyPrivilege;
SeTcbPrivilege;
默认情况下,管理员不需要这些特权。你可以按对话框底下的 Privilege 按钮,在弹出的对话框中选择启用这些特权(只需要做一次重新注销,重新登陆即可)。如果你不喜欢这个图形用户界面的程序,请使用 Martyn Brown 提供的控制台命令行程序——CmdAsUser。
如果不输入用户名和密码,程序将以“SYSTEM”账号启动。
有一个常用程序的清单,你可以选择作为“RunAs”的程序,其内部代码使用LSA 系列 API来处理账号特权,使用LogonUser 和CreateProcessAsUser 完成工作。当你要求以“SYSTEM”账号启动时,要稍微费一些事情——打开系统进程,通过添加 TOKEN_DUPLICATE、TOKEN_ASSIGN_PRIMARY、TOKEN_QUERY权限来调整其令牌并重新打开。
最后,感谢《Programming Server-Side Applications for Mircosoft Windows 2000》一书的作者,我的程序框架代码借鉴了本书的例子。
使用说明补充:按“Privilege”确认添加了需要的特权后,一定要RelLog(注销/重新登录)一次使之生效。
本文配套源码