程序调用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手动提升用户特权,以管理员权限来运行程序