如果系统有需要管理员的操作和普通用户的操作,根据最小权限原则,建议将管理员权限的内容启动为单独的进程,有普通权限的程序拉起,代码如下:

#include <windows.h>
#include <shellapi.h>

bool executeAsAdmin(const QString &filePath, const QStringList &arguments = QStringList()) {
    // 将文件路径转换为Windows API需要的格式
    std::wstring wFilePath = filePath.toStdWString();
    
    // 拼接参数
    std::wstring wParameters;
    if (!arguments.isEmpty()) {
        wParameters = arguments.join(" ").toStdWString();
    }

    // 关键:使用 "runas" 动词请求管理员权限
    HINSTANCE result = ShellExecuteW(
        nullptr,                   // 无父窗口
        L"runas",                  // 动词:请求管理员权限
        wFilePath.c_str(),        // 要执行的文件路径
        wParameters.empty() ? nullptr : wParameters.c_str(), // 参数
        nullptr,                   // 使用文件所在目录为工作目录
        SW_SHOWNORMAL             // 正常显示窗口
    );

    // 返回值大于32表示成功
    return (int)result > 32;
}
posted on 2026-02-04 17:28  Maxsun  阅读(2)  评论(0)    收藏  举报