2008年05月26日

「ローカル システム アカウント」の証明書ストアへ証明書をインポートする方法

はてなブックマークに登録

■ はじめに

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 でサービスを削除しておきましょう。
なんだかパズルのようですが、これらの方法は Vista では利用できません。理由は Vista で試してみるとわかります。それでも Vista で使える方法はないものかと探していたら見つかりました。

  • 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)
klab_gijutsu2 at 13:21│Comments(0)TrackBack(0)win 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント