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結構中唯一有趣的字段是lpVerb和lpFile。前者必須被設爲「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系統下運行的時候會提示計算器程序要求提高爲管理員權限運行,相似的窗口爲:
若是用戶拒絕提高權限,ShellExecuteEx 將返回FALSE ,GetLastError 經過使用一個
ERROR_CANCELLED值來指出這個狀況。
注意,當一個進程使用提高後的權限啓動時,它每次用CreateProcess來生成另外一個進程時,子進程都會得到和它的父進程同樣的提高後的權限,在這種狀況下,不須要調用ShellExecuteEx。
假如一個應用程序是用一個篩選後的令牌來運行的,那麼一旦試圖調用CreateProcess來生成一個要求提高權限的執行體,這個調用就會失敗,GetLastError會返回 ERROR_ELEVATION_REQUIRED。