《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
2014-05-23 15:17
537 查看
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”,
后者必须包含使用提升后的权限来启动的一个执行体文件的路径,如以下代码段所示:
#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。
From:http://mzf2008.blog.163.com/blog/static/35599786201091365427775/
win7或者vista默认运行程序是在受限制的环境下运行的,以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在
管理员模式下运行。当然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”,
后者必须包含使用提升后的权限来启动的一个执行体文件的路径,如以下代码段所示:
#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。
From:http://mzf2008.blog.163.com/blog/static/35599786201091365427775/
相关文章推荐
- 《Windows核心编程》学习笔记(9)– 在win7或者vista系统下提升一个进程的运行权限
- 设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)
- 自动提升Vista、Win7上进程的权限--RT_MANIFEST
- 在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。守护进程是在后台运行不与任何控制终端关联,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于
- 编译完成的工程在WIN7或者VISTA下自动使用管理员权限运行
- vista忘记用户名密码的修改方法(使用PE进入系统,用cmd.exe冒充虚拟键盘,然后就可以mmc组策略,或者命令行添加用户并提升权限)
- 在WIN7或者VISTA下自动使用管理员权限运行
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- Vista下普通权限进程动态提升权限 【转】
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- :让一个运行在SYSTEM权限下的进程与当前用户的桌面进行交互 代码:
- Vista下普通权限进程动态提升权限
- 如何删除Win7或者Vista中的系统文件
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)
- 提升权限获取其他系统进程的路径(转)
- 转载:如何指定程序在Vista上面需要提升权限运行(Elevated)