UAC(User 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