如何在Qt中请求管理员权限?
How to request admin rights in Qt?
我试图在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_RESTORE
和KEY_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>
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 具有管理员权限的外壳执行不会结束
- 如何在Qt中请求管理员权限?
- CreateProcess() 可以授予管理员权限吗?
- 如何使用管理员权限运行 EXE
- QSettings没有管理员权限不保存ini更改
- 在没有管理员权限的情况下安装 Vulkan SDK
- 如何使用 c++ 在 cmd 中使用管理员权限执行命令
- 在没有管理员权限的情况下安装C++编译器
- 如何在不使用 C++ 中的管理员权限的情况下设置 AD 属性值
- 以 Windows 服务身份运行应用程序是否需要管理员权限
- Windows 7如何确定您是否需要管理员权限?(vc60)
- 是否可以调整令牌权限提升为管理员权限
- 管理员权限2个应用程序
- 如何运行需要管理员权限的应用程序
- >使用 RegCreateKeyEx() 的 Windows 可执行文件不会提示输入 UAC 管理员权限并失败?
- 如何在 c++ 中启动具有管理员权限的应用程序
- 如何在C++中以管理员权限运行 ShellExecute
- 如何通过C++检查我的程序是否在管理员权限下运行