VB.NETでレジストリキーを削除したかった

以下記事を参考にしてレジストリ削除を作っていた
https://dobon.net/vb/dotnet/system/registrykey.html

DeleteSubKeyだと子のサブキー有無でエラーが出るとのことで、
面倒なので根こそぎ削除のDeleteSubKeyTreeを使用。

ソースは以下の1行(レジストリキーは仮)

Microsoft.Win32.Registry.ClassesRoot.DeleteSubKeyTree("CLSID\{D27BBBBB-AAAA-99da-0000-929678640000}",False)

実際に動かすと何の反応もないので、第2引数をtrueにしてtrycatch入れると以下のエラーが出ていた。

System.ArgumentException: 'サブキーが存在しないため、サブキー ツリーを削除できません。'

削除前に

regkey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\{D27BBBBB-AAAA-99da-0000-929678640000}", False)
If regkey Is Nothing Then
  Debug.Print("CLSID\{D27そんざいしないよ")
  regkey.Close()
  Exit Sub
End If

といった形で存在チェックしてるしサブキーはあるはずだよなと思ったけど、お試しでDeleteSubKeyにしてみて実行。

Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\{D27BBBBB-AAAA-99da-0000-929678640000}", True)

すると以下のエラー。

System.InvalidOperationException: 'レジストリ キーはサブキーを含んでいるため、再帰的な削除はこのメソッドではサポートされません。'

サブキーあるのかないのかどっちなんだい?

これが堂々巡りってやつか。



エラーの理由は薄々勘づいてはいたけど権限がないとかそのあたり。

サンプルと違ってHKEY_CLASSES_ROOT内を触るには管理者権限が必要っぽい。
ビルドしたexeを管理者権限で実行したら普通に削除成功していた。

開発環境のユーザーアカウント制御設定を「通知しない」にしたり管理者権限付与したりとゆるゆるにしていたから
そもそもレジストリは弄るのにある程度の権限が必要なことも忘れていたよ。


フォーム内のボタンオンオフでさくっとレジストリ弄るやつ作りたかったけど、
自分用ならともかくとして配布するようなツールじゃ諦めるしかないかねえ。
登録する内容が内容だからとてもじゃないけど管理者権限での起動なんてさせられねえや。