3

現在、すべての自動実行のリストを取得しようとしていますが、64ビットシステムで苦労しています。私が使用するとき:

My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", False)

次のエントリが表示されます。

My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run", False)

なぜ、そして/またはこれを修正する方法を知っている人はいますか?

また、HKLM \ ..\Runの項目はHKLM\.. \ Wow6432Node ..\Runの項目とは異なることを述べておく必要があります。

4

2 に答える 2

4

プロセスは32ビットプロセスであるため、64ビットOSでは、レジストリリダイレクタが機能します。HKLM\Softwareキーはリダイレクトされ、プロセスが検出している32ビットビューと64ビットビューの2つのビューがあります。

64ビットプロセスを実行すると、レジストリの64ビットビューが表示されるのは事実です。しかし、それは完全な話ではありません。WindowsCurrentVersion\Runは、レジストリの32ビットビューと64ビットビューの両方からのエントリを処理します。したがって、x64またはAnyCPUプロセスに切り替えたばかりの場合、32ビットレジストリビューに保存されている自動実行が失われます。

したがって、すべての自動実行を一覧表示することが目標であるため、レジストリの32ビットビューと64ビットビューの両方を読み取る必要があります。これは、.net 4で導入された列挙を使用して行うことができますRegistryView。これにより、32ビットプロセスがレジストリの64ビットビューにアクセスできるようになります。実際、64ビットプロセスがレジストリの32ビットビューにアクセスできるようにします。

32ビットシステムと64ビットシステムの両方で実行されるプロセスが必要な場合は、x86またはAnyCPUのいずれかをターゲットにする必要があります。そしてRegistryView、64ビットシステムで実行していることを検出した場合は、を使用してレジストリの両方のビューを読み取ります。

于 2012-12-01T14:10:46.177 に答える
2

これは、アプリケーションがx86プラットフォーム用にコンパイルされ、64ビットオペレーティングシステムで実行されているために発生します。MSDNにレジストリリダイレクトに関する包括的な記事があります

レジストリリダイレクタは、WOW64上のレジストリの特定の部分の個別の論理ビューを提供することにより、32ビットと64ビットのアプリケーションを分離します。レジストリリダイレクタは、32ビットおよび64ビットのレジストリ呼び出しをそれぞれの論理レジストリビューにインターセプトし、対応する物理レジストリの場所にマップします。リダイレクトプロセスは、アプリケーションに対して透過的です。したがって、32ビットアプリケーションは、データが64ビットWindowsの別の場所に格納されている場合でも、32ビットWindowsで実行されているかのようにレジストリデータにアクセスできます。

AnyCPUプラットフォーム用にアプリケーションをコンパイルする際の問題を修正できます

于 2012-12-01T13:32:11.880 に答える