SHGetValue возвращает 2 при запросе значения UAC

#c #windows #winapi #mingw #uac

#c #Windows #winapi #mingw #uac

Вопрос:

Я хотел бы проверить параметры конфигурации 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, amp;pdwType, pvData, amp;pcbData);

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

Комментарии:

1. Не уверен в абстракциях оболочки. Может быть, попробуйте Winreg.h API, посмотрите, который возвращает ошибку ( RegOpenKey , RegQueryValueEx , и т.д.) И если она более подробная.

2. «… статус всегда возвращает мне 2 без какой-либо информации …» SHGetValue возвращает a LSTATUS . Я считаю, что это так. ERROR_FILE_NOT_FOUND . Я полагаю, что вы запрашиваете ключ, подраздел или значение, которое не существует. Один из людей, более знакомых с Win32 API, вероятно, может сказать больше.

3. HKLM это не имя раздела реестра, это сокращение, к HKEY_LOCAL_MACHINE которому вы уже переходите в SHGetValue качестве первого параметра.

4. @jww статус с MinGW компилятора — это DWORD, и я исправил свою ошибку ответом Джонатана спасибо

Ответ №1:

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

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


bool ReadUACRegistryKey(char* key, DWORD amp;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, amp;dwType, amp;dwValue, amp;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, а не в возвращаемом значении функции.

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

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


bool ReadUACRegistryKey(char* key, DWORD amp;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, amp;dwType, amp;dwValue, amp;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, amp;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*) amp;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;
}
 

Комментарии:

1. Я хочу использовать FilterAdministratorToken, но по умолчанию отключен, как вернуть его обратно.?