SHGetValue возвращает 2 при запросе значения UAC - PullRequest
0 голосов
/ 17 апреля 2019

Я хотел бы проверить настройки конфигурации UAC в Windows. И, таким образом, восстановить параметры UAC в ключах реестра.

Я использовал функцию windows SHGetValue, но статус всегда возвращает мне 2 без какой-либо информации.

Я использую C ++ 11, MinGW и Windows.

Мой код:

DWORD dwStatus;
  LPCSTR pszSubKey= "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
  LPCSTR pszValue="";
  DWORD  pdwType=REG_SZ;
  PVOID  pvData[63];
  DWORD  pcbData;
  pcbData=sizeof(pvData);

  dwStatus=SHGetValueA(HKEY_LOCAL_MACHINE, pszSubKey, pszValue, &pdwType, pvData, &pcbData);

  //Here dwStatus = 2
  // pvData = 0x11fd0b2
  // pcbData = 504

1 Ответ

4 голосов
/ 17 апреля 2019

Какой конкретный ключ вы пытаетесь прочитать? Я не эксперт по Win32 API, поэтому я не знаю, есть ли способ прочитать набор ключей одновременно ( Edit: Я думаю, что есть RegEnumValue/RegEnumValueA функции для этой цели). Вот пример, который показывает, как вы можете прочитать «EnableLUA» ​​или любой другой ключ из этого пути:

#include <windows.h>
#include <iostream>
#include <shlwapi.h>


bool ReadUACRegistryKey(char* key, DWORD &keyValue)
{
    LPCTSTR pszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    LPCTSTR pszValue = key;

    //  don't care
    DWORD dwType = 0;
    DWORD dwValue = 0;

    //  
    DWORD dwValueSize = sizeof(dwValue);

    int retval = SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, key, &dwType, &dwValue, &dwValueSize);
    if ( retval != ERROR_SUCCESS)
    {
        return false;
    }

    keyValue = dwValue;
    return true;
}

int main()
{
    DWORD keyValue;
    char* key = "EnableLUA";  //  "EnableSecureUIAPaths" etc..;
    if (ReadUACRegistryKey(key, keyValue))
    {
        std::cout << "Successfully readed key " << key << ", value:" << keyValue << std::endl;
    }
    else
    {
        std::cout << "Unable to read value of key " << key << std::endl;
    }


    return 0;
}

Также имейте в виду, что значение значения ключа чтения сохраняется в параметре value, а не в возвращаемом значении функции.

Редактировать : Ответ на комментарий оператора "Я хочу использовать FilterAdministratorToken, но по умолчанию отключен, как вернуть его обратно.?" . Помните, что для выполнения этих операций вашему процессу необходимы права администратора.

#include <windows.h>
#include <iostream>
#include <shlwapi.h>


bool ReadUACRegistryKey(char* key, DWORD &keyValue)
{
    LPCTSTR pszSubKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";
    LPCTSTR pszValue = key;

    //  don't care
    DWORD dwType = 0;
    DWORD dwValue = 0;

    //  
    DWORD dwValueSize = sizeof(dwValue);

    int retval = SHGetValue( HKEY_LOCAL_MACHINE, pszSubKey, key, &dwType, &dwValue, &dwValueSize);
    if ( retval != ERROR_SUCCESS)
    {
        return false;
    }

    keyValue = dwValue;
    return true;
}

bool EnableFilterAdministratorToken()
{
    //  first check if its already enabled or not
    DWORD val;
    if (ReadUACRegistryKey("FilterAdministratorToken", val))
    {
        if (val == 1)
        {
            std::cout << "FilterAdministratorToken is already enabled" << std::endl;
            return true;
        }
    }
    else
    {
        std::cout << "Unable to read key" << std::endl;
        return false;
    }


    //  its not enabled, we need to enable it manually
    //  obtain a handle to reg key
    HKEY hKey;
    int retval = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", 0, KEY_SET_VALUE, &hKey);
    if (retval != ERROR_SUCCESS)
    {
        //  we are unable to obtain a handle to reg key
        std::cout << "Unable to obtain handle to reg key" << std::endl;
        return false;
    }


    DWORD enabledValue = 1;
    retval = RegSetValueExA(hKey, "FilterAdministratorToken", 0, REG_DWORD, (BYTE*) &enabledValue, sizeof(DWORD));
    if (retval != ERROR_SUCCESS)
    {
        //  some error occured
        std::cout << "Some error occured during setting the key value" << std::endl;
        RegCloseKey(hKey);
        return false;
    }

    std::cout << "Successfully changed key value" << std::endl;
    RegCloseKey(hKey);
    return true;
}

int main()
{
    if (EnableFilterAdministratorToken())
    {
        std::cout << "OK" << std::endl;
    }
    else
    {
        std::cout << "FAIL" << std::endl;
    }


    return 0;
}
...