環境: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(注銷/重新登錄)一次使之生效。
本文配套源碼