3

次のコードを使用して、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

私のレジストリで。管理者権限は必要ですか? 他に何をする必要がありますか?

追加: 私はもっとよく説明し、私がやろうとしていることについて本当に質問する必要があります. 起動時にアプリを自動的に実行しようとしています。多くのアプリケーションは、管理者権限を必要としないように見えますが、これを行っています。これを行う通常の方法は何ですか?

4

2 に答える 2

8

まず、そこに書き込むには管理者権限が必要です。ほとんどの場合、このキーに書き込みを行うのは単なるインストーラーであり、通常は管理者特権で実行されます。これが目的の場合は、アプリケーション マニフェストにこれを追加します。

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

この書き込みHKLMが昇格を必要としないアプリケーションから行われている場合は、HKLMそのレジストリ キーの書き込みのみが昇格を必要とするように、書き込みを別のプロセスに分離することを検討してください。これは UAC のベスト プラクティスです。

もう 1 つの問題は、Delphi アプリが 32 ビットになるため、レジストリ リダイレクトの対象になることです。のアクセスはHKLM\SoftwareにリダイレクトされHKLM\Software\Wow6432Nodeます。

64ビットシステムでは、書き込みをHKLM\Software試みる必要があると思うので、リダイレクトを無効にする必要があります。KEY_WOW64_64KEYこれを行うには、インスタンスのAccessプロパティに含めTRegistryます。

RunWindows は、処理時にレジストリの両方のビューとキーをマージしますRunOnceが、この特定のキーのレジストリの 64 ビット領域に書き込むと、アプリケーションはより明確な痕跡を残します。

于 2011-08-08T15:35:26.433 に答える
3

はい、HKEY_LOCAL_MACHINEを変更するには管理者権限が必要です。

3つの可能性:

  1. そのキーを使用して別の方法を見つけないでください。
  2. ここを読んでください。アプリマニフェストがその方法かもしれません(「アプリケーションマニフェストを使用した必要な権限のマーク付け」のセクション)。これにより、ユーザーがアプリを起動するときに同意を求められます。それが簡単な方法です。
  3. ユーザーが管理者権限なしでアプリケーションを実行し、それらを必要とするコードを別の実行可能ファイルに配置できるようにします。これをオンデマンドで、ユーザーが要求した場合にのみ実行します。それが好ましい方法です。

追加された部分を編集します。

代わりにHKEY_CURRENT_USERを使用してみましたか?これにより、現在のユーザーに対してのみアプリが実行されますが、レジストリに書き込むために管理者権限は必要ありません。

于 2011-08-08T15:29:44.837 に答える