Kurt_00 2024-03-21 16:02 采纳率: 40%
浏览 12
已结题

RegSetValueEx修改注册表不显示修改结果

问题:RegSetValueEx函数执行成功但是注册表没有显示对应的键值

补充:将RegOpenKeyEx与RegCreateKeyEx函数中hGPOKey换成HKEY_LOCAL_MACHINE可以修改注册表但是并未修改并刷新组策略

#define   INITGUID 
#include<iostream>
#include<Windows.h>
#include<GPEdit.h>
#include<Guiddef.h>
using namespace std;

bool test()
{
    ::CoInitialize(nullptr);
    LRESULT status;
    LRESULT hr = S_OK;
    IGroupPolicyObject* pGPO = nullptr;
    hr = CoCreateInstance(CLSID_GroupPolicyObject, nullptr, CLSCTX_INPROC_SERVER, IID_IGroupPolicyObject, reinterpret_cast<LPVOID*>(&pGPO));
    if (hr != S_OK) {
        cout << "GPO create failure";
        return false;
    }
    DWORD dwSection = GPO_SECTION_MACHINE;
    HKEY hGPOKey = nullptr;
    hr = pGPO->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY);
    if (FAILED(hr)) {
        cout << "Failed to open the local GPO";
        return false;
    }
//     hr = pGPO->SetOptions(GPO_OPTION_DISABLE_MACHINE | GPO_OPTION_DISABLE_USER, GPO_OPTION_DISABLE_USER | GPO_OPTION_DISABLE_MACHINE);
    hr = pGPO->GetRegistryKey(dwSection, &hGPOKey);
    if (FAILED(hr)) {
        cout << "Failed to load the registry.";
        return false;
    }
    // Software\Policies\Microsoft\Windows\RemovableStorageDevices\{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
    HKEY hKey = nullptr;
    status = RegOpenKeyEx(hGPOKey, "Software\\Policies\\Microsoft\\Windows\\RemovableStorageDevices\\{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}", 0, KEY_WOW64_32KEY | KEY_ALL_ACCESS, &hKey);
    if (status != ERROR_SUCCESS) {
        status = RegCreateKeyEx(hGPOKey, "Software\\Policies\\Microsoft\\Windows\\RemovableStorageDevices\\{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}", 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_WOW64_64KEY | KEY_ALL_ACCESS, nullptr, &hKey, nullptr);
        if (status != S_OK) {
            cout << "Failed to create a key value.";
            // TODO
            return false;
        }
    }
    DWORD lpData = 1;
    status = RegSetValueEx(hKey, "Deny_Read", 0, REG_DWORD, reinterpret_cast<LPBYTE>(&lpData), 4);
    if (FAILED(status)) {
        cout << "Failed to set a value.";
        // TODO
        return false;
    }
    status = RegCloseKey(hKey);
    GUID Registerid = REGISTRY_EXTENSION_GUID;
    GUID ThisGuid = { 0x0F6B957E, 0x509E, 0x11D1, {0xA7, 0xCC, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3} };
    RegCloseKey(hGPOKey);
    status = pGPO->Save(TRUE, TRUE, &Registerid, &ThisGuid);
    pGPO->Release();
    ::CoUninitialize();
    return true;
}

int main()
{
    test();
}
  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-03-21 16:03
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: RegSetValueEx函数执行成功但是注册表没有显示对应的键值,可能的原因有以下几种: 1.键值被隐藏或者被修改了属性; 2.程序没有以管理员权限运行或者没有正确打开注册表; 3.键值路径错误或路径中有误; 4.程序没有刷新注册表导致未显示; 5.其他未知的因素。 解决方案: 1.检查键值是否被隐藏或者是否被修改了属性; 2.确保程序以管理员权限运行,并且正确打开了注册表; 3.检查键值路径是否正确,可以在注册表中手动查找; 4.程序可以通过SendMessage发送WM_SETTINGCHANGE消息刷新注册表; 5.尝试其他解决方案,如重启计算机等。 示例代码: 以下是通过发送WM_SETTINGCHANGE消息刷新注册表的示例代码: SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment");
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月29日
  • 创建了问题 3月21日