ピッシーのメモ帳

気になった情報の保管庫

一般ユーザーでログインしてレジストリを修正するときの注意点

一般ユーザーでログインしてレジストリを修正するときに、ちょっとした注意点に気づいたのでメモ。気づいた経緯を含めて書いているので、手っ取り早く知りたい方は直接まとめに飛んでもらってもかまわない。

 

経緯

今回一般ユーザーでレジストリの修正が必要だったのは、ある一般ユーザーでファイルの関連付けがおかしくなって設定アプリでは対処できなかったから。ある意味苦肉の策と言える。今回はレジストリのHKEY_CURRENT_USERを触ることになった。

一般ユーザーとレジストリエディタ

レジストリを修正するとき、一般的にはレジストリエディタを起動することが多いだろう。レジストリエディタを起動するには管理者権限が必要なので、起動時にユーザーアカウント制御が求められる。そのため、一般ユーザーは安易にレジストリには触れないようになっている。

本来なら管理者権限を持つユーザーでログインしてレジストリエディタを起動するべきだが、変更するレジストリが「HKEY_CURRENT_USER」、つまりログイン中のユーザーに関するレジストリだったので、一般ユーザーでログインしないといけないかなと思ってそのようにした。

レジストリを見たときの違和感

一般ユーザーでレジストリエディタを起動してHKEY_CURRENT_USERを確認すると、存在するはずのレジストリキーが見当たらなかった。いろいろ調べてみると、どうやらHKEY_CURRENT_USERのレジストリは一般ユーザーではなくユーザーアカウント制御で使用したユーザーのレジストリが表示されていることが分かった。

ということは、一般ユーザーではHKEY_CURRENT_USERのレジストリは修正できないのだろうか?

HKEY_CURRENT_USERとHKEY_USERS

レジストリエディタをよく見ると、HKEY_USERSという項目がある。これについては、以下のページで詳しい解説がある。

clairdeluna-eve.hatenablog.com

ログイン時に、HKEY_CURRENT_USERのレジストリキーはHKEY_USERSからコピーされるということか。つまり、一般ユーザーのHKEY_CURRENT_USERを修正するにはHKEY_USERSのレジストリを修正すればいいことになる。

しかし、困ったことにHKEY_USERSではユーザー名ではなくセキュリティ識別子(SID)と呼ばれる特別なIDで管理されている。

learn.microsoft.com

以下、リンク先本文より引用。

セキュリティ識別子は、セキュリティ プリンシパルまたはセキュリティ グループを一意に識別するために使用されます。 セキュリティ プリンシパルは、オペレーティング システムによって認証できる任意のエンティティ (ユーザー アカウント、コンピューター アカウント、ユーザーまたはコンピューター アカウントのセキュリティ コンテキストで実行されるスレッドまたはプロセスなど) を表すことができます。

少し難しい説明だが、このようなIDで管理されているようなので一般ユーザーのセキュリティ識別子(SID)を調べる必要が出てきた。

一般ユーザーのセキュリティ識別子(SID)を調べる

一番簡単なのはwhoamiコマンドだと思う。*1

C:\>whoami /user

USER INFORMATION
----------------

ユーザー名  SID
=========== ==============================================
pc01\user01 S-1-5-21-(以下省略)

通常、ユーザーのセキュリティ識別子(SID)は「S-1-5-21」から始まる。このSIDを控えてHKEY_USERSを確認する。

まとめ

  • 一般ユーザーでレジストリエディタを起動したときに表示されるHKEY_CURRENT_USERは、一般ユーザーではなくユーザーアカウント制御で使用したユーザーのレジストリ。
  • 一般ユーザーのHKEY_CURRENT_USERを修正するには、HKEY_USERSを修正する。ただし、一般ユーザーでログインする必要はなく、管理者権限を持つユーザーでログインしてHKEY_USERSを修正すればいい。
  • HKEY_USERSはセキュリティ識別子(SID)で管理されている。なので、事前に一般ユーザーのセキュリティ識別子(SID)を調べておく必要がある。
  • そもそも一般ユーザーでレジストリエディタを起動するべきではない。

*1:他にセキュリティ識別子を調べる方法として、wmicを使う方法とPowerShellを使う方法がある。どちらもWMIのwin32_UserAccountクラスからSIDを取得する。