|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Проверка существования ключа реестра
Здравствуйте, уважаемые форумчане!
Пусть Вас не вводит в заблуждение повторяемость названия данной темы. Я не нашел ничего похожего, поэтому и обращаюсь за помощью к Гуру. Проблема, собственно, состоит в семантическом парадоксе. У меня есть процедура, которая, по выбору пользователя, либо создает, либо удаляет некий параметр реестра: Код:
if (Radiobutton6.Checked = True) then // Проверяем выбор begin WKey := TRegistry.Create(KEY_WRITE); try WKey.RootKey := HKEY_LOCAL_MACHINE; RegPath:=regDataPath; WKey.OpenKey(RegPath, False); if ComboBox2.ItemIndex = 0 then begin for i := 1 to length(AllW) do Buf[i] := AllW[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf,SizeOf(Buf)); // Отключение обеих клавиш WIN end; if ComboBox2.ItemIndex = 1 then begin for i := 1 to length(LWin) do Buf1[i] := LWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf1,SizeOf(Buf1)); // Отключение левой клавиши WIN end; if ComboBox2.ItemIndex = 2 then begin for i := 1 to length(RMWin) do Buf[i] := RMWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf,SizeOf(Buf)); // Отключение правой клавиши WIN и клавиши MENU end; if ComboBox2.ItemIndex = 3 then begin for i := 1 to length(AllMWin) do Buf2[i] := AllMWin[i]; //заполняем наш буфер значениями из массива WKey.WriteBinaryData('Scancode Map',Buf2,SizeOf(Buf2)); // Отключение всех клавиш WIN и MENU end; if ComboBox2.ItemIndex = 4 then begin WKey.DeleteValue('Scancode Map'); // Отмена всех блокировок end; finally CheckRegistry; WKey.free; end; end; Для проверки того, что в необходимой мне ветке создалась нужная мне переменная была объявлена новая процедура CheckRegistry: Код:
procedure TForm1.CheckRegistry; var CheckKey: TRegistry; // Объявление переменной для работы с реестром begin CheckKey := TRegistry.Create(KEY_READ); try CheckKey.RootKey := HKEY_LOCAL_MACHINE; CheckKey.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\Keyboard Layout'); if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') else ShowMessage('Параметр блокировки отсутствует или удален!'); finally CheckKey.free; end; end; Все работает. Параметр создается и удаляется. Но я наткнулся семантическую проблему. Если приложение запущено с ограниченными правами, то при попытке выполнить данную операцию я получаю сообщение "Параметр блокировки отсутствует или удален!", что не соответствует действительности. Он и не отсутствует и не удален. С ним просто ничего не происходило, но я не могу подобрать правильный алгоритм проверки. Какой может быть выход? Дважды за операцию проверять существование параметра? Перед началом и в конце? Помогите советом, пожалуйста. |
#2
|
|||
|
|||
Варианты:
1. попросить в манифесте расширенные права для программы. 2. пытаться создавать ключ. можно дополнительный - просто для понимания - есть ли права. 3. получить security token и просто проверить - есть ли необходимые права. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
ffpereverzev (28.03.2017)
|
#3
|
||||
|
||||
Цитата:
1. У меня реализован модуль работы с реестром (запись значений, удаление значений); 2. Мне необходимо проверить - записался ли параметр в необходимый мне раздел реестра. Это реализовано с помощью дополнительной процедуры: Код:
procedure TForm1.CheckRegistry; var CheckKey: TRegistry; // Объявление переменной для работы с реестром begin CheckKey := TRegistry.Create(KEY_READ); try CheckKey.RootKey := HKEY_LOCAL_MACHINE; CheckKey.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\Keyboard Layout'); if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') else ShowMessage('Параметр блокировки отсутствует или удален!'); finally CheckKey.free; end; end; Код:
if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') 4. Проблема с проверкой удаленного ключа. Строка: Код:
else ShowMessage('Параметр блокировки отсутствует или удален!'); Код:
if CheckKey.ValueExists('Scancode Map') Теперь суть моих волнений и терзаний: Запись значений в реестр происходит только тогда, когда программа запущена от имени администратора (я пробовал прикрутить манифест к программе, чтобы затребовать повышенные права, но в Windows 10 у меня это так и не получилось. В принципе - меня и текущий вариант работы устраивает). Если программа запущена с ограниченными правами, то при выполнении данной операции ничего не происходит (то есть значения не записываются), но при этом конструкция Код:
if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') else ShowMessage('Параметр блокировки отсутствует или удален!'); Код:
ShowMessage('Блокировка выполнена успешно!') |
#4
|
||||
|
||||
Ну если ничего не записалось\удалилось из-за недостатка привилегий, вот об этом и можно предупредить, примерно так
Код:
function IsPriv: boolean; var hnd: THandle; tki: PTokenPrivileges; rln: cardinal; begin GetMem(tki, 800); OpenProcessToken(GetCurrentProcess(),$0020 or $0008,hnd); GetTokenInformation(hnd, TokenPrivileges, tki, 800, rln); Result:= tki.PrivilegeCount > 5; FreeMem(tki); end; Код:
... if IsPriv then begin if CheckKey.ValueExists('Scancode Map') then ShowMessage('Блокировка выполнена успешно!') else ShowMessage('Параметр блокировки отсутствует или удален!'); end else ShowMessage('Недостаточно прав для выполнения!'); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
ffpereverzev (28.03.2017)
|
#5
|
||||
|
||||
Спасибо большое, уважаемые lmikle и Alegun!
|