福州建站模板厂家,深圳关键词,企业网站建设的类型主要有,做微课常用的网站win7或者vista默认运行程序是在受限制的环境下运行的#xff0c;以减轻病毒对于系统的破坏。那么我们怎样才能提升一个进程的权限以至让它在 管理员模式下运行。当然CreateProcess函数没有提供这个功能。相反我们需要调用的是ShellExecuteEx函数#xff1a; BOOL ShellExecu…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。 转载于:https://www.cnblogs.com/MaxWoods/p/4132290.html