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アクセス権を組み合わせます。