Показать сообщение отдельно
  #3  
Старый 28.03.2017, 20:59
Аватар для ffpereverzev
ffpereverzev ffpereverzev вне форума
Новичок
 
Регистрация: 14.02.2017
Сообщения: 50
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Варианты:
1. попросить в манифесте расширенные права для программы.
2. пытаться создавать ключ. можно дополнительный - просто для понимания - есть ли права.
3. получить security token и просто проверить - есть ли необходимые права.
Я, наверное, не совсем понятно объяснил суть проблемы. Мне не надо менять ничего в правах доступа программы (у меня реализована проверка прав пользователя при запуске программы и выдается предупредительное сообщение, если программа запущена не с администраторскими правами - этого вполне достаточно для моих целей). Проблема в том, что я...как бы это выразить...зациклился. Сейчас попробую объяснить еще раз:

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;
3. Пока выполняется проверка записанного параметра - все в порядке. Конструкция:
Код:
if CheckKey.ValueExists('Scancode Map') then
          ShowMessage('Блокировка выполнена успешно!')
полностью работоспособна;
4. Проблема с проверкой удаленного ключа. Строка:
Код:
else
          ShowMessage('Параметр блокировки отсутствует или удален!');
Проблема какого рода: данная конструкция сработает только тогда, когда я попытаюсь записать параметр, а он не запишется. То есть когда после выполнения процедуры записи в строке
Код:
if CheckKey.ValueExists('Scancode Map')
сформируется значение "False".
Теперь суть моих волнений и терзаний: Запись значений в реестр происходит только тогда, когда программа запущена от имени администратора (я пробовал прикрутить манифест к программе, чтобы затребовать повышенные права, но в Windows 10 у меня это так и не получилось. В принципе - меня и текущий вариант работы устраивает). Если программа запущена с ограниченными правами, то при выполнении данной операции ничего не происходит (то есть значения не записываются), но при этом конструкция
Код:
  if CheckKey.ValueExists('Scancode Map') then
          ShowMessage('Блокировка выполнена успешно!')
        else
          ShowMessage('Параметр блокировки отсутствует или удален!');
все равно срабатывает. А самое интересное, что если перед этим программу запустить от имени администратора, выполнить запись значений в реестр, а затем запустить программу с ограниченными правами и выполнить то же действие - то появляется сообщение:
Код:
ShowMessage('Блокировка выполнена успешно!')
Но ведь в реальности-то ничего не записывалось! Возможно Вы правы и мне придется как-то ограничить действие программы, если она запущена с ограниченными правами. Но может есть какой-то другой путь, которого я просто не вижу?
Ответить с цитированием