C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

CLSIDの中のレジストリを削除するには?

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■90199 / inTopicNo.1)  CLSIDの中のレジストリを削除するには?
  
□投稿者/ ネット (1回)-(2019/02/16(Sat) 17:07:17)

分類:[.NET 全般] 

AVGというセキュリティソフトを使っており
エクスプローラー上で
不要な右クリックメニューが表示されるため、
レジストリを編集しています。

それで、
regファイルを作成し、

[-HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG]

を実行すると該当するレジストリを削除することができます。

これをVBで行いたいのですが、


Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG", False)


とやってもレジストリを削除することができません。

コードは間違っていないのですが、
この方法だとなぜかCLSIDの中のレジストリを編集できないようです。

どのようなコードならこれを削除することができますでしょうか?



引用返信 編集キー/
■90200 / inTopicNo.2)  Re[1]: CLSIDの中のレジストリを削除するには?
□投稿者/ 魔界の仮面弁士 (2056回)-(2019/02/16(Sat) 18:02:25)
No90199 (ネット さん) に返信
> [-HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG]

{645FF040-5081-101B-9F08-00AA002F954E} は、いわゆる「ごみ箱」ですね。
Windows は 32bit 版でしょうか、64bit 版でしょうか?

64bit OS の場合は、アプリが x64 ビルド (または 32bit優先フラグ off の AnyCPU ビルド) であるかどうかを確認しておいてください。
(CLSID\ ではなく WOW6432Node\CLSID\ が対象な場合は別として)



> Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG", False)

アプリを管理者モードで実行しているかどうかを確認しておいてください。

その上で、まずひとつ上の階層(ContextMenuHandlers) までを編集モードで OpenSubKey するようにして、
そこから DeleteSubKeyTree("AVG", False) した場合はどうでしょうか?
引用返信 編集キー/
■90201 / inTopicNo.3)  Re[2]: CLSIDの中のレジストリを削除するには?
□投稿者/ ネット (2回)-(2019/02/16(Sat) 19:55:25)


Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers", True)

Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG", False)

こういうことでしょうか?

AnyCPUにした上で、管理者モードで実行しましたが、
やはり削除されませんでした。
タスクマネージャー上で見ても64bitモードになっていることは確認できていますが。

引用返信 編集キー/
■90205 / inTopicNo.4)  Re[3]: CLSIDの中のレジストリを削除するには?
□投稿者/ 魔界の仮面弁士 (2059回)-(2019/02/17(Sun) 18:46:50)
No90201 (ネット さん) に返信
> こういうことでしょうか?

No90200 の回答は
>> そこから DeleteSubKeyTree("AVG", False) した場合
であって
> DeleteSubKeyTree("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG", False)
ではないですよ。


Using reg = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers", True)
 reg.DeleteSubKeyTree("AVG", False)
End Using
(VB.NET 2003 世代の場合は Using が使えないので、Close メソッドを用いてください)

ContextMenuHandlers キーが無い場合や権限不足の場合に備えての例外対処も忘れずに。
引用返信 編集キー/
■90206 / inTopicNo.5)  Re[4]: CLSIDの中のレジストリを削除するには?
□投稿者/ ネット (3回)-(2019/02/17(Sun) 21:23:07)
ありがとうございます。

もう一度、試してみたのですが
少し勘違いしていました。

単にAnyCPUにした上で、
Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers\AVG", False)

を実行すればうまくいきました。

64ビットモードでしか削除できないレジストリがあるのはなぜなのでしょうか?

あと、今回は必要ありませんでしたが、
管理者モードや
Using reg = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers", True)
 reg.DeleteSubKeyTree("AVG", False)
End Using

が必要となるケースはどういう時なのでしょうか?


引用返信 編集キー/
■90209 / inTopicNo.6)  Re[5]: CLSIDの中のレジストリを削除するには?
□投稿者/ Atata!! (6回)-(2019/02/17(Sun) 23:43:55)
64 ビット OS の HKEY_CLASSES_ROOT は魔窟です。

このキーは大抵の場合、以下のレジストリキーをマージしたものが表示されます。

HKEY_LOCAL_MACHINE\Software\Classes
HKEY_LOCAL_MACHINE\Software\WOW6432Node\Classes
HKEY_CURRENT_USER\Software\Classes

AD や RAS を使用している場合等ではさらに関係するキーが増えますが、
ここでは説明がめんどくさいので実施しません。

マージの優先順位は該当プロセスが 32 ビットか 64 ビットかによって変わり、さらに項目毎にルールがあります。
64 ビットプロセスであれば、HKEY_LOCAL_MACHINE\Software\Classes に
HKEY_LOCAL_MACHINE\Software\WOW6432Node\Classes を追加(一致していない分を足した)したものに
対して更に HKEY_CURRENT_USER\Software\Classes の内容で上書きするようなイメージになります。

概ね、ユーザーの利便性にかかわるファイルの関連付け等は HKEY_CURRENT_USER が優先(上書きイメージ)され、
システム的な動作に影響するものは HKEY_LOCAL_MACHINE が優先(上書きできない)されます。

これを踏まえて回答します。


> 64ビットモードでしか削除できないレジストリがあるのはなぜなのでしょうか?

上述の通り 64 ビット OS では 32 ビットの HKEY_CURRENT_USER\Software\Classes に該当するものがありません。
そのためユーザー毎のファイルの関連付け等の設定は 64 ビット側に保持されることになっています。
これが 32 ビット側では関連付けを削除できない理由になります。

# ただ、大昔の記憶では 32 ビット用の設定もあったような気がしましたが、探すと無いので・・・。


> あと、今回は必要ありませんでしたが、
> 管理者モードや

HKEY_LOCAL_MACHINE 側に設定された関連付けを削除する場合、管理者モードが必要になります。
該当ソフトウェアではユーザー側のレジストリしか更新していないので、管理者なしで関連付けを削除できていると思います。

なお、ユーザーを新規作成する際のデフォルトの関連付けは以下のレジストリに記録されています。
HKEY_USERS\.DEFAULT\Software\Classes
今後、追加するユーザーに対しても同じ設定を実施する場合、上記を編集しておきましょう。


> Using reg = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\shellex\ContextMenuHandlers", True)
>  reg.DeleteSubKeyTree("AVG", False)
> End Using
>
> が必要となるケースはどういう時なのでしょうか?

こっちは特殊なケースで必要になることがあります。大抵は不要ですが。
セキュリティポリシーで「走査チェックのバイパス」を有効にしている場合(大抵有効になっていますが)、
親キーに対するアクセス許可がなくても子キーに対するアクセス許可があれば該当キーを操作可能です。
https://docs.microsoft.com/ja-jp/windows/security/threat-protection/security-policy-settings/bypass-traverse-checking

セキュリティポリシーの「走査チェックのバイパス」を無効にはできないが、
親キーとの関連によって子キーの操作可否を決定しなければならない特殊な要件に対しては上記のような記述を実施せざるを得ません。

# 今回はあんまり関係ありませんでしたが・・・




ファイルの関連付けに限定して言えば、エクスプローラー自体にも関連付けの設定があり、
それも影響してきますが、今回は関係ないため割愛しています。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ