《Windows核心編程》學習筆記(9)– 在win7或者vista系統下提高一個進程的運行權限

win7或者vista默認運行程序是在受限制的環境下運行的,以減輕病毒對於系統的破壞。那麼咱們怎樣才能提高一個進程的權限以致讓它在

管理員模式下運行。固然CreateProcess函數沒有提供這個功能。相反咱們須要調用的是ShellExecuteEx函數: 

 

BOOL ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo);編程

 

typedef struct _SHELLEXECUTEINFO {函數

  DWORD cbSize;學習

  ULONG fMask;spa

  HWND hwnd;進程

  PCTSTR lpVerb;it

  PCTSTR lpFile;io

  PCTSTR lpParameters;ast

  PCTSTR lpDirectory;List

  int nShow;權限

  HINSTANCE hInstApp;

  PVOID lpIDList;

  PCTSTR lpClass;

  HKEY hkeyClass;

  DWORD dwHotKey;

  union {

     HANDLE hIcon;

     HANDLE hMonitor;

   } DUMMYUNIONNAME;

  HANDLE hProcess;

} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

 

SHELLEXECUTEINFO結構中唯一有趣的字段是lpVerblpFile。前者必須被設爲「runas」,

後者必須包含使用提高後的權限來啓動的一個執行體文件的路徑,如如下代碼段所示:

 

 

#include <Windows.h>

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

{

SHELLEXECUTEINFO lpExecInfo;

lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

lpExecInfo.lpVerb = TEXT("runas");

lpExecInfo.lpFile = TEXT("calc.exe");

lpExecInfo.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&lpExecInfo))

{

if (GetLastError() == ERROR_CANCELLED)

{

MessageBox(NULL, "用戶拒絕提高權限!", "提示", MB_OK | MB_ICONINFORMATION);

return 0;

}

else if (GetLastError() == ERROR_FILE_NOT_FOUND)

{

MessageBox(NULL, "文件沒有找到!", "提示", MB_OK | MB_ICONINFORMATION);

return 0;

}

}

return 0;

}

 

 

此段代碼在win7系統下運行的時候會提示計算器程序要求提高爲管理員權限運行,相似的窗口爲:

《Windows核心編程》學習筆記(9)– 在win7或者vista系統下提高一個進程的運行權限 - fly - 飛晴編程小屋

 

 

若是用戶拒絕提高權限,ShellExecuteEx 將返回FALSE GetLastError 經過使用一個

ERROR_CANCELLED值來指出這個狀況。

 

注意,當一個進程使用提高後的權限啓動時,它每次用CreateProcess來生成另外一個進程時,子進程都會得到和它的父進程同樣的提高後的權限,在這種狀況下,不須要調用ShellExecuteEx

假如一個應用程序是用一個篩選後的令牌來運行的,那麼一旦試圖調用CreateProcess來生成一個要求提高權限的執行體,這個調用就會失敗,GetLastError會返回 ERROR_ELEVATION_REQUIRED

相關文章
相關標籤/搜索