c++ - Qt如何申请管理员权限?

标签 c++ windows qt qt5

我试图在 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 isolationmulti-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/

相关文章:

java - QAndroidJNI调用方法错误

c++ - 强制立即处理 Qt 自定义信号?

c++ - Rapidjson 文档

c# - 如何从C++ UWP App引用C#UWP类库

java - 当系统从 hibernate 状态恢复时自动运行应用程序

windows - MoveFile 是否确保文件在磁盘上移动?

c++ - 如何在 QlineEdit 或复选框中保留一个值以在程序关闭后保留它的值?

c++ - 可变参数模板 : invalid use of void expression

windows - 如何使用 wamp 在 Windows 上烘焙 cakephp 2.0 应用程序

c++ - 在小部件和向导页面之间共享数据