bool UninstallToolRecord( bool adjust_uac ) { TCHAR path_dst[MAX_PATH * 2]; if (!GetProductBinDir(path_dst, ARRAYSIZE(path_dst))) { return false; } ::PathAppend(path_dst, TEXT("toolRecord.dll")); if (INVALID_FILE_ATTRIBUTES == ::GetFileAttributes(path_dst)) { return true; } if (!RemoveFile(path_dst)) { if (adjust_uac) { if (!IsRunAsAdmin()) { TCHAR path_exe[MAX_PATH * 2]; ::GetModuleFileName(NULL, path_exe, ARRAYSIZE(path_exe)); LaunchUacApp(path_exe, TEXT("unst_tool_record"), true); } } } DWORD file_attr = GetFileAttributes(path_dst); return INVALID_FILE_ATTRIBUTES == file_attr; }
bool InstallToolRecord( bool adjust_uac ) { TCHAR path_dst[MAX_PATH * 2]; if (!GetProductBinDir(path_dst, ARRAYSIZE(path_dst))) { SetToolErrorMsg(TEXT("无法定位Zoom安装目录!")); return false; } else { ::PathAppend(path_dst, TOOLRECORD_DLL_NAME); } HMODULE res_module = GetModuleHandle(NULL); if (!ExtractResource(res_module, IDR_DLL_RECORD, TEXT("DLL"), ExtractResourceCallback_SaveToFile, path_dst)) { SetToolErrorMsg(TEXT("解压") TOOLRECORD_DLL_NAME TEXT("文件失败!")); if (adjust_uac) { if (!IsRunAsAdmin()) { TCHAR path_exe[MAX_PATH * 2]; ::GetModuleFileName(NULL, path_exe, ARRAYSIZE(path_exe)); LaunchUacApp(path_exe, TEXT("inst_tool_record"), true); } } } DWORD file_attr = GetFileAttributes(path_dst); return INVALID_FILE_ATTRIBUTES != file_attr; }
// // 函数:OnCommand(HWND, int, HWND, UINT) // // 用途:处理WM_COMMAND消息 // void OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDC_ELEVATE_BN: { // 检查当前进程是否以管理员权限运行,如果不是则提升。 BOOL fIsRunAsAdmin; try { fIsRunAsAdmin = IsRunAsAdmin(); } catch (DWORD dwError) { ReportError(L"IsRunAsAdmin", dwError); break; } // 如果此进程不是以管理员身份运行,提升权限等级。 if (!fIsRunAsAdmin) { wchar_t szPath[MAX_PATH]; if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath))) { // 以管理员身份启动本程序。 SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.lpVerb = L"runas"; sei.lpFile = szPath; sei.hwnd = hWnd; sei.nShow = SW_NORMAL; if (!ShellExecuteEx(&sei)) { DWORD dwError = GetLastError(); if (dwError == ERROR_CANCELLED) { // 用户拒绝提升 // 什么都不做... } } else { EndDialog(hWnd, TRUE); // 退出 } } } else { MessageBox(hWnd, L"此进程已以管理员身份运行", L"UAC", MB_OK); } } break; case IDOK: case IDCANCEL: EndDialog(hWnd, 0); break; } }
int main(int argc, char* argv[]) { LOG("Is Run As Admin: %d", IsRunAsAdmin()); LOG("Is Elevated: %d", IsElevated()); init(argc, argv); startup(); cleanup(); return 0; }
BOOL OnInitDialog(HWND hWnd, HWND hwndFocus, LPARAM lParam) { // 获取并显示即使在还没有为当前用户提升权限的前提下,拥有此进程的主访 // 问令牌的用户是否是本地管理员组的成员。(IsUserInAdminGroup)。 HWND hInAdminGroupLabel = GetDlgItem(hWnd, IDC_INADMINGROUP_STATIC); try { BOOL const fInAdminGroup = IsUserInAdminGroup(); SetWindowText(hInAdminGroupLabel, fInAdminGroup ? L"是" : L"否"); } catch (DWORD dwError) { SetWindowText(hInAdminGroupLabel, L"N/A"); ReportError(L"IsUserInAdminGroup", dwError); } // 获取并显示是否此进程以管理员身份运行。(IsRunAsAdmin)。 HWND hIsRunAsAdminLabel = GetDlgItem(hWnd, IDC_ISRUNASADMIN_STATIC); try { BOOL const fIsRunAsAdmin = IsRunAsAdmin(); SetWindowText(hIsRunAsAdminLabel, fIsRunAsAdmin ? L"是" : L"否"); } catch (DWORD dwError) { SetWindowText(hIsRunAsAdminLabel, L"N/A"); ReportError(L"IsRunAsAdmin", dwError); } // 获取并显示进程权限提升信息(IsProcessElevated)和完整性级别(GetProcessIntegrityLevel) // 注意:这些信息在Windows Vista之前的Windows中不存在。 HWND hIsElevatedLabel = GetDlgItem(hWnd, IDC_ISELEVATED_STATIC); HWND hILLabel = GetDlgItem(hWnd, IDC_IL_STATIC); OSVERSIONINFO osver = { sizeof(osver) }; if (GetVersionEx(&osver) && osver.dwMajorVersion >= 6) { // 运行于Windows Vista或后续版本(主版本号 >= 6)。 try { // 获取并显示进程权限提升信息 BOOL const fIsElevated = IsProcessElevated(); SetWindowText(hIsElevatedLabel, fIsElevated ? L"是" : L"否"); // 如果进程尚未被提升,更新“自我提升权限”按钮以在UI中显示UAC盾形 // 图标。宏Button_SetElevationRequiredState(在Commctrl.h中定义)用 // 于显示或隐藏按钮上的盾形图标。你也可以通过调用SHGetStockIconInfo // (参量SIID_SHIELD)来获取此图标。 HWND hElevateBtn = GetDlgItem(hWnd, IDC_ELEVATE_BN); Button_SetElevationRequiredState(hElevateBtn, !fIsElevated); } catch (DWORD dwError) { SetWindowText(hIsElevatedLabel, L"N/A"); ReportError(L"IsProcessElevated", dwError); } try { // 获取并显示进程的完整性级别 DWORD const dwIntegrityLevel = GetProcessIntegrityLevel(); switch (dwIntegrityLevel) { case SECURITY_MANDATORY_UNTRUSTED_RID: SetWindowText(hILLabel, L"不信任"); break; case SECURITY_MANDATORY_LOW_RID: SetWindowText(hILLabel, L"低"); break; case SECURITY_MANDATORY_MEDIUM_RID: SetWindowText(hILLabel, L"中"); break; case SECURITY_MANDATORY_HIGH_RID: SetWindowText(hILLabel, L"高"); break; case SECURITY_MANDATORY_SYSTEM_RID: SetWindowText(hILLabel, L"系统"); break; default: SetWindowText(hILLabel, L"未知"); break; } } catch (DWORD dwError) { SetWindowText(hILLabel, L"N/A"); ReportError(L"GetProcessIntegrityLevel", dwError); } } else { SetWindowText(hIsElevatedLabel, L"N/A"); SetWindowText(hILLabel, L"N/A"); } return TRUE; }