win7進程權限管理

一般習慣於用manifest來要求程序得到管理員權限,但是很多情況下,是不需要這個權限的,

win7又是每次必問的,所以這樣會相當的煩啊,下面是摘抄手動提權的文章,摘自windows核心編程,可以在需要的時候創建出管理員權限的進程去做某些事情.

手動提升進程的權限
如果你仔細閱讀過本章前面對CreateProcess函數的描述,肯定已經注意到它沒有專門提供什麼
標記或參數來指定對這種權限提升的需求。相反,你需要調用的是ShellExecuteEx函數:
BOOL ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo);
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize;
ULONG fMask;
HWND hwnd;
PCTSTR lpVerb;
PCTSTR lpFile;
PCTSTR lpParameters;
PCTSTR lpDirectory;
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”,
後者必須包含使用提升後的權限來啓動的一個執行體文件的路徑,如以下代碼段所示:
// Initialize the structure.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
// Ask for privileges elevation.
sei.lpVerb = TEXT("runas");
// Create a Command Prompt from which you will be able to start
// other elevated applications.
sei.lpFile = TEXT("cmd.exe");
// Don't forget this parameter; otherwise, the window will be hidden.
sei.nShow = SW_SHOWNORMAL;
if (!ShellExecuteEx(&sei)) {
DWORD dwStatus = GetLastError();
if (dwStatus == ERROR_CANCELLED) {
// The user refused to allow privileges elevation.
}
else
if (dwStatus == ERROR_FILE_NOT_FOUND) {
// The file defined by lpFile was not found and
// an error message popped up.
}
}
如 果 用 戶 拒絕提升權限, ShellExecuteEx 將返回FALSE , GetLastError 通過使用一個
ERROR_CANCELLED值來指出這個情況。
注意,當一個進程使用提升後的權限啓動時,它每次用CreateProcess來生成另一個進程時,子
進程都會獲得和它的父進程一樣的提升後的權限,在這種情況下,不需要調用ShellExecuteEx。
假如一個應用程序是用一個篩選後的令牌來運行的,那麼一旦試圖調用CreateProcess來生成一
個要求提升權限的執行體, 這個調用就會失敗, GetLastError 會返回
ERROR_ELEVATION_REQUIRED。
總之,要想成爲Windows Vista中的“好公民”,你的應用程序大多數時候都應該以“標準用戶”
的身份運行。另外,在它要求更多權限的時候,用戶界面應該在與這個管理任務對應的用戶界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章