![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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!
|