マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

タスク = タスク・スケジューラ = Windowsサービスのため

「タスク・スケジューラもWindowsサービス」です。

Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。

アカウント関係

  • IISでは、「Network Service」を使用します。
  • タスク スケジューラでは、「System」(LocalSystem?)を使用します。
  • このため、Windowsサービスやタスク スケジューラからの実行では、
    普段意識していないOSやAPIの認証機構の存在を意識する必要があります。

runasコマンド実行アカウントを指定する(アンマッチ)

runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、
コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので
非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。

タスク スケジューラの実行アカウントを指定する

タスク スケジューラの機能を使用する

以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。

コマンドからは以下の様に設定します。

  • TechNet?

タスク スケジューラに特権を付与する

こちらを参照して下さい。

タスク スケジューラからUIをコントロールする場合、

バックグラウンドからのUIオートメーションはサポートされない。
従って、以下のように設定をして、フォアグラウンドで実行できるようにする。

  • ログオン・ユーザの実行アカウントで実行させ、
  • タスクスケジューラに以下の設定を行う。
    • 「ユーザがログオンしている時のみ実行する。」にチェックを入れる
    • 「操作の編集ダイアログ」の
      • 「プログラム/スクリプト」に「cscript」を定義し、
      • 「引数の追加」に「UIオートメーションを実行するVBScriptのパス」を指定する。

参考:

Windowsサービスの実行アカウントを指定する

IISやSQL Serverなど

IIS(のワーカ・プロセス)やSQL Serverなど、
専用の設定画面を持ち、ここから設定が可能です。

  • IIS
    • IIS7.5(のワーカ・プロセス)からは、アプリケーションプール IDが導入され、
      既定で「Network Service」ではなく「DefaultAppPool」が使用されます。
Windows Server 2003Windows Vista
Windows Server 2008
Windows 7/Vista sp2
Windows Server 2008 R2
既定の匿名ユーザーIDIUSR_<マシン名>IUSRIUSR
既定のワーカープロセスIDNETWORK SERVICENETWORK SERVICEアプリケーション プール ID
仮想アカウント
ワーカープロセスグループIIS_WPGIIS_IUSRSIIS_IUSRS
  • アプリケーション プール IDの権限設定をする場合、
    IIS_AppPool?\ApplicationPoolName?ユーザか、IIS_IUSRSグループに対して権限を設定する。

    IIS 7 以降でのアプリケーションプールと権限について調べた - しばやん雑記
    http://blog.shibayan.jp/entry/20150127/1422369253

ASP.NET(偽装)

ASP.NETでは、偽装を使用する事によって、
実行アカウントを指定することもできます。

ASP.NET アプリケーションに偽装を実装する方法
http://support.microsoft.com/kb/306158/ja

偽装には、

があります。

匿名アカウントを実行アカウントにする場合は偽装が必要になります。
通常は、IIS(のワーカ・プロセス)の実行アカウントで実行される。

APIを使用した偽装

ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、
Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。

  • 参考
    • ASP.NET アプリケーションに偽装を実装する方法
      http://support.microsoft.com/kb/306158/ja
    • コード内で認証中のユーザーを偽装する
    • コード内で特定のユーザーを偽装する

WindowsサービスからEXEを起動

偽装スレッドからEXEを起動

また、ASP.NETなどの偽装スレッドからEXE起動をした場合、
EXEが偽装スレッドの実行アカウントで実行されない問題があります。

  • Microsoft ASP.NET で偽装ユーザーの
    コンテキストで実行されるプロセスを生成する方法。
    http://support.microsoft.com/kb/889251/ja

    偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、
    System.Diagnostics.Process.Startメソッドを使用できません。

偽装スレッドの実行アカウントでEXEを起動する場合は、
DuplicateTokenEx?CreateProcessAsUser?関数を使用し、
独自に、ユーザ権限を割り当てる必要があるようです。

以下の点に注意が必要のようです。

  • ASP.NET偽装や、ImpersonateValidUser?の偽装レベルは
    SecurityImpersonation?なので、これに合わせる必要がある。
  • 独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
    • SecurityImpersonation?
    • SecurityDelegation?
  • 実行アカウントには、以下の設定が必要になる。
  • 「プロセス レベル トークンの置き換え」セキュリティ・ポリシー
    このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、
    CreateProcessAsUser?() Win32APIを呼び出せるユーザ アカウントを決定します。
    このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。
  • 既定値:Network Service、Local System

「ブロックの解除」がされていないEXEを起動

サービスから「ブロックの解除」がされていないEXEを実行しようとすると失敗する。

コンピューター スタートアップ スクリプトの実行アカウント

スタートアップ スクリプトは Local System アカウントとして実行されるらしい。

実行アカウントの確認方法

.NET

以下を参照下さい。

権限

UAC

UACの問題で動かないようなケースもパニックです。

Windowsのユーザー・アカウント制御(UAC)を一時的に無効にする - @IT
http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html

UACとは、Windows Vista以降のOSに実装されている
ユーザー・アカウント制御(User Account Control)を指す。

タスク スケジューラとUAC

タスクのセキュリティ コンテキスト
http://technet.microsoft.com/ja-jp/library/cc722152.aspx

タスク スケジューラのセキュリティ コンテキストに対して Administrators グループを使用してタスクが登録されている場合、
タスクを実行するには、[最上位の特権で実行する] チェック ボックスがオンになっていることも確認する必要があります。

JP1の場合

JP1/Automatic Job Management System 3 構築ガイド1
6.2.22 UAC機能有効時にAdministrators権限でジョブを実行するための設定
http://www.hitachi.co.jp/Prod/comp/soft1/manual/pc/d3S0532/AJSX0072.HTM

WindowsのUAC機能を有効にしていると,ビルトインAdministratorを除く,すべての
AdministratorsグループのOSユーザーは,Administrators権限が無効な状態で動作します。
JP1/AJS3では,Administrators権限を必要とするジョブ※が実行できなくなる場合があります。
・・・
「UAC機能有効時にAdministrators権限でジョブを実行するための設定」を有効
にすることによって,UAC機能が有効の場合でもAdministratorsグループの
OSユーザーでAdministrators権限が必要なジョブを実行できます。

ネットワークアクセス

ネットワーク経由で、ファイル共有やプリンタにアクセスする場合。

サービスで使用されるビルトイン システム アカウントの問題

一般的に匿名アクセスを許可する以外、

ネットワーク間の認証には

の何れかを使用する必要があります。

リモート・コマンド

  • RSH(rshsvcサービス)や
  • PowerShell(WinRMサービス)で

リモート・コマンドを実行する場合、
リモートでコマンドを実行する際の
実行アカウントを考慮する必要があります。

RSH

rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、
サービスで使用されるビルトイン システム アカウントであるLocal Systemとなるようです。

WinRM

WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、
サービスで使用されるビルトイン システム アカウントであるNetwork Serviceとなるようです。

しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、
また、色々設定を行う事によってWinRMではダブルホップも可能であるようです。

PsExec?

RSH(rshsvcサービス)など、上記の実行アカウントで
実行できないコマンドをリモート実行したい場合、PsExec?が利用できる。

  • ローカル・アカウントと同じ資格情報得で偽装しリモート・タスクを実行する。
    ただし、この偽装アカウントはダブルホップ問題を持つため適切な設定が無いと
    リモート・タスク上のネットワーク・アクセス時の認証等に失敗する。
  • リモートで実行するときのアカウントを指定できる。
  • Systemアカウントでプログラムを実行するよう指定できる。

参考情報

ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい
「ダブルホップ」については「ベース クライアント セキュリティ モデル」→「委任」を参照。

帳票印刷

Windowsサービスやタスク スケジューラで
帳票ツールを使用しないで印刷を行う推奨された方式はない。

選択肢

  • Word などを利用する
  • Office サーバー サイド オートメーションに該当しなければ良いので、
    サーバ側にゲストOSを用意してログイン状態でログイン・アカウントから
    Office オートメーションを実行すればこの問題には抵触しません。
  • ただし、サーバ側にクライアントのゲストOSを用意する必要があるので
    ソリューションや製品の既定の処理方式としては問題のように思います。
  • APIを使用する
    帳票ツールが出力するレベルを求めると難易度が高い。
    また、帳票定義もないので開発・保守も難しくなる。
  • .NET
    .NETの印刷機能もサーバサイドでの利用は非推奨
    PRB: エラー ASP ページから、または Windows サービスからの印刷時に
    http://support.microsoft.com/kb/324565/ja
    • サービスからの.NET Framework印刷クラスの使用はサポートされていません。
    • 印刷するように設計されたすべてのサービスは、Win32 Api を直接使用する必要があります。
  • Win32 API
    C++ の知識が必要となる。文字だけであればそれほど難しくはない。
  • 帳票ツールを使用する
    これが推奨だが、要件によってはオーバースペックで、費用もかかってくる。
    一番安い Active Reportsで、開発者ライセンス=1、サーバライセンス=1 で20万円。
    #カッチリしていない帳票→レポートなら、.NET同梱のReportViewerも使用できる。

帳票ツール

OSS

  • NPOI
  • Fisshplate.net
  • EPPlus

Excel帳票

  • ExcelCreator?
  • ComponentOne? Studio
  • ODBC
  • Open XML SDK 2.0
  • support.microsoft.com
  • サーバーサイドにおける Open XML を利用したExcel ファイル
    の自動生成方法(ExcelPackage? というOSSの紹介)

その他

その他

非対話型プロセス

Windowsサービスやタスク スケジューラからの
UIを伴うWindowsアプリケーションの起動は推奨されない。

以下のフォーラムのスレッドでは、
非対話型プロセスで偽装ユーザを
対話ウインドウステーションに追加する方法を説明している。

  • 補足
  • WinSta0\default は、コンソールへログインした
    状態の desktop なので、条件が変わるかもしれません。
    • 手を離してるか、
    • スクリーンセーバになってるか、
    • Winlogin の ログイン画面が出てるか
  • このため、JP1 の KB にあった、
    「デスクトップとの対話を有効にする方法」では、
    WinSta0\defaultではなく、自前の desktop を作ってた、と思います。
  • Terminal Service (Remote Desktop Service) が
    有効になると、挙動が、がらっと変わり同じに動かない可能性もあります。

ユーザ・プロファイル

ユーザ・プロファイルが無い場合にエラーとなるようなAPIは使用する事ができません。
この場合、必要に応じてユーザ・プロファイルをロードする必要があるようです。

該当する処理

以下の様な処理が該当します。

  • レジストリのHKEY CURRENT USER
  • My Documents、Desktop等
    HOMEPATH=\Documents and Settings\ユーザ名
    以下のディレクトリに含まれる情報
  • ネットワーク ドライブの接続および切断

処理の例

ネットワーク ドライブの接続および切断を例にとると、

例えば、net use(WNetAddConnection?)
を使用してネットワーク・アクセスをすると、

Windowsの

  • ファイル共有
  • プリンタ共有
  • ローカル・ドライブ
  • ローカル・プリンタ

といったデバイスへのマッピングを覚えます。

しかし、これは、情報をプロファイルに覚えるので、
対話型ユーザでログオンしている必要があるようです。

Windowsサービスやタスク スケジューラの処理が、

ユーザ・プロファイルが存在しない実行カウントのコンテキスト上で実行される場合、

必要に応じてユーザ・プロファイルをロードします。
こちらを参照ください。

サービスで使用されるビルトイン システム アカウントで実行

サービスで使用されるビルトイン システム アカウントでプログラムを実行しようとしても、
runasコマンドにはサービスで使用されるビルトイン システム アカウントを指定きません。

この場合、「System」(LocalSystem?)であれば、
タスク スケジューラが既定で、「System」(LocalSystem?)の
サービスで使用されるビルトイン システム アカウントを使用する性質を利用できます。

Office サーバー サイド オートメーション

Office オートメーションをタスクスケジューラから実行しようとした場合に、

Office サーバー サイド オートメーション

の問題に合致するケースがあり得るので注意する必要があります。

タスク・スケジューラの設定

設定可能な項目

  • 実行アカウント(前述)
  • UACが有効な場合、Administratorsグループ権限の付与
    • [最上位の特権で実行する]チェック ボックスをオンに設定

参考情報

.batはcmd.exeを経由します。

  • ので、標準入出力が用意されます。
  • 標準入力 が用意されないことで、動作がおかしくなるコマンドもあるようです。
    タスクスケジューラ(=Windowsサービス)から直接起動されると、標準入出力が無い。
  • 以下レジストリが設定されていますと、
    bat起動前に設定されているプログラムが実行され、思わぬ動きとなります。
    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun?
    • HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun?

Tags: :あるある, :Windows, :アカウント, :セキュリティ, :障害対応, :デバッグ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-30 (月) 16:24:36 (114d)