2010-01-28 60 views
2

如何檢測可執行文件是否需要UAC提升? 到目前爲止,我來到了兩種觀點:可執行文件的圖標 圖像識別檢查,如果UAC盾牌圖標是從維基百科 和信息: http://en.wikipedia.org/wiki/User_Account_Control如何檢測可執行文件是否需要UAC提升(C#pref)

有可能以編程方式檢測如果可執行文件將需要提升通過使用CreateProcess()並將dwCreationFlags參數設置爲CREATE_SUSPENDED。如果需要提升,則會返回ERROR_ELEVATION_REQUIRED。[16]如果不需要提升,那麼將返回成功的返回碼,在此時您可以在新創建的掛起的進程上使用TerminateProcess()。如果您已經在升級過程中執行,這將不允許您檢測到可執行文件需要提升。

感謝

+4

請注意,Windows資源管理器會將屏蔽圖標疊加到可執行文件的自身圖標上,因此實際上將圖標從可執行文件中提取出來並檢查它不起作用。 (另外,這可能不是一個好方法......) – cdhowie 2010-11-14 07:05:38

+0

爲什麼你需要這樣做?你能給更多的上下文嗎?您通常不需要關心進度是否需要提升,因爲操作系統會爲您提供幫助。抓住所有的情況也幾乎是不可能的。 (例如,進程本身可能在沒有UAC的情況下啓動,然後根據命令行,在啓動過程中手動升高COM對象。如果不編寫CPU和Windows仿真器,則無法預知它是否會執行此操作:)。 – 2010-11-14 09:55:27

回答

3

嘗試使用kernel32.dll導出的CheckElevation函數。這是一個完全無證功能,但這裏是我已經能夠進行反向工程:

ULONG CheckElevation(
    __in PWSTR FileName, 
    __inout PULONG Flags, // Have a ULONG set to 0, and pass a pointer to it 
    __in_opt HANDLE TokenHandle, // Use NULL 
    __out_opt PULONG Output1, // On output, is 2 or less. 
    __out_opt PULONG Output2 
    ); 

你必須做一些實驗,以瞭解如何正確地調用該函數。到目前爲止我能夠解決的問題是,如果Output1不是0,則需要提升。

+0

建議在未來的Win版本中可能不再提供的未公開的函數是沒有用的,可能會改變簽名或改變行爲。我會用幸運而不是知識來稱呼這一發展。 – zett42 2017-04-08 21:36:24

3

你爲什麼要使用圖片識別,如果它可以通過編程檢查?您可以使用P/invoke通過所需的參數調用CreateProcess

0

最好的方法是解析它的PE格式,然後知道它的清單文件是否需要UAC。

http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+KennyKerr+(Kenny+Kerr)

不知道如何肯尼編寫的代碼,但它顯示的可能性。

+0

這並不包括所有情況。 Windows自動需要提升安裝程序而無需清單。 – kichik 2010-11-14 07:40:01

+0

沒有公開信息可供您瞭解UAC如何檢查安裝程序。 http://technet.microsoft.com/en-us/library/cc709628%28WS.10%29.aspx我想你已閱讀其「安裝程序檢測技術」部分。這都是微軟提供的。 – 2010-11-14 08:04:01

+0

這和kernel32.dll的反彙編:) – kichik 2010-11-14 08:25:53

相關問題