在XP時代,大多數用戶都用一個管理員(administrator)帳號來登錄Windows
利用這個賬戶,用戶幾乎能沒有任何限制的訪問重要的系統資源,因為該賬戶被授予了很高的權限,一旦用這個帳號登錄了xp以及xp之前的操作系統,Windows操作系統就會創建一個安全令牌(security token).每當有代碼試圖訪問一個受保護的安全資源的時候,操作系統就會使用(出示)這個安全令牌,
從Windows在內的第一個進程開始,這個令牌會與新建的所有進程關聯,這樣如果新下載了一個惡意程序,就會繼承管理員的高權限,------因此可以肆無忌憚的修改機器上的任何內容,甚至啟動同一個高特權的進程
那么從vista開始,如果用戶使用管理員帳號來登錄這樣一個被授予高特權的賬戶登錄,那么除了與這個賬戶登錄對應的安全令牌之外,還會創建一個進過篩選的令牌(filtered token)后者只給標準用戶的權限(Standard User).以后包括Windows資源管理器在內的第一個進程開始,這個篩選后的令牌會與系統表示最終用戶啟動啟動的所有新進程關聯,權限受限制的進程無法訪問需要更高權限才能訪問的安全資源.
如果 需要管理員權限呢?
-----------------------------------------------------------------------------------------------------------------
首先,我們可以要求操作系統提升權限,但只能是進程邊界提升權限
(1)單擊右鍵 Run As Administrator
如果應用程序是操作系統的一部分? 那么會顯示一個藍色的橫幅
如果引用程序進行了簽名,對話框中將顯示一個灰色的橫幅,表明Windows沒有足夠的把握來確定應用程序是安全了
如果應用程序沒有進行簽名,系統會在對話框中顯示一個橙色的橫幅,并且要求用戶謹慎回答
如果用戶沒有以一個管理員帳號來登錄系統,那么Windows會彈出一個要求用戶輸入管理員權限的帳號密碼,這樣應用程序才能以管理員權限來運行,這被稱為over-the-shoulder登錄
(2)manifest文件
? <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
??? <security>
????? <requestedPrivileges>
??????? <requestedExecutionLevel level="highestAvailable"></requestedExecutionLevel>
????? </requestedPrivileges>
??? </security>
? </trustInfo>
如上?? 被稱為一種特殊的資源RT_MANIFEST特殊資源,將其編譯到exe資源節區中,系統會按照requestedExecutionLevel節來判斷進程的權限,并執行一些操作
requireAdministrator -->應用程序必須以管理員權限啟動,否則不會運行
highestAvailable-->應用程序以當前可用的最高權限運行
??????????????????????? -->如果用戶使用管理員帳號登錄,就會出現一個要求批準提升權限的對話框
??????????????????????? -->如果用戶使用普通用戶賬戶登錄系統,就使用標準權限來啟動
asInvoker???????? -->應用程序以主調應用程序一樣的權限來啟動
(3).還可以在應用程序的屬性對話框中選中對應的復選框
(4)手動提升權限進程的權限
在CreateProcess函數中,沒有專門提供神馬標記參數來指定對這種權限的提升
相反,我們可以調用ShellExecuteEx函數
BOOL ShellExecuteEx(
??? LPSHELLEXECUTEINFO lpExecInfo
);
typedef struct _SHELLEXECUTEINFO{
??? DWORD cbSize;
??? ULONG fMask;
??? HWND hwnd;
??? LPCTSTR lpVerb;
??? LPCTSTR lpFile;
??? LPCTSTR lpParameters;
??? LPCTSTR lpDirectory;
??? int nShow;
??? HINSTANCE hInstApp;
?
??? // Optional members
??? LPVOID lpIDList;
??? LPCSTR lpClass;
??? HKEY hkeyClass;
??? DWORD dwHotKey;
?union {
??HANDLE hIcon;
??HANDLE hMonitor;
?};
??? HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
這個結構體唯一有趣的2個字段是lpVerb和lpFile,前者必須被設置為"runas",后者必須包含使用提升后的權限來啟動的一個可執行文件的路徑,如下代碼:
SHELLEXECUTEINFO sei = {sizeof(SHELLEXECUTEINFO)};
sei.lpVerb = TEXT("runas");
sei.lpFile = TEXT("cmd.exe");
sei.nShow = SW_NORMAL;
if (!ShellExecuteEx(&sei))
{
?DWORD dwStatus = GetLastError();
?if (dwStatus == ERROR_CANCELLED)
?{
??printf("沒有以管理員權限運行");
?}
?else
??if(dwStatus == ERROR_FILE_NOT_FOUND)
?{
??printf("沒有找到該文件");
?}
}
如果用戶拒絕提升權限ShellExecuteEx會返回FALSE,可以通過GetLastError()使用一個ERROR_CANCELLED值來指出這種情況
注意當一個進程使用一個提升后的權限啟動時,它每次使用CreateProcess來生成另一個進程時,子進程都會獲取和它父進程一樣的提升后的權限,假如一個應用程序是使用一個篩選后的令牌來運行的,那么一旦試圖調用CreateProcess來生成一個要求提升權限的可執行文件,這個調用就會失敗,GetLastError會返回ERROR_ELFVATION_REQUIRED
(5)按鈕上顯示一個盾牌圖標
①.首先我們需要解決的事情是獲取當前進程是否以管理員權限運行的.
②.Button_SetElevationRequiredState宏可以幫助我們來設置或者隱藏小盾牌圖標
實質上是:
#define Button_SetElevationRequiredState(hwnd, fRequired) (LRESULT)SNDMSG((hwnd), BCM_SETSHIELD, 0, (LPARAM)fRequired)
SendMessage((hwnd), BCM_SETSHIELD, 0, (LPARAM)fRequired);
SendMessage(hwnd, 0x160C, 0, 0xFFFFFFFF);
③.在按鈕點擊事件中使用ShellExecuteEx,以管理員權限重新調用自己
詳細代碼打包傳網盤? 請猛點擊下面下載 (Win32 SDK)
http://dl.dbank.com/c0rcubga3h
?
?
?
?