2011-08-08 7 views
3

Я использую следующий код, чтобы попытаться сделать запись RunOnce:Почему я не могу сделать запись RunOnce в реестре Windows, используя TRegistry и Delphi?

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

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

ADDED: Я должен объяснить лучше и действительно задать вопрос о том, что я пытаюсь сделать. Я пытаюсь запустить приложение автоматически при запуске. Лоты приложений делают это, не требуя привилегий администратора. Каков нормальный способ сделать это?

+1

Для записи в HKEY_LOCAL_MACHINE вам понадобятся права администратора, да. – martinstoeckli

+0

Какую версию ОС вы используете? И да, вам нужны привилегии администратора. Если Vista/Win7 - попробуйте щелкнуть правой кнопкой - запустите как администратор. –

+0

Это Windows 7/64. И поэтому я думаю, теперь мне нужно выяснить, как получить пользовательские привилегии в моем приложении, а? Отлично ..... –

ответ

8

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

<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 будет объединять оба представления реестра при обработке ключей и RunOnce, но ваше приложение оставит более четкие маршруты, если вы напишете в 64-битную область реестра для этого конкретного ключа.

+0

Знаете ли вы, работает ли RunOnce в обоих представлениях реестра или только на родном? Так будет ли это работать, если он напишет 32-битное представление? –

+0

@Heinrich Я считаю, что Windows объединяет оба представления этого ключа. Это, безусловно, делает это для «HKLM \ Software \ ... \ Run». Но я всегда предпочитаю писать на родной ключ. Мое рассуждение состоит в том, что ключ интерпретируется системной оболочкой, а системная оболочка - 64 бит. –

+0

Разумная мысль. Не слияние также нарушит совместимость с приложениями, не заботясь о написании «другой стороны». –

3

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

Три варианта:

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

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

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