Windowsの設定を変更するとき、「設定項目の名前は分かっているのに、どこにあるのか分からない」ということがよくあります。
特に面倒なのがローカル セキュリティ ポリシーです。
例えば、
対話型ログオン: Ctrl + Alt + Del を必要としない
という設定を変更したい場合、secpol.mscを起動して、
「ローカル ポリシー」
→「セキュリティ オプション」
と辿って、さらに大量に並んでいる設定項目の中から目的のものを探す必要があります。
Windowsの検索から設定名を入力して、その設定画面を直接開ければ便利なのですが、
ローカル セキュリティ ポリシーについてはそう簡単にはいきません。
そこで、PowerToysのCommand Paletteからローカル セキュリティ ポリシーを検索し、
目的の設定画面を直接開ける拡張機能を作ってみました。
作ったもの
PowerToys Command Paletteの拡張機能として、ローカル セキュリティ ポリシーを検索できる Local Security Policy Search for Command Palette を作成しました。
ソースコードはGitHubで公開しています。
Microsoft Storeからも入手可能です。
Command Paletteで「secu」と入力すると、今回作成したローカル セキュリティ ポリシー検索が表示されます。

これを選択すると、ローカル セキュリティ ポリシーに存在する設定項目を一覧表示します。

もちろん、この一覧をスクロールして探すのでは意味がありません。
Command Paletteなので、そのままキーワードを入力して絞り込めます。
例えば「パスワード」と入力すると、
- パスワードの長さ
- パスワードの変更禁止期間
- Microsoft ネットワーク クライアント関連のパスワード設定
- ネットワーク セキュリティ関連のパスワード設定
など、「パスワード」に関連する設定だけが表示されます。

ここで「パスワードの長さ」を選択すると、secpol.mscが起動するだけではありません。
「パスワードの長さ」のプロパティ画面まで直接開きます。
「パスワードの長さを変更したいけど、どこにあったっけ?」
という場合でも、
Command Paletteを開く
→「パスワード」と入力
→「パスワードの長さ」を選択
だけで目的の画面まで辿り着けます。
なぜ作ろうと思ったのか
きっかけは、自分自身がローカル セキュリティ ポリシーの設定を探していたことでした。
設定したかった項目自体は分かっていたのですが、ローカル セキュリティ ポリシーを開いてから、
これ、どのカテゴリにあったっけ?
となりました。
Windowsの「設定」であれば検索から目的の設定へ移動できるものも多いのですが、secpol.mscは昔ながらのMMC(Microsoft
Management Console)です。
PowerToysにはCommand Paletteがあり、さらに拡張機能も作れるようになっています。
それなら、
「設定名を検索したら、その設定画面を直接開く」
という部分をCommand Palette側で作ってしまえばいいのでは、というのが今回の始まりです。
問題は「設定画面をどうやって直接開くか」
Command Palette側で文字列を検索すること自体は、それほど難しくありません。
問題になったのは、
検索結果を選択したあと、どうやってsecpol.mscの目的の設定まで移動するか
でした。
ローカル セキュリティ ポリシーはMMC上で動作しているため、普通のWindowsアプリのように、
secpol.msc /open "パスワードの長さ"
のような指定で個別の設定画面を開けるわけではありません。
そこで使ったのがUI Automationです。
Accessibility Insights for WindowsでUIを調査
最初に、secpol.mscの画面をUI Automationから操作できるのか調査しました。
調査にはAccessibility Insights for Windowsを使用しました。
最初はローカル セキュリティ ポリシーのUI情報をうまく取得できなかったのですが、
権限の問題があり、管理者権限で調査することでUI Automationの情報を取得できました。
調べてみると、右側に表示されるポリシーの各項目はUI Automation上ではListItemとして認識されており、
Nameから設定名も取得できます。
さらに、選択やスクロールなどに必要なAutomation Patternにも対応していました。
そのため、大まかには、
secpol.mscを起動
↓
目的のカテゴリへ移動
↓
右側の設定一覧をUI Automationで取得
↓
Nameから目的のポリシーを検索
↓
必要ならScrollIntoView
↓
対象を選択
↓
プロパティを開く
という処理で実現できます。
Command Palette上で検索しているだけに見えますが、検索結果を実行した裏側ではMMCのUIを操作しています。
権限の違いも少し厄介
もう一つ問題になるのが権限です。
ローカル セキュリティ ポリシーは管理者権限で動作するため、
通常権限で動作しているCommand Paletteから、
そのまま管理者権限のmmc.exeをUI Automationで操作しようとすると、
Windowsの整合性レベルやUIPIの影響を受ける可能性があります。
そのため、この拡張機能ではUI Automationによる操作を、
管理者権限で起動したヘルパープロセス側で実行する構成にしました。
Command Paletteの拡張機能自体を常に管理者権限で動かすのではなく、
ローカル セキュリティ ポリシーを開く必要があるタイミングで、
必要な処理だけを昇格させています。
このあたりは、普通のCommand Palette拡張を作る場合にはあまり意識しない部分かもしれません。
Command Paletteとの相性がかなりいい
実際に作ってみると、こういった機能はCommand Paletteとかなり相性がいいと感じました。
Windowsには昔から存在する管理ツールがたくさんあります。
それらは高機能なのですが、
「設定項目は知っている。でも、その設定がどこにあるのか分からない」
ということがよくあります。
Command Paletteを入口にして、
やりたいことを検索
↓
該当する設定を表示
↓
選択
↓
従来の管理画面の目的の場所を直接開く
という形にできれば、既存のWindows管理ツールを置き換えなくても、かなり使いやすくできます。
今回のローカル セキュリティ ポリシー検索は、その一例です。
まとめ
今回はPowerToys Command Paletteからローカル セキュリティ ポリシーを検索できる拡張機能を作ってみました。
単にsecpol.mscを起動するのではなく、検索結果から目的のポリシーのプロパティ画面まで直接開けるところがポイントです。
Command
Paletteの拡張機能を作り始めたときは、単純な検索機能を想定していました。
ところが実際に作ってみると、Command Paletteを「Windowsのいろいろな管理画面への検索窓」として使える可能性が見えてきました。
Windowsには、コントロール パネル、MMC、管理ツールなど、検索しづらい設定がまだまだ残っています。
こういうものをCommand Paletteから横断的に検索できるようにすると、なかなか面白そうです。
