Open棟梁Project - マイクロソフト系技術情報 Wiki
タスク = タスク・スケジューラ = Windowsサービスのため
「タスク・スケジューラもWindowsサービス」です。
Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。
runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、
コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので
非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。
以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。
コマンドからは以下の様に設定します。
こちらを参照して下さい。
バックグラウンドからのUIオートメーションはサポートされない。
従って、以下のように設定をして、フォアグラウンドで実行できるようにする。
参考:
IIS(のワーカ・プロセス)やSQL Serverなど、
専用の設定画面を持ち、ここから設定が可能です。
Windows Server 2003 | Windows Vista Windows Server 2008 | Windows 7/Vista sp2 Windows Server 2008 R2 | |
既定の匿名ユーザーID | IUSR_<マシン名> | IUSR | IUSR |
既定のワーカープロセスID | NETWORK SERVICE | NETWORK SERVICE | アプリケーション プール ID |
ワーカープロセスグループ | IIS_WPG | IIS_IUSRS | IIS_IUSRS |
IIS 7 以降でのアプリケーションプールと権限について調べた - しばやん雑記
http://blog.shibayan.jp/entry/20150127/1422369253
ASP.NETでは、偽装を使用する事によって、
実行アカウントを指定することもできます。
ASP.NET アプリケーションに偽装を実装する方法
http://support.microsoft.com/kb/306158/ja
偽装には、
特定のアカウントに偽装する。
Windowsサービスにアクセスしてきたユーザの認証アカウントに偽装する。
があります。
匿名アカウントを実行アカウントにする場合は偽装が必要になります。
通常は、IIS(のワーカ・プロセス)の実行アカウントで実行される。
ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、
Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。
また、ASP.NETなどの偽装スレッドからEXE起動をした場合、
EXEが偽装スレッドの実行アカウントで実行されない問題があります。
偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、
System.Diagnostics.Process.Startメソッドを使用できません。
偽装スレッドの実行アカウントでEXEを起動する場合は、
DuplicateTokenEx?→CreateProcessAsUser?関数を使用し、
独自に、ユーザ権限を割り当てる必要があるようです。
以下の点に注意が必要のようです。
以下を参照下さい。
UACの問題で動かないようなケースもパニックです。
Windowsのユーザー・アカウント制御(UAC)を一時的に無効にする - @IT
http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html
UACとは、Windows Vista以降のOSに実装されている
ユーザー・アカウント制御(User Account Control)を指す。
タスクのセキュリティ コンテキスト
http://technet.microsoft.com/ja-jp/library/cc722152.aspx
タスク スケジューラのセキュリティ コンテキストに対して Administrators グループを使用してタスクが登録されている場合、
タスクを実行するには、[最上位の特権で実行する] チェック ボックスがオンになっていることも確認する必要があります。
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権限が必要なジョブを実行できます。
タスクの実行には、ビルトイン システム アカウントが使用される事が多いです。
しかし、ビルトイン システム アカウントを使用するとネットワーク間で認証できません。
ビルトイン システム アカウントはADのグループに入れる事ができないのでAD環境下でもNGです。
一般的に、匿名アクセスを許可する以外、ネットワーク間の認証には
使用する必要があります。
リモート・コマンドを実行する場合、
リモートでコマンドを実行する際の
実行アカウントを考慮する必要があります。
rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、
ビルトイン システム アカウントであるLocal Systemとなるようです。
WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、
ビルトイン システム アカウントであるNetwork Serviceとなるようです。
しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、
また、色々設定を行う事によってWinRMではダブルホップも可能であるようです。
RSH(rshsvcサービス)など、上記の実行アカウントで
実行できないコマンドをリモート実行したい場合、PsExec?が利用できる。
ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい
ダブルホップについては・・・。
Windowsサービスやタスク スケジューラで
帳票ツールを使用しないで印刷を行う推奨された方式はない。
Windowsサービスやタスク スケジューラからの
UIを伴うWindowsアプリケーションの起動は推奨されない。
以下のフォーラムのスレッドでは、
非対話型プロセスで偽装ユーザを
対話ウインドウステーションに追加する方法を説明している。
ユーザ・プロファイルが無い場合にエラーとなるようなAPIは使用する事ができません。
この場合、必要に応じてユーザ・プロファイルをロードする必要があるようです。
以下の様な処理が該当します。
ネットワーク ドライブの接続および切断を例にとると、
例えば、net use(WNetAddConnection?)
を使用してネットワーク・アクセスをすると、
Windowsの
といったデバイスへのマッピングを覚えます。
しかし、これは、情報をプロファイルに覚えるので、
対話型ユーザでログオンしている必要があるようです。
Windowsサービスやタスク スケジューラの処理が、
ユーザ・プロファイルが存在しない実行カウントのコンテキスト上で実行される場合、
必要に応じてユーザ・プロファイルをロードします。
こちらを参照ください。
ビルトイン システム アカウントでプログラムを実行しようとしても、
runasコマンドにはビルトイン システム アカウントを指定きません。
この場合、「System」(LocalSystem?)であれば、
タスク スケジューラが既定で、「System」(LocalSystem?)の
ビルトイン システム アカウントを使用する性質を利用できます。
Office オートメーションをタスクスケジューラから実行しようとした場合に、
の問題に合致するケースがあり得るので注意する必要があります。