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中的“好公民”,你的应用程序大多数时候都应该以“标准用户”
的身份运行。另外,在它要求更多权限的时候,用户界面应该在与这个管理任务对应的用户界

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