如何在Qt中请求管理员权限?

时间:2018-06-22 05:04:30

标签: c++ windows qt qt5

我试图在Windows注册表中创建一个密钥,但出现此错误:

  

5访问被拒绝。

代码段如下:

HKEY hKey;
LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\notepad.exe"); //notepad.exe is the key I want to create
    //note: if I change the first parameter to KEY_CURRENT_USER, the key will be created 
LONG createResKey = RegCreateKeyEx(HKEY_LOCAL_MACHINE, sk, 0, NULL, REG_OPTION_BACKUP_RESTORE, KEY_ALL_ACCESS, NULL, &hKey, NULL);

if (createResKey == ERROR_SUCCESS) {
    qDebug() << "Success creating key.";
}
else {
    qDebug() << "Error creating key.";

    showErrorText(createResKey);
}

也许是因为我的程序没有管理员权限,所以我尽力在线进行研究并尝试获得管理员权限,但是失败了。我对于现在如何解决这个问题感到很困惑。

编辑:我想实现什么?
我试图通过修改注册表阻止某些特定的应用程序。例如,如果我要阻止记事本,首先必须创建一个“ notepad.exe”键,然后为其设置字符串值“ debugger”,并将其值设置为“ debugfile.exe”。因此,记事本将无法启动。

3 个答案:

答案 0 :(得分:8)

GUI工具箱非常复杂,以至于通常建议避免使用管理特权来运行它们,并且许多GUI工具箱都具有(出于充分的理由)用于检测和禁用(或警告)该代码的代码。在Linux上,这意味着您不应该以root用户身份运行GTK或Qt代码(如果这样做,则会发出警告,或者工具箱可能中止;有关Qt,请参见this;有关GTK,请参见{{3 }}。

在实践中,您应该尝试使用管理权限来运行一些 small 程序(可能在命令行上,或者作为守护程序),并让您的Qt程序启动它(例如,使用{{1} })和/或与其通信(使用某种that),并利用您的inter-process communication提供的process isolationmulti-user功能。

我想对操作系统有一些一般的了解应该会有所帮助。然后,我建议阅读operating system,以全面了解操作系统。

详细信息-即如何以比Qt程序更多的特权启动某些程序-是特定于操作系统的(在Linux上,请阅读有关Operating Systems: Three Easy Pieces的信息)。进程间通信功能也特定于OS(在Linux上,请参见setuidpipe(7)fifo(7)shm_overview(7)unix(7)等,并阅读一些内容。 Linux编程书,也许是旧的sem_overview(7)或更新的书)。在Windows上如何获得更多特权或进行进程间通信是一个非常不同的问题(与Qt无关)。

因此,您需要深入研究ALP文档(也许是WinAPI),以了解如何启动具有管理特权的守护程序或小型程序以及如何与之进行进程间通信。我猜想Windows有这样的功能,但是它们没有包装在Qt中(访问注册表也不是),您需要编写Windows特定的代码并了解有关WinAPI的更多信息。我无法帮助您,因为我不知道,也从未使用过Windows。

答案 1 :(得分:2)

KEY_ALL_ACCESS是相当重要的权限。而且,即使升级的进程也可能无法访问HKLM中的系统注册表项。无论如何,请勿使用REG_OPTION_BACKUP_RESTOREKEY_ALL_ACCESS标志。而是索要KEY_WRITE。

LONG createResKey = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                                    sk,
                                    0,
                                    NULL,
                                    0,
                                    KEY_WRITE,  
                                    NULL, 
                                    &hKey,
                                    NULL);

然后右键单击您的EXE,然后选择“以管理员身份运行”。

答案 2 :(得分:2)

要在运行时获取管理员特权,您需要添加.pro文件:

#Add these imports
from flask import jsonify
from flask_cors import CORS

#Add an app level config in this format
app = Flask(__name__)
CORS(autoINFER_app, resources={r"/*": {"origins": "*"}}, send_wildcard=True)

#While returning the GETs add this line
response = jsonify(all_dict)
response.headers.add('Access-Control-Allow-Origin', '*')
return response

然后使用以下命令创建rcfile.rc:

win32 {
    RC_FILE = rcfile.rc
}

然后使用以下文本创建YourProgrammName.exe.manifest文件:

#include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourProgrammName.exe.manifest"