我试图在 Windows 注册表中创建一个键,但我得到了这个错误:
5 Access is denied.
代码片段是这样的:
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);
}
可能是因为我的程序没有admin权限,我在网上费了一番功夫,试图获取admin权限,但是没有成功。我现在很困惑如何解决这个问题。
编辑:我想实现什么?
我试图通过修改注册表来阻止某些特定的应用程序启动。例如,如果我想阻止记事本,首先我必须创建一个“notepad.exe”键,然后为其设置一个字符串值“debugger”并将其值设置为“debugfile.exe”。所以记事本将被阻止启动。
最佳答案
GUI 工具包非常复杂,通常建议避免使用管理权限来运行它们,并且许多 GUI 工具包(有充分的理由)有代码来检测和禁用(或警告)它。在 Linux 上,这意味着你不应该以 root 身份运行 GTK 或 Qt 代码(如果你这样做,会发出一些警告,或者工具包可能会中止;对于 Qt,请参见 this ;对于 GTK,请参见 that )。
在实践中,您应该尝试让一些具有管理权限的小程序(可能在命令行上,或作为守护程序)并让您的 Qt 程序启动它(例如使用 QProcess
) 和/或与其通信(使用某种 inter-process communication ),利用 process isolation和 multi-user你提供的能力operating system .
我想对操作系统有一些一般性的了解应该会有所帮助。那我推荐阅读Operating Systems: Three Easy Pieces以更深入地了解操作系统。
详细信息 - 即如何以比 Qt 程序更多的权限启动某些程序 - 特定于操作系统(在 Linux 上,请阅读 setuid)。进程间通信设施也是特定于操作系统的(在 Linux 上,请参阅 pipe(7) 、 fifo(7) 、 shm_overview(7) 、 unix(7) 、 sem_overview(7) 等......并阅读一些 Linux 编程书籍,也许是旧的 ALP或更新的东西)。如何在 Windows 上获得更多权限或进行进程间通信是一个非常不同的问题(与 Qt 无关)。
因此您需要深入了解 WinAPI文档(可能是 here )以了解如何启动具有管理权限的守护进程或小程序,以及如何与其执行进程间通信。我猜 Windows 有这样的功能,但它们没有包含在 Qt 中(也没有包含对注册表的访问),您需要编写特定于 Windows 的代码并了解有关 WinAPI 的更多信息。我帮不了你,因为我不知道也从未使用过 Windows。
关于c++ - Qt如何申请管理员权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980967/