分享

【Qt】一劳永逸解决UAC问题,获取超级管理员 administrator权限

 梦醉千秋 2015-09-14

方法1:


pro添加
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"


管理员形式运行qtcreator.exe.亲测ok




========================================方法二未成功


QtCreator的话可在PRO里面添加


  1. RC_FILE = resource.rc

在 resource.rc里面就可以添加图标或者UAC权限之类了。如

  1. 1 24 uac.manifest
这样就是申请uac权限。当然在pro文件同目录得有uac.manifest文件 内容如下

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  3. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  4. <security>
  5. <requestedPrivileges>
  6. <requestedExecutionLevel level="requireAdministrator"/>
  7. </requestedPrivileges>
  8. </security>
  9. </trustInfo>
  10. </assembly>
这样编译就可以了。另外rc文件还有其他很多功能,如图标的话,可以在resource.rc添加如下

  1. IDI_ICON1 ICON DISCARDABLE "icon.ico"
有icon.ico就可以添加图标了。


====================================VS2012下面===================================================================

如果你的程序跑在一个开启了UAC保护的系统中,而你的程序又没有"盾牌"的话,程序总是会受到各种阻挠的,比如读写文件,写注册表等。

有了"盾牌"的话就不会出现一些莫名其妙的问题了。


打开文件 "mkspecs\win32-msvc2012\qmake.conf"。注意,我这里用的是VC2012,所以文件夹是win32-msvc2012,根据自己的编译器选择对应的目录

找到


QMAKE_LFLAGS_EXE        = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"


改为


QMAKE_LFLAGS_EXE        = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"\"/MANIFESTUAC:level=\'requireAdministrator\' uiAccess=\'false\'\"


红色的部分是添加的属性。

这样,以后生成的程序都自带"盾牌"了,不用再去设置每个.pro文件了。

=====================================方法四


起因:我用QT为某款游戏写了外挂,其中需要用已逆向修改的文件替换掉游戏源文件。但是UAC设置会导致QFile很多功能无法正常使用。
解决:首先判断UAC是否开启,然后提供两种解决方式
1.联系客服:弹出客服的QQ,然后进行远程协助。这种方式适合电脑小白。
2.提示处理:弹出UAC设置对话框,提示玩家操作。


void Widget::CloseUAC()
{
    bool isuac = false;
    HKEY hkey = NULL;
    DWORD EnableLUA=0;
    DWORD type = REG_DWORD;
    DWORD size = sizeof(DWORD);
    //读取系统信息
    OSVERSIONINFO osinfo={ sizeof(osinfo) };
    if(GetVersionEx(&osinfo));
        if(osinfo.dwMajorVersion>5)
            if(RegOpenKeyEx(
                HKEY_LOCAL_MACHINE,
                L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\",
                0,KEY_READ,
                &hkey)==ERROR_SUCCESS&&
                RegQueryValueEx(hkey,L"EnableLUA",NULL,&type,(BYTE*)&EnableLUA,&size)==ERROR_SUCCESS
                )isuac=(EnableLUA==1)?true:false;
    RegCloseKey(hkey);
    if(!isuac)return;
    //弹出UAC设置窗口
    ShellExecute(NULL,L"open",L"C:\\windows\\system32\\useraccountcontrolsettings.exe",NULL, NULL,SW_SHOWNORMAL);
    //弹出UAC错误窗口
    QMessageBox box;
    box.setIcon(QMessageBox::Critical);
    box.setWindowTitle("请求更改系统UAC设置");
    box.setText("<FONT size=4>"
        "<div><b>解决方式·一(推荐)</b></div>"
        "<div>点击此错误框的“确认”按钮,将弹出客服QQ</div>"
        "<div>添加为QQ好友,客服将远程协助完成操作</div>"
        "<div><b>解决方式·二</b></div>"
        "<div>目前已弹出名为“用户帐户控制设置”的窗口</div>"
        "<div>请将此窗口左侧的拉条拖到最下,并点击确定</div>"
        "<div>完成后会提示要求重启电脑,并允许,即可解决</div>"
        "<div>选择 <b>确定</b> :结束程序,并 QQ 联系客服</div>"
        "<div>选择 <b>取消</b> :结束程序</div>"
        "</FONT>");
    box.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
    box.setDetailedText(
        "    UAC(User Account Control:用户帐户控制)是微软为了提高系统安全性而在Vista中开始引入的新技术。\n"
        "    它在开启的情况下,经常会弹出“您想允许XXX对此计算机进行更改吗?”的询问窗口。\n"
        "    此功能有效地遏制了病毒部分功能的实现,但也殃及了游戏辅助软件部分功能的实现。\n");
    switch(box.exec())
    {
        case QMessageBox::Ok:QDesktopServices::openUrl(QUrl("http://wpa.qq.com/msgrd?V=1&Uin=123456789&Site=ioshenmue&Menu=yes"));break;
    }
    exit(0);
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多