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

How to request admin rights in Qt?

本文关键字:管理员 权限 请求 Qt      更新时间:2023-10-16

我试图在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);
}

也许是因为我的程序没有管理员权限,我尽力在网上做研究,并试图获得管理员权限,但失败了。我现在对如何解决这个问题感到非常困惑。

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

GUI 工具包非常复杂,通常建议避免使用管理权限来运行它们,并且许多 GUI 工具包(出于充分的理由(具有检测和禁用(或警告(的代码。在Linux上,这意味着你不应该以root身份运行GTK或Qt代码(如果你这样做,会发出一些警告,或者工具包可能会中止;对于Qt,请参阅此处;对于GTK,请参阅该内容(。

在实践中,您应该尝试使用一些具有管理权限的小程序(可能在命令行上,或作为守护程序(,并让您的Qt程序启动它(例如使用QProcess(和/或与之通信(使用某种进程间通信(,利用操作系统提供的进程隔离和多用户功能。

我想对操作系统的一些一般了解应该会有所帮助。然后,我建议阅读操作系统:三个简单部分,以更深入地了解操作系统。

细节 - 即如何启动一些比Qt程序更多的权限的程序 - 是特定于操作系统的(在Linux上,阅读setuid(。进程间通信设施也是特定于操作系统的(在Linux上,参见pipe(7(,fifo(7(,shm_overview(7(,unix(7(,sem_overview(7(等......并阅读一些Linux编程书籍,也许是旧的ALP或更新的东西(。如何在Windows上获得更多权限或进行进程间通信是一个非常不同的问题(与Qt无关(。

因此,您需要深入了解 WinAPI 文档(可能在此处(,了解如何以管理权限启动守护程序或小程序,以及如何执行与其的进程间通信。我猜Windows有这样的功能,但它们没有包装在Qt中(对寄存器的访问也没有(,你需要编写Windows特定的代码并了解更多关于WinAPI的信息。我帮不了你,因为我不知道也从未使用过Windows。

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 并选择"以管理员身份运行"。

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

win32 {
RC_FILE = rcfile.rc
}

然后使用以下内容创建 rcfile.rc:

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

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

name="YourProgrammName.myapp" type="win32" />
<description> Really Cool App</description>
<dependency />
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<!-- padding to four-byte multiple file size including the byte order mark --   
<!-- padding 123 -->
</assembly>