5

Delphiのコンポーネントを使用してHKLMレジストリに値を書き込もうとしています。TRegistry

私はWindows2000を標準ユーザーとして(またはXPを標準ユーザーとして、Windows Vistaを標準ユーザーとして、またはWindows 7を標準ユーザーとして)実行しているので、そのHKEY_LOCAL_MACHINE部分に書き込めないことを十分に期待しています。レジストリの:

reg := TRegistry.Create(KEY_WRITE);
try
   reg.Access := KEY_WRITE; //sure, set it again, why not
   reg.RootKey := HKEY_LOCAL_MACHINE;
   if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
      Exit;

   reg.WriteString('MachineId', s);
finally
   reg.Free;
end;

残念ながら、WriteStringスローERegistryException

Failed to set data for 'MachineId`

これは完全に予想されることであり、それが私が例外を回避しようとしている理由です。CanWriteStringに、またはTryWriteStringが表示されませんTRegistry

HKLMに書き込もうとしたときに例外をトリガーできないようにするにはどうすればよいですか?


自明のメモ:

  • ユーザーが実際に管理者である場合、書き込みは成功するはずです
  • WriteString呼び出しをtry-exceptでラップします。

    reg := TRegistry.Create(KEY_WRITE);
    try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      if not reg.OpenKey('\Software\Microsoft\SQMClient', True) then
         Exit;
    
      try
         reg.WriteString('MachineId', s);
      except
         on E:ERegistryException do
            {nothing};
      end;
    finally
      reg.Free;
    end;
    

    そもそも例外がスローされるのを防ぐことはできません。

更新:RTLソースから:

KEY_WRITE          = (STANDARD_RIGHTS_WRITE or
                        KEY_SET_VALUE or
                        KEY_CREATE_SUB_KEY) and not
                        SYNCHRONIZE;

MSDNから:

KEY_WRITE (0x20006)  

STANDARD_RIGHTS_WRITE、KEY_SET_VALUE、およびKEY_CREATE_SUB_KEYアクセス権を組み合わせます。

4

2 に答える 2

4

TRegistryあなたはあなたが望むように振る舞うことができません。メソッドはなくTryXXX、例外を無効にするパラメーターもありません。TRegistryメソッドがエラーまたはステータスコードを提供しないため、これが正しいことを確認できます。

Win32レジストリAPIの周りに独自のラッパーを作成する必要があります。

余談ですが、コメントで述べられてTRegistryいる、ここでの機能性に欠けているあなたの意見に同意します。レジストリ操作は失敗すると予想されるため、それに対処するために例外をキャッチする必要はありません。

于 2012-05-01T22:13:01.050 に答える
1

キーを開くときに、他の権限が含まれているので、KEY_SET_VALUE代わりに使用します。成功するということは、標準のユーザーアカウントにこれらの権限の一部があることを意味します。そのため、キーを開くことはできますが、キーを実行するまで、キーはそれをどのように処理するかを正確に認識していないため、実際に検証することはできません。使用しない場合に備えて、すべての権限を事前に設定してください。代わりに使用する場合(例で実際に必要なのはこれだけです)、ユーザーアカウントにキーにデータを書き込む権限がない場合、すぐに失敗する可能性が高くなります。セキュリティで保護可能なリソースへのアクセスに関しては、常に実際に必要な最小限の権限のみを要求してください。KEY_WRITEKEY_WRITEOpenKey()KEY_SET_VALUEOpenKey()

于 2012-05-01T22:51:26.433 に答える