MFC - 询问是否以管理员身份运行某程序

来源:互联网 发布:云计算股票龙头股阿里 编辑:程序博客网 时间:2024/05/22 14:23
// 此结构体已在系统头文件中有定义/*BOOL ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo);typedef struct _SHELLEXECUTEINFO {DWORD cbSize;ULONG fMask;HWND hwnd;PCTSTR lpVerb;      // 必须设为runasPCTSTR 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 sei = { sizeof(SHELLEXECUTEINFO) };// Ask for privileges elevation.sei.lpVerb = _T("runas");sei.lpFile = _T("XXXX");sei.lpParameters = _T("PWD");sei.hwnd = this->m_hWnd;// Don't forget this parameter; otherwise, the window will be hidden.sei.nShow = SW_SHOWNORMAL;//如果没有设置 SEE_MASK_NOCLOSEPROCESS, 子进程的句柄则会置NULL,会导致下面等待子进程失败sei.fMask = SEE_MASK_NOCLOSEPROCESS;if (!ShellExecuteEx(&sei)) {    DWORD dwStatus = GetLastError();    if (dwStatus == ERROR_CANCELLED) {    // 用户取消以管理员身份,做相应响应;}else if (dwStatus == ERROR_FILE_NOT_FOUND) {    // 未找到文件;}// 此进程挂起,等待子进程退出WaitForSingleObject( sei.hProcess, INFINITE ); // 清理操作CloseHandle( sei.hProcess );//CloseHandle( sei.hThread )// 下面这段代码可用来将Windows返回的错误码转换成具体的提示文字LPSTR lpBuffer;FormatMessage ( FORMAT_MESSAGE_ALLOCATE_BUFFER  |    FORMAT_MESSAGE_IGNORE_INSERTS  |    FORMAT_MESSAGE_FROM_SYSTEM,    NULL,    GetLastError(), // 此乃错误代码,通常在程序中可由 GetLastError()得之     LANG_NEUTRAL,    (LPTSTR) & lpBuffer,    0 ,    NULL );MessageBox(lpBuffer, _T("ErrorMessage"), 0);