Почему я не могу сделать запись RunOnce в реестре Windows, используя TRegistry и Delphi? - PullRequest
3 голосов
/ 08 августа 2011

Я использую следующий код, чтобы попытаться сделать запись RunOnce:

program RunOnceTest;

{$APPTYPE CONSOLE}

uses
  SysUtils, Registry, Windows;

var
  R: TRegistry;
begin
  try
    WriteLn('Testing RunOnStartup.......');


    R := TRegistry.Create;
    try
      R.RootKey := HKEY_LOCAL_MACHINE;
      R.LazyWrite := False;
      R.OpenKey('Software\Microsoft\Windows\CurrentVersion\RunOnce', True) ;
      R.WriteString('this', 'that') ;
      R.CloseKey;
    finally
      R.free;
    end;

    WriteLn('Test Finished');

    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Я запускаю приложение, и оно выполняется.

Однако в моем реестре нет записи по адресу:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ RunOnce

.Нужны ли мне права администратора?Что еще мне нужно сделать?

ДОБАВЛЕНО: Я должен объяснить лучше и действительно задать вопрос о том, что я пытаюсь сделать.Я пытаюсь заставить мое приложение работать автоматически при запуске.Многие приложения делают это, не требуя прав администратора.Какой нормальный способ сделать это?

Ответы [ 2 ]

8 голосов
/ 08 августа 2011

Прежде всего вам нужно иметь права администратора, чтобы писать там. В основном это просто установщики, которые пишут в этот ключ, и они обычно работают с повышенными правами. Добавьте это в манифест своего приложения, если вы хотите именно так:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel
        level="requireAdministrator"
        uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>

Если эта запись в HKLM выполняется из приложения, которое иначе не требует повышения прав, тогда рассмотрите возможность разделения записи в HKLM в отдельный процесс, чтобы только запись этого раздела реестра требовала повышения прав. Это лучшая практика с UAC.

Еще одна вещь, которая может вас укусить, это то, что ваше Delphi-приложение будет 32-разрядным и поэтому будет перенаправлено в реестр. Доступ HKLM\Software будет перенаправлен на HKLM\Software\Wow6432Node.

В 64-битной системе я думаю, что вы должны попытаться записать в HKLM\Software, поэтому вам нужно отключить перенаправление. Сделайте это, включив KEY_WOW64_64KEY в свойство Access вашего TRegistry экземпляра.

Windows объединит оба представления реестра при обработке ключей Run и RunOnce, но ваше приложение оставит более четкие следы, если вы запишете в 64-битную область реестра для этого конкретного ключа.

3 голосов
/ 08 августа 2011

Да, для изменения HKEY_LOCAL_MACHINE требуются права администратора.

Три возможности:

  1. Не используйте этот ключ и найдите другой способ.
  2. Прочитайте здесь. Возможно, вам подойдет манифест приложения (раздел «Пометка необходимых привилегий с помощью манифеста приложения»).Это будет запрашивать согласие пользователя при запуске приложения.Это простой способ.
  3. Позвольте пользователю запускать ваше приложение без прав администратора и помещать требуемый код в другой исполняемый файл.Запустите это по требованию и только если пользователь запросил это.Это предпочтительный способ.

Редактировать для добавленной детали:

Вы пытались использовать вместо этого HKEY_CURRENT_USER?Приложение запускается только для текущего пользователя, но вам не нужны права администратора для записи в реестр.

...