ユーザーに発行された証明書をPowerShellから参照する方法

書籍「PowerShellによるWindowsサーバ管理術」や先日のWindows Server World Conferenceでも紹介させていただきました、
Windows Server 2008 R2からサポートされるActive Directory用PowerShellコマンドレットですが、
その中にユーザー情報を表示するGet-ADUserコマンドレットがありました。

Get-ADUserコマンドレットを実行したときに表示される項目の一覧は、Get-Memberコマンドレットで
MemberTypeがPropertyのものを見れば確認できます。

もし、ここに表示されていない項目で見たい項目があれば、
そのときはGet-ADUserコマンドレットのPropertiesオプションを使います。
例えば、パスワードを間違えた回数(badpwdCount属性)を表示させたければ、


PS C:>Get-ADUser $username -Properties "badpwdCount"

と入力すれば、badpwdCount属性がGet-MemberコマンドレットのProperty一覧に追加されます。
こうやって、Get-ADUserコマンドレットを使えば、何でもユーザーの情報を表示できますね。

ここからが今日のテーマです。
Active Directoryでユーザー認証を行うとき、ユーザーとパスワードではなく、証明書を使う方法があります。
IEEE802.1x認証を実装するときやスマートカードを使って認証するときなどは証明書を使いますね。
このとき、メンテナンスやトラブルシューティングなどの目的で
ユーザーに対して発行された証明書を確認したいと思うことがあると思いますが、確認する方法は大きく分けて2つあります。

1.証明書が発行されたユーザーのコンピュータで、MMCまたはIEを使って確認する (クライアントコンピュータから確認する方法)
2.Active Directoryユーザーとコンピュータで、ユーザーのプロパティを開いて確認する (サーバーから確認する方法)

いずれの方法もちょっとばかり面倒なので、もっと簡単に参照する方法はないかなと思っていたのですが、
今紹介したGet-ADUserコマンドレットを使えば、2.の方法を簡略化できるじゃありませんか。

PS C:>$username = "Kunii"
PS C:>$user = Get-ADUser $username -Properties "Certificates"
PS C:>
PS C:>$user.Certificates | Format-List

Handle  : 450552816
Issuer   : CN=example-DC01-CA, DC=example, DC=com
Subject : CN=Kunii,OU=Lab,DC=example,DC=com

PS C:>

ちなみに、すべてのユーザーに関して、まとめて参照する場合だったら、
このようにスクリプトを作ればよいと思います。

$users=Get-ADUser

Foreach ($user in $users)
{
  $user1 = Get-ADUser $user -Properties "Certificates"
  $user1.Certificates | Format-List
}

ちなみに、USマイクロソフトのActive Directory PowerShell Teamのブログ(またまた英語)では証明書の更新方法も紹介しています。
証明書の更新はActive Directoryに対する操作ではなく、証明書サービス(すっかり忘れていたけど、証明書サービスもActive Directoryの一員でしたね)
に対する操作ですから、Active Directoryのコマンドレットは使えず、
.NETクラスのSystem.Security.Cryptography.X509Certificates.X509Certificateを使って作ることになります。

根っからのIT Proの私としては、.NETと聞いただけで頭が痛くなりますが、(ちなみに英語はもっと頭が痛い!)
ここはがんばって使ってみたいと思います。
おわり (結局、.NETクラスを使うのは先延ばしってことで)