2016-06-17 5 views
2

私は、FTDIシリアル> USBコンバータを使用してデバイスをテストするためにPCを設定するプロセスを自動化するユーティリティを作成しようとしています。これには、インストールされたデバイス情報を検索し、上記のハイブに書き込む必要があります。特権の昇格を実装してプログラムに署名しましたが、鍵を開くことができません。私は親を開くことはできますが、 "列挙型"キーを開くことはできません。Delphi 2010プログラムから 'HKLM \ SYSTEM CurrentControlSet Enum'を開くことができないのはなぜですか?

procedure TForm4.Button1Click(Sender: TObject); 
var 
    aReg: TRegistry; 
    sl: TStringList; 
begin 
    aReg := TRegistry.Create; 
    try 
    aReg.RootKey := HKEY_LOCAL_MACHINE; 
    if aReg.OpenKey('\SYSTEM\CurrentControlSet\Enum', false) then // \Enum\USB\VID_0403&PID_6001', false) then 
    begin 
     sl := TStringList.Create; 
     try 
     aReg.GetKeyNames(sl); 
     Memo1.Lines.Assign(sl); 
     Memo1.Lines.Add(IntToStr(sl.Count) + ' keys found.'); 
     finally 
     sl.Free; 
     end; 
    end else 
     Memo1.Lines.Add('Could not open key'); 
    finally 
    aReg.Free; 
    end; 
end; 
+0

デフォルトでは、「システム」にフルコントロールアクセス権しかありません。 「管理者」ではそうではありません。 regeditプログラムを使用すると、キーのアクセス許可を表示できます。理由[ここ](https://msdn.microsoft.com/en-us/library/windows/hardware/ff546173(v=vs.85).aspx)を読むことができます。 'OpenKeyReadOnly'を使用して情報を読むことはできますが、リンクに記載されているAPIを使用する方がよいでしょう。 –

+0

エラーがないかどうかをテストし、それらを提供することをお勧めします。TRegistry.Create(KEY_READ); – FredS

+1

@FredS:OpenKey()の代わりに 'OpenKeyReadOnly()'を使う方が良いでしょう。 –

答えて

7

「管理者」は、デフォルトでEnumキーにフルアクセスできません。したがって、アクセス権がKEY_ALL_ACCESSの鍵を開く場合は、特権の昇格は役に立ちません。

TRegistyは、コンストラクタまたはAccessプロパティで異なるアクセスを指定しないかぎり、デフォルトでは操作としてKEY_ALL_ACCESSを使用します。あなたはそれに内容を読み取るために、キーを開いているとき

、次のいずれかを実行します

  • オーバーロードされたコンストラクタを使用して、所望のアクセスとしてKEY_READを指定します。

  • KEY_READにアクセスするには、Accessプロパティを使用して、キーを開く前にアクセスします。

  • OpenKey()の代わりにOpenKeyReadOnly()を使用してください。

しかし、MSDNでこのノートを注意してください:

HKLM\SYSTEM\CurrentControlSet\Enum Registry Tree

列挙ツリーは、システムコンポーネントを操作して使用するために予約され、そのレイアウトが変更されることがあります。ドライバとユーザーモードDevice Installation Componentsは、IoGetDevicePropertySetupDiGetDeviceRegistryPropertyなどのシステム提供機能を使用して、このツリーから情報を抽出する必要があります。 ドライバおよびWindowsアプリケーションは、Enumツリーに直接アクセスしてはなりません。ドライバをデバッグするときにレジストリエディタを使用して、Enumツリーを直接表示できます。

ドキュメントに記載されている代替APIの使用を検討する必要があります。

+0

ああ、これは有望そうです。ご協力いただきありがとうございます。 – user1998520

関連する問題