在运行程序时,为了在win Vista以上版本弹出UAC窗口,我们往往设置程序不使用管理员权限打开。因为在程序在一定目录下,不使用管理员运行也是能达到自身的目的(不读写磁盘),但在诸如系统盘下,我们的程序可能就运行的不好,需要管理员权限才能正常运行,但在程序中设置了管理员权限运行,用户电脑没关闭UAC的话,运行又会出现烦人的弹窗。所以,我们可以先判断,如果用户电脑有打开UAC,而且程序运行的在磁盘特定位置,我们就用兼容模式启动程序。
if (IsEnableUAC())
{
if (NULL != _tcsstr(szModPath, L"C:\\Windows") || NULL != _tcsstr(szModPath, L"C:\\Program Files") || NULL != _tcsstr(szModPath, L"C:\\Users"))
{
HANDLE hToken = NULL;
GetTokenByName(hToken, L"explorer.exe");
ImpersonateLoggedOnUser(hToken);
if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_CURRENT_USER, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE, NULL, &hKey, NULL))
{
TCHAR szValue[16] = { 0 };
DWORD nLen = sizeof(TCHAR)* 16;
RegQueryValueEx(hKey, szModPath, 0, NULL, LPBYTE(szValue), &nLen);
if (0 == szValue[0])
{
KillProcessByPath(szModPath);
RegSetValueEx(hKey, szModPath, 0, REG_SZ, (BYTE*)L"WINXPSP3", sizeof(TCHAR)* 9);
}
RegCloseKey(hKey);
}
CloseHandle(hToken);
RevertToSelf();
}
}
这样,只是在有开启UAC且在特定磁盘下才会以管理员的模式运行