UAC(User Access Control)操作小結(C++)


UACUser Access Control)操作小結(C++

  這幾天因為要監控office2013的安裝進程,但是office2013安裝程序在輸入序列號之后,它會在用戶的temp文件夾(臨時文件夾)里生成一個新的安裝程序,然后終止正在運行的安裝程序,去啟動temp文件夾里的安裝程序。問題就出在啟動temp文件夾的安裝程序,它會跳UAC窗口,直接導致我根本無法直接對之后的安裝程序進行監控。所以研究了一下如何操作UAC。下面我來說說我的研究小結。

  首先來介紹一下UAC窗口的進程。UAC的進程名叫“consent.exe”,這個進程跟notepad一樣也在system32目錄下。每當有一個程序啟動且權限不足時,都會在consent.exe進程下生成一個對應線程。

  不過consent.exe進程和notepad.exe進程的訪問權限不一樣,如果你想訪問以得到consent.exe進程的信息(如句柄,PID等),必須以管理員權限啟動你的程序,才能訪問它。否則無權對其訪問。

接下來說說,如何繞過UAC(C++):

方法一:設置工程屬性

  工程屬性的→鏈接器→文件清單→跳過UAC UI保護→是(uiAccess=true),這樣設置以后,必須重新編譯工程。而且當按下F5運行時,VS會提示必須以管理員模式運行,你選擇了以管理員模式運行之后,VS會自動重啟。當你再次按下F5運行時,VS報錯了。VS提示說無法打開你編譯好的exe程序,那是因為設置了uiAccess=true后,要求程序都必須以管理員模式運行。然后我們右擊打開編譯好的exe,選擇屬性,然后勾選管理員模式選項。之后再按下F5就可以正常運行程序,而起程序啟動其它程序時,也不會再跳出UAC窗口了,當然前提是你必須讓啟動的程序繼承權限。

方法二:采用ShellExecuteEx啟動程序,並設置相應參數

ShellExecuteEx函數是微軟在推出UAC后擴展的一個函數。這個函數的參數是結構體SHELLEXECUTEINFO。這個結構體有一個成員叫lpVerb,將其設置為“runas”。程序就可以跳過UAC,不過前提也是你的程序具有管理員權限。

代碼如下:

       // Initialize the structure.

              SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };

              // Ask for privileges elevation.

              sei.lpVerb = TEXT("runas");

              // Create a Command Prompt fromwhich you will be able to start

              // other elevated applications.

              sei.lpFile = TEXT("E:\\Program Files\\Microsoft Office\\Office15\\FIRSTRUN.EXE");

              sei.lpParameters = TEXT("/OEMPIPC");

              // Don't forget this parameter; otherwise, the window will be hidden.

              sei.nShow = SW_SHOWNORMAL;

          ShellExecuteEx(&sei);

    除了以上2中方法之外,微軟還提供3個類來操作UAC。這3個類是EnableUAC、UACExecutionLevel 和 UACUIAccess。

  詳見http://msdn.microsoft.com/zh-cn/library/bb384691.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM