Работая с реестром Windows в программах на языке Object Pascal, разработчики могут столкнуться с различными проблемами, связанными с правами доступа. Одной из таких проблем является невозможность открыть ключ HKLM\SYSTEM\CurrentControlSet\Enum из программы на Delphi 2010. Эта проблема может возникнуть при попытке автоматизировать процесс настройки ПК для тестирования устройств, например, с использованием конвертеров FTDI serial>USB.
Описание проблемы
При попытке открыть ключ Enum в реестре с помощью компонента TRegistry и указания корневого ключа HKEY_LOCAL_MACHINE, программа не может получить доступ к данному ключу или его подключам, хотя родительский ключ открывается успешно. Пример кода, который демонстрирует эту проблему:
procedure TForm4.Button1Click(Sender: TObject);
var
aReg: TRegistry;
sl: TStringList;
begin
aReg := TRegistry.Create;
try
aReg.RootKey := HKEY_LOCAL_MACHINE;
if aReg.OpenKey('\SYSTEM\CurrentControlSet\Enum', false) then
begin
// Действия с ключом
end
else
Memo1.Lines.Add('Could not open key');
finally
aReg.Free;
end;
end;
Подтвержденный ответ
Проблема заключается в том, что группа "Администраторы" по умолчанию не имеет полного доступа к ключу Enum. Это означает, что даже при использовании повышения привилегий и подписи программы, доступ к ключу не будет предоставлен, если требовать KEY_ALL_ACCESS.
Компонент TRegistry по умолчанию использует KEY_ALL_ACCESS для своих операций, если не указано иное в конструкторе или свойстве Access. Чтобы получить доступ к ключу для чтения его содержимого, можно использовать один из следующих подходов:
Использовать перегруженный конструктор TRegistry и указать KEY_READ как желаемый доступ.
Установить желаемый доступ в свойство Access на KEY_READ перед открытием ключа.
Использовать метод OpenKeyReadOnly вместо OpenKey.
Однако стоит учесть, что дерево Enum зарезервировано для использования компонентами операционной системы и его структура может изменяться. Прямой доступ к Enum из драйверов и приложений Windows не допускается. Вместо этого рекомендуется использовать альтернативные API, такие как IoGetDeviceProperty и SetupDiGetDeviceRegistryProperty.
Альтернативный ответ
Для получения информации о установленных устройствах и их настройке рекомендуется использовать специализированные функции Windows, предназначенные для работы с устройствами, а не пытаться напрямую читать или писать в ключи реестра Enum.
Заключение
При работе с реестром Windows важно учитывать ограничения доступа к определенным ключам. В случае с ключом Enum, лучше использовать предоставленные операционной системой API для работы с информацией об устройствах. Это позволит избежать проблем с доступом и обеспечит корректную работу программы в рамках ограничений безопасности Windows.
Проблема заключается в ограничениях доступа к ключу реестра `HKLM\SYSTEM\CurrentControlSet\Enum` в программе на Delphi, вызванных отсутствием необходимых прав у группы 'Администраторы' и рекомендации использовать альтернативные API для работы с устройств
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.