Vfp 調用 API 實現 RunAs 功能

下面是回答狐狸天堂中的一位網友提問時寫的代碼,他的情況是:正常情況下,所有機器都是以受限用戶登錄的,而他的程序需要自動註冊一些 ActiveX 控件,由於機器數量比較多,雖然可以手工切換到管理員來完成安裝,但以後增加功能時加入新的控件或重裝系統時都需要手工切換,所以他希望他的程序可以在受限用戶的權限下也能正常運行;也就是說,程序啓動時,可以從一個加密文件中取出管理員口令,臨時以管理員身份調用 regsvr32 自動註冊這些控件。雖然你也可以直接用 run 命令調用操作系統提供的 runas 來實現同樣的功能,但那樣做你無法知道 runas 運行是否成功。

這裏我們不管他準備採用什麼策略來獲取管理員口令,只用實現在知道口令後切換用戶來完成註冊的函數:

以上的代碼完成了:切換用戶,以切換後的用戶權限創建一個新進程,在新進程中加載並運行指定的命令或應用程序,如果切換或加載過程中發生錯誤,返回 Windows 的錯誤代碼;否則,等待命令或應用程序執行完畢,返回它的退出碼。

按照通常的規則,一個命令或應用程序在它正常結束時的退出碼爲 0,發生錯誤時返回非 0 值,但這個退出碼的含義並無強制性規定,對於 regsvr32 這個特定的程序,它使用了與 api 錯誤代碼一致的規則,所以可以在調用 CreateProcessWithLogonW 失敗時直接返回 GetLastError() 的值,這樣調用者可以在執行 RunAs 後用一致的代碼來處理錯誤。但是,這個 RunAs 並非只爲調用 regsvr32 編寫,所以情況不會總是這樣,很多應用程序沒有遵循 Windows 錯誤代碼規則來指示結束後的退出碼;退出碼的具體含義需要參照該程序的文檔(如果有提供的話)。

寫完這些後,想到可能還需要一個功能,就是指定是否隱藏運行時的窗口,對於 Windows 程序意義不大,但如果要執行的是一個 DOS 16位命令行程序,可能就會需要了,很多人都討厭那個黑色的 DOS 窗口。不過這個也不難,RunAs 最後增加一個參數用於指定是否隱藏窗口,構造 lcSI 結構參數時爲 dwFlags 成員指定 STARTF_USESHOWWINDOW 標誌並設置合適的 wShowWindow 成員即可。

 

 


-------------------------------------------------------------------------------------
回覆提問用截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章