2008年05月26日
「ローカル システム アカウント」の証明書ストアへ証明書をインポートする方法
■ はじめに
Windows のサービスプログラムを実行するためのアカウントはサービスごとに個別に指定することができます。ここでは一般のログオンアカウントのほかに、組み込みアカウントである 「ローカル システム アカウント」(LocalSystem account) を指定することができます。
サービスによっては証明書ストアへインポートずみの証明書を処理の中から参照するものもあるでしょう。その場合はサービスを実行するアカウントのストアへあらかじめ証明書をインポートしておけばよいわけですが、「ローカル システム アカウント」の場合にはどうすればよいでしょう?
あるユーザのログオンセッション内で普通にインポートを行うと、その証明書はそのアカウント専用のストアへ格納されます。しかし、ローカル システム アカウントを使って Windows へログオンすることはできません。そのため、ちょっとした工夫が必要になります。今回はその方法をご紹介します。
なお、サービス側が「実行中のアカウント自身の証明書ストア」以外を併せて参照する作りになっていれば、それに準じた操作を行うことで実用上の支障はないでしょう。それでもこの話題に興味があるっ!という方 (筆者もです^^;) にはご参考となれば幸いです。
まず、管理者権限のあるアカウントでログオンし、cmd.exe を実行して下さい。 Windows 2000/ XP の場合は、そのコンソール上で下記のいずれかの操作を行うことで、ローカル システム アカウントのセキュリティコンテキストで新しい DOS コンソールを開くことができます。
※ Sc.exe は Windows 2000 には標準で含まれていません。リソースキットに含まれています。
%APPDATA%\Microsoft\SystemCertificates
ちなみに、上記手順で MMC 証明書スナップインの追加時に「サービスアカウント」を選択して処理を行った場合、証明書データはレジストリの HKEY_LOCAL_MACHINE 配下の下記の場所へ格納されます。
サービス側が証明書を検索する際にこういったグローバルな場所を参照する仕様であれば、ローカル システム アカウント自身のストアへ証明書を配置する代わりにこれらを利用することが可能です。
(tanabe)
Windows のサービスプログラムを実行するためのアカウントはサービスごとに個別に指定することができます。ここでは一般のログオンアカウントのほかに、組み込みアカウントである 「ローカル システム アカウント」(LocalSystem account) を指定することができます。
サービスによっては証明書ストアへインポートずみの証明書を処理の中から参照するものもあるでしょう。その場合はサービスを実行するアカウントのストアへあらかじめ証明書をインポートしておけばよいわけですが、「ローカル システム アカウント」の場合にはどうすればよいでしょう?
あるユーザのログオンセッション内で普通にインポートを行うと、その証明書はそのアカウント専用のストアへ格納されます。しかし、ローカル システム アカウントを使って Windows へログオンすることはできません。そのため、ちょっとした工夫が必要になります。今回はその方法をご紹介します。
なお、サービス側が「実行中のアカウント自身の証明書ストア」以外を併せて参照する作りになっていれば、それに準じた操作を行うことで実用上の支障はないでしょう。それでもこの話題に興味があるっ!という方 (筆者もです^^;) にはご参考となれば幸いです。
手順 1: ローカル システム アカウントで DOS コンソールを開く
まず、管理者権限のあるアカウントでログオンし、cmd.exe を実行して下さい。 Windows 2000/ XP の場合は、そのコンソール上で下記のいずれかの操作を行うことで、ローカル システム アカウントのセキュリティコンテキストで新しい DOS コンソールを開くことができます。
※ Sc.exe は Windows 2000 には標準で含まれていません。リソースキットに含まれています。
- AT コマンドを使う方法 (XP, 2000)
これは、at コマンドから登録されたジョブが ローカル システム アカウントで稼働中の Task Scheduler サービスによって処理されることを利用した方法です。参考記事C:\>time 現在の時刻: 20:27:22.23 新しい時刻を入力してください: C:\>at 20:28 /interactive cmd.exe 新しいジョブをジョブ ID = 1 で追加しました。
指定時刻になったら新しいコンソールが開きます。開いたら at /delete で作業用ジョブを削除しておきましょう。
- SC コマンドを使う方法 (XP, 2000)
これは、SC コマンドを使って「ローカル システム アカウントで起動するダミーのサービス」を登録し、それを開始する方法です。参考記事
C:\>sc create _dummy binPath= "cmd.exe /K start" type= own type= interact [SC] CreateService SUCCESS C:\>sc start _dummy [SC] StartService FAILED 1053:
※'=' のあとのスペースに注意cmd.exe はサービスプログラムではないため sc start コマンドでサービスとして開始しようとしてもサービスサービスコントローラとの応酬に失敗し上記のエラーとなりますが、/K オプションの効果で別のコンソールがちゃんと開きます。開いたら、sc delete _dummy でサービスを削除しておきましょう。
- PsExec ユーティリティを使う方法 (Vista, XP, 2000)
PsExec は、著名な Sysinternals の Mark Russinovich 氏の手による優れたコマンドラインツールです。ここではこのツールの詳細は割愛しますが、PsExec を使うと下記の操作によりローカル システム アカウントで DOS コンソールを開くことが可能です。
# Vista で UAC を有効にしている場合には最初のコンソールを開く際に「管理者として実行」することをお忘れなく。C:\>psexec -i -s cmd.exe PsExec v1.94 - Execute processes remotely Copyright (C) 2001-2008 Mark Russinovich Sysinternals - www.sysinternals.com
Sysinternals は先年 Microsoft 傘下に収まったため、この PsExec は現在 Microsoft 社のサイトで公開されています。 PsExec のページ
手順 2: 証明書をインポートする
1: の手順によりローカル システム アカウントで DOS コンソールを開くことができればあとは簡単です。
このコンソールから mmc.exe を実行して下さい。
MMC コンソールが立ち上がったら [ファイル] メニューの [スナップインの追加と削除] から「証明書」のスナップインを「追加」します。対象とするストアの種類を尋ねられますので「ユーザーアカウント」を選択します。
MMC のコンソールルート下に追加された「証明書 −現在のユーザー」のノードを展開し、ツリー上の所定の子ノードの右クリックメニューから [すべてのタスク] - [インポート] を実行すれば OK です。
この手順でインポートした証明書は、通常のログオンアカウントからインポートを行った場合と同様に、レジストリの HKEY_USERS 配下で管理されます。
HKU\[当該アカウントのSID]\Software\Microsoft\SystemCertificates当該アカウントのセキュリティコンテキスト下では、この HKU\[SID] が、HKEY_CURRENT_USER に割り当てられます。
※ローカル システム アカウントの SID は「S-1-5-18」ですまた、証明書データの実体はファイルとして下記のパスへ配置されます。
%APPDATA%\Microsoft\SystemCertificates
※ローカル システム アカウントの %APPDATA% には下記のパスが該当します
%WINDIR%\system32\config\systemprofile\Application Data
ちなみに、上記手順で MMC 証明書スナップインの追加時に「サービスアカウント」を選択して処理を行った場合、証明書データはレジストリの HKEY_LOCAL_MACHINE 配下の下記の場所へ格納されます。
HKLM\Software\Microsoft\Cryptography\Services\ [サービス名]\SystemCertificates同じく、証明書スナップインの追加時に「コンピュータアカウント」を選択すると下記の場所へ格納されます。
HKLM\Software\Microsoft\SystemCertificates
サービス側が証明書を検索する際にこういったグローバルな場所を参照する仕様であれば、ローカル システム アカウント自身のストアへ証明書を配置する代わりにこれらを利用することが可能です。
(tanabe)