почему мое приложение работает по-другому при запуске от имени администратора? - PullRequest
2 голосов
/ 25 сентября 2011

У меня есть небольшое приложение Delphi, которое записывает ключ в реестр LOCAL_MACHINE.Когда я запускаю его на Windows 7 professional с пользователем, имеющим права администратора, он не может записать значение, но когда я щелкаю правой кнопкой мыши и выбираю «Запуск от имени администратора», он работает.

Код:

var
   reg : TRegistry;
begin
 Result := false;

 reg := TRegistry.Create;
 reg.RootKey := HKEY_LOCAL_MACHINE;
 if (reg.OpenKey('Software\YepYep', TRUE)) then
 Begin
      try
         reg.WriteString('ProductKey', Trim(ProductKey));
         Result := true;
      finally
             reg.CloseKey();
      end;
 End;
 reg.Free;

end;

Настройки UAC компьютера установлены на «Уведомлять только тогда, когда программы пытаются внести изменения в мой компьютер» (второй самый низкий уровень).Когда я перехожу к «Никогда не уведомлять», это также работает (без необходимости использовать «Запуск от имени администратора»).

Если у вас есть какие-либо идеи / мысли по поводу того, в чем может быть проблема, я был бы признателен услышатьим.

Спасибо.

Ответы [ 3 ]

16 голосов
/ 25 сентября 2011

Проще говоря, пользователю нужны права администратора для записи в HKLM.Аналогично для записи в системные каталоги (system32, программные файлы).Это всегда было верно для версий Windows, в которых реализована защита (NT, 2k, XP, Vista, 7).

В UAC пользователи в группе администраторов по умолчанию запускают процессы со стандартным токеном пользователя.Таким образом, они не получают права на запись в HKLM и т. Д.

Вам действительно нужно прочитать UAC, прежде чем идти дальше.Начните здесь .

Как только вы ознакомитесь с проблемами, у вас есть два основных варианта:

  1. Добавить манифест requireAdministrator кваше приложение, чтобы оно всегда работало с повышенными привилегиями.Это означает, что пользователю придется согласовывать диалог UAC каждый раз, когда он запускает ваше приложение.
  2. Переработайте ваше приложение, чтобы оно не записывало в HKLM.Обычный подход - делать все, что требует прав администратора во время установки, что обычно происходит с повышенными правами.Другой вариант - выделить небольшую часть вашего приложения, которой требуются права администратора, для отдельного процесса, чтобы вы представляли диалоги UAC только при необходимости.

Из этих двух вариантов номер 2 наиболее точнобыть предпочтительным.Имейте в виду, что ваше приложение на 2000 / XP уже не работало для пользователей без прав администратора.

1 голос
/ 25 сентября 2011

Начиная с Vista, приложения больше не могут записывать в эту часть реестра.При записи в HKEY_LOCAL_MACHINE \ Software вашему приложению требуются повышенные привилегии.Чтобы обеспечить обратную совместимость с XP, они изобрели виртуализацию реестра: http://msdn.microsoft.com/en-us/library/aa965884, пожалуйста, прочитайте страницу ms, и вы поймете, почему ваше приложение не работает, когда не работает от имени администратора ...

1 голос
/ 25 сентября 2011

Учетные записи администраторов имеют ограниченный доступ из-за UAC - это дизайн Windows Vista и Windows 7. HKEY_LOCAL_MACHINE - это очень защищенное пространство.

Вы можете включить манифест для запроса при запуске приложения.

...