转载:http://blog.csdn.net/xmnathan/article/details/39498431
程序调用ShellExecuteEx打开其他程序(兼容UAC获取管理员权限)
程序调用ShellExecuteEx打开其他程序(兼容UAC获取管理员权限)
-----------------
- #include <stdio.h>
- #include<windows.h>
- #include<tchar.h>
- //检查系统版本是否是Vista或更高的版本
- bool IsOsVersionVistaOrGreater()
- {
- OSVERSIONINFOEX ovex;
- CHAR szVersionInfo[1024];
- *szVersionInfo = '\x00';
- //设置参数的大小,调用并判断是否成功
- ovex.dwOSVersionInfoSIze = sizeof(OSVERSIONINFOEX);
- if( !GetVersionEx( (LPOSVERSIONINFO) (&ovex) ) )
- {
- printf("检查系统版本失败\n");
- return false;
- }
- //通过版本号,判断是否是vista及之后版本
- if(ovex.dwMajorVersion > 5)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- //检查并根据系统版本选择打开程序方式
- void ShellExecuteExOpen(CString appName, CString appPath)
- {
- if(IsOsVersionVistaOrGreater())
- {
- SHELLEXECUTEINFO sei={sizeof(SHELLEXECUTEINFO)};
- sei.fMask = SEE_MASK_NOCLOSEPROCESS;
- sei.lpVerb = TEXT("runas");
- sei.lpFile = appName;
- sei.lpDirectory = appPath;
- sei.lpnShow = SW_SHOWNORMAL;
- if(!ShellExecuteEx(&sei))
- {
- DWORD dwStatus=GetLastError();
- if(dwStatus==ERROR_CANCELLED)
- {
- printf("提升权限被用户拒绝\n");
- }
- else if(dwStatus==ERROR_FILE_NOT_FOUND)
- {
- printf("所要执行的文件没有找到\n");
- }
- }
- }
- else
- {
- appPath.Replace(L"\\",L"\\\\");
- ShellExecute(NULL, _T("open"), appName, NULL, appPath, SW_SHOWNORMAL);
- }
- }
参考
利用ShellExecuteEx手动提升用户特权,以管理员权限来运行程序