#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
возвращает aLSTATUS
. Я считаю, что это так.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, но по умолчанию отключен, как вернуть его обратно.?