Отключить сворачивание Aeroshake с помощью GPO

Я пытаюсь отключить Aeroshake, минимизируйте только жест мыши. Задал вопрос Как отключить минимизацию Aero Shake только в Windows 7, но нет ответов. Итак, я продолжил копать и нашел другое решение, обновив групповую политику пользователя.

void aeroshake(DWORD action)
{
    HRESULT hr;
    IGroupPolicyObject* pLGPO;
    HKEY machine_key, dsrkey;
    LSTATUS sdf, ds, rStatus;
    GUID RegistryId = REGISTRY_EXTENSION_GUID;
    GUID ThisAdminToolGuid =
        /*{ CLSID_PolicySnapinUser/* */
    {
        0x0F6B957E,
        0x509E,
        0x11D1,
    { 0xA7, 0xCC, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3 }
    };

    const IID my_IID_IGroupPolicyObject =
    { 0xea502723, 0xa23d, 0x11d1,{ 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
    const IID my_CLSID_GroupPolicyObject =
    { 0xea502722, 0xa23d, 0x11d1,{ 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
    GUID ext_guid = REGISTRY_EXTENSION_GUID;

    // This next one can be any GUID you want
    GUID snap_guid = { 0x3d271cfc, 0x2bc6, 0x4ac2,{ 0xb6, 0x33, 0x3b, 0xdf, 0xf5, 0xbd, 0xab, 0x2a } };

    // Create an instance of the IGroupPolicyObject class
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    CoCreateInstance(my_CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER,
        my_IID_IGroupPolicyObject, (LPVOID*)&pLGPO);

    // We need the machine LGPO (if C++, no need to go through the lpVtbl table)
    hr = pLGPO->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY);
    if (hr != S_OK) {
        goto release;
    }

    hr = pLGPO->GetRegistryKey(GPO_SECTION_USER, &machine_key);
    if (hr != S_OK) {
        goto close;
    }

    // create key for disable Aeroshake minimise
    sdf = RegCreateKeyEx(machine_key, TEXT("Software\\Policies\\Microsoft\\Windows\\Desktop\\NoWindowMinimizingShortcuts"),
        0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE, NULL, &dsrkey, NULL);

    // Create the value
    ds = RegSetKeyValue(dsrkey, NULL, TEXT("NoWindowMinimizingShortcuts"), REG_DWORD, &action, sizeof(action));
    RegCloseKey(dsrkey);

    // Apply policy and free resources
    pLGPO->Save( TRUE, TRUE, &ext_guid, &snap_guid);
    rStatus = RegCloseKey(machine_key);

    // Write the GPO back to the directory
    hr = pLGPO->Save(
        FALSE,
        TRUE,
        &RegistryId,
        &ThisAdminToolGuid);

close:
    RegCloseKey(machine_key);

release:
    pLGPO->Release();
}

Это похоже на правильный способ, но у меня проблема с OpenLocalMachineGPO, он всегда возвращает E_ACCESSDENIED. Можно ли отсортировать это без необходимости запускать от имени администратора. Кроме того, когда код запускается от имени администратора, он по-прежнему не меняет требуемую политику.


person htonus    schedule 04.10.2019    source источник


Ответы (1)


E_ACCESSDENIED означает отсутствие доступа, конечно, вам нужно достаточно разрешений для изменения объекта групповой политики.

Кроме того, значение ключа NoWindowMinimizingShortcuts находится под дополнительным ключом Software\\Policies\\Microsoft\\Windows\\Explorer

sdf = RegCreateKeyEx(machine_key, TEXT("Software\\Policies\\Microsoft\\Windows\\Explorer"),
        0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE, NULL, &dsrkey, NULL);

Вам нужно будет перезагрузиться или хотя бы выйти из системы, а затем войти в систему, чтобы вступить в силу (даже если вы вносите изменения напрямую в GPO).

Затем изменения будут обновлены до HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer:

NoWindowMinimizingShortcuts = 0x00000001

Конечно, вы также можете изменить этот ключ напрямую (необходимо сначала создать его, если у вас его нет).

void aeroshake(DWORD action)
{
    // create key for disable Aeroshake minimise
    HKEY hKeyRoot, dsrkey;
    LSTATUS sdf = RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Policies\\Microsoft\\Windows"), &hKeyRoot);
    sdf = RegCreateKey(hKeyRoot, TEXT("Explorer"), &dsrkey);
    // Create the value
    sdf = RegSetKeyValue(dsrkey, NULL, TEXT("NoWindowMinimizingShortcuts"), REG_DWORD, &action, sizeof(action));
    RegCloseKey(dsrkey);
}
person Drake Wu    schedule 07.10.2019
comment
Спасибо за развернутый ответ! Я просмотрел тонны статей, и в них говорится, что изменения в GPO вступают в силу немедленно, в то время как изменения в реестре требуют перезагрузки сеанса пользователя. Более того, изменения в GPO перезаписывают значения в реестре. - person htonus; 07.10.2019
comment
Насколько мне известно, Windows периодически обновляет параметры групповой политики по всей сети. На клиентских компьютерах это выполняется по умолчанию каждые 90 минут со случайным смещением плюс или минус 30 минут. Для обновления вручную можно использовать gpupdate. - person Drake Wu; 08.10.2019
comment
После тестирования я обнаружил, что даже если я напрямую изменю HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer, это не вступит в силу немедленно. - person Drake Wu; 08.10.2019