- 追加された行はこの色です。
- 削除された行はこの色です。
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。
-戻る
--[[Windows]]
--[[アカウント]]
--[[あるある]]
-[[戻る>サービス・タスク系のいろいろ]]
* 目次 [#v30eb84e]
#contents
*概要 [#l0270871]
タスク = タスク・スケジューラ = Windowsサービスのため
>「タスク・スケジューラもWindowsサービス」です。
Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。
*アカウント関係 [#z40789ad]
-通常、Windowsサービスの実行アカウントとして~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]が使用されます。
--IISでは、「Network Service」を使用します。
--タスク スケジューラでは、「System」(LocalSystem)を使用します。
-このため、Windowsサービスやタスク スケジューラからの実行では、~
普段意識していないOSやAPIの認証機構の存在を意識する必要があります。
*実行アカウントの確認方法 [#fa199add]
以下を参照下さい。
-@IT:.NET TIPS ユーザーのセキュリティ権限を確認するには?(基本編)~
http://www.atmarkit.co.jp/fdotnet/dotnettips/346rolebasesec1/rolebasesec1.html
*実行アカウントの指定方法 [#qfb184c7]
**runasコマンド実行アカウントを指定する(アンマッチ) [#k04d844d]
***一般的なアカウント [#ed143222]
runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、~
コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので~
非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。
-一時的にほかのユーザー権限でプログラムを~
実行する方法(runasコマンドを利用する方法) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/758runascmd/runascmd.html
**タスク スケジューラの実行アカウントを指定する [#s12d2472]
***ビルトイン システム アカウント [#m8e1abe9]
-runasコマンドには[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を指定きません。~
***タスク スケジューラの機能を使用する [#zc7ae6f7]
以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。
-既定で、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]が利用されます。
-ユーザー アカウントにパスワードがないとタスク スケジューラでタスクが実行されない~
http://support.microsoft.com/kb/299854/ja
コマンドからは以下の様に設定します。
-TechNet
--Command-line Reference > A-Z List
---Atコマンド~
http://technet.microsoft.com/ja-jp/library/cc772590.aspx
---Schtasksコマンド~
http://technet.microsoft.com/ja-jp/library/cc725744.aspx
--タスクのセキュリティ コンテキスト~
http://technet.microsoft.com/ja-jp/library/cc722152.aspx
***タスク スケジューラに特権を付与する [#j0e4373b]
[[こちら>#q768b5c5]]を参照して下さい。
***タスク スケジューラからUIをコントロールする場合、 [#b95a97b8]
バックグラウンドからのUIオートメーションはサポートされない。~
従って、以下のように設定をして、フォアグラウンドで実行できるようにする。
-ログオン・ユーザの実行アカウントで実行させ、
-タスクスケジューラに以下の設定を行う。
--「ユーザがログオンしている時のみ実行する。」にチェックを入れる
--「操作の編集ダイアログ」の
---「プログラム/スクリプト」に「cscript」を定義し、
---「引数の追加」に「UIオートメーションを実行するVBScriptのパス」を指定する。
参考:
-タスクスケジューラでvbsを実行した時、起動したソフトが最前面… - 人力検索はてな~
http://q.hatena.ne.jp/1373728119
-Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ) - PC設定のカルマ~
https://pc-karuma.net/windows-10-task-schedule-without-uac-prompt/
**Windowsサービスの実行アカウントを指定する [#nafecdec]
***IISやSQL Serverなど [#i6f10ade]
IIS(のワーカ・プロセス)やSQL Serverなど、~
専用の設定画面を持ち、ここから設定が可能です。
-IIS
--IIS7.5(のワーカ・プロセス)からは、アプリケーションプール IDが導入され、~
既定で「[[Network Service>ビルトイン システム アカウント]]」ではなく「[[DefaultAppPool>仮想アカウント]]」が使用されます。
--IIS 7 のアクセス許可~
http://awoni.net/tips/iis_acl/
|BGCOLOR(#cccccc):||||c
||Windows Server 2003|Windows Vista&br;Windows Server 2008|Windows 7/Vista sp2&br;Windows Server 2008 R2|h
|既定の匿名ユーザーID|IUSR_<マシン名>|IUSR|IUSR|
|既定のワーカープロセスID|NETWORK SERVICE|NETWORK SERVICE|アプリケーション プール ID&br;([[仮想アカウント]])|
|ワーカープロセスグループ|IIS_WPG|IIS_IUSRS|IIS_IUSRS|
--アプリケーション プール IDの権限設定をする場合、~
IIS_AppPool\ApplicationPoolNameユーザか、IIS_IUSRSグループに対して権限を設定する。
>IIS 7 以降でのアプリケーションプールと権限について調べた - しばやん雑記~
http://blog.shibayan.jp/entry/20150127/1422369253
-SQL Server
--SQL Server インストールのセキュリティに関する注意点~
http://msdn.microsoft.com/ja-jp/library/ms144228.aspx
--サーバーの構成 - サービス アカウント~
http://msdn.microsoft.com/ja-jp/library/cc281953.aspx
--SQL Server のサービス開始アカウントの変更 (SQL Server 構成マネージャー)~
http://msdn.microsoft.com/ja-jp/library/ms345578.aspx
***ASP.NET(偽装) [#vaded437]
ASP.NETでは、偽装を使用する事によって、~
実行アカウントを指定することもできます。
>ASP.NET アプリケーションに偽装を実装する方法~
http://support.microsoft.com/kb/306158/ja
偽装には、
-[[サーバ信頼セキュリティ モデル]]
>特定のアカウントに偽装する。
-[[ベース クライアント セキュリティ モデル]]
>Windowsサービスにアクセスしてきたユーザの認証アカウントに偽装する。
があります。
匿名アカウントを実行アカウントにする場合は偽装が必要になります。~
通常は、IIS(のワーカ・プロセス)の実行アカウントで実行される。
-@IT:連載:プログラミングASP.NET 第17回 ASP.NETにおける認証と認定~
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet17/aspnet17_03.html~
***APIを使用した偽装 [#jf5ddc79]
ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、~
Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。
-参考
--ASP.NET アプリケーションに偽装を実装する方法~
http://support.microsoft.com/kb/306158/ja
--コード内で認証中のユーザーを偽装する
--コード内で特定のユーザーを偽装する
--[[Open棟梁のIdentityImpersonation.ImpersonateValidUser+UndoImpersonationメソッド>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/IdentityImpersonation.cs#L144]]
---[[区間偽装のサンプル - Open 棟梁 Wiki>http://opentouryo.osscons.jp/index.php?%E5%8C%BA%E9%96%93%E5%81%BD%E8%A3%85%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB]]
**WindowsサービスからEXEを起動 [#ub7a5256]
***偽装スレッドからEXEを起動 [#s8a16ddc]
また、ASP.NETなどの偽装スレッドからEXE起動をした場合、~
EXEが偽装スレッドの実行アカウントで実行されない問題があります。
**タスク スケジューラの実行アカウントを指定する [#s12d2472]
以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。
-Microsoft ASP.NET で偽装ユーザーの~
コンテキストで実行されるプロセスを生成する方法。~
http://support.microsoft.com/kb/889251/ja
>偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、 ~
System.Diagnostics.Process.Startメソッドを使用できません。
-ユーザー アカウントにパスワードがないとタスク スケジューラでタスクが実行されない~
http://support.microsoft.com/kb/299854/ja
偽装スレッドの実行アカウントでEXEを起動する場合は、~
DuplicateTokenEx→CreateProcessAsUser関数を使用し、~
独自に、ユーザ権限を割り当てる必要があるようです。
コマンドからは以下の様に設定します。
以下の点に注意が必要のようです。
-TechNet
-ASP.NET偽装や、ImpersonateValidUserの偽装レベルは~
SecurityImpersonationなので、これに合わせる必要がある。
--Command-line Reference > A-Z List
---Atコマンド~
http://technet.microsoft.com/ja-jp/library/cc772590.aspx
---Schtasksコマンド~
http://technet.microsoft.com/ja-jp/library/cc725744.aspx
-独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
--SecurityImpersonation
--SecurityDelegation
--タスクのセキュリティ コンテキスト~
http://technet.microsoft.com/ja-jp/library/cc722152.aspx
-実行アカウントには、以下の設定が必要になる。
*ネットワークの問題 [#oa6e5c5f]
--「プロセス レベル トークンの置き換え」セキュリティ・ポリシー~
このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、~
CreateProcessAsUser() Win32APIを呼び出せるユーザ アカウントを決定します。~
このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。
---既定値:Network Service、Local System
-参考情報
--CreateProcessAsUser すなのかたまり~
http://msmania.wordpress.com/tag/createprocessasuser/
---[Win32] [C++] LogonUser と CreateProcessAsUser すなのかたまり~
http://msmania.wordpress.com/2011/02/06/win32-c-logonuser-%e3%81%a8-createprocessasuser/
---[Win32] [C++] CreateProcessAsUser #1 特権編 すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-1-%E7%89%B9%E6%A8%A9%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser #2 トークン編 すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-2-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser #3 ソース すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-3-%E3%82%BD%E3%83%BC%E3%82%B9/
---[Win32] [C++] CreateProcessAsUser #4 セキュリティ記述子 すなのかたまり~
http://msmania.wordpress.com/2012/01/01/win32-c-createprocessasuser-4-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%98%E8%BF%B0%E5%AD%90/
--[[Open棟梁のIdentityImpersonation.CreateProcessAsImpersonationUserメソッド>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/IdentityImpersonation.cs#L283]]
***[[「ブロックの解除」がされていないEXEを起動>]] [#ye467677]
**コンピューター スタートアップ スクリプトの実行アカウント [#q95796ff]
スタートアップ スクリプトは Local System アカウントとして実行されるらしい。
-コンピューター スタートアップ スクリプトを割り当てる~
https://technet.microsoft.com/ja-jp/library/cc770556.aspx
**実行アカウントの確認方法 [#fa199add]
***.NET [#n756aafb]
以下を参照下さい。
-@IT:.NET TIPS ユーザーのセキュリティ権限を確認するには?(基本編)~
http://www.atmarkit.co.jp/fdotnet/dotnettips/346rolebasesec1/rolebasesec1.html
**[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]の問題 [#faa96fc2]
-タスクの実行には、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]が使用される事が多いです。
-しかし、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用するとネットワーク間で認証できません。
**ネットワーク間認証 [#faa96fc2]
-[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用するとネットワーク間で認証できません。
-[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]はADのグループに入れる事ができないのでAD環境下でもNGです。
一般的に匿名アクセスを許可する以外、
-このため、一般的に匿名アクセスを許可する以外、ネットワーク間の認証には~
ネットワーク間の認証には~
--[[ミラーアカウント>#n5e7f04e]]
--[[ドメイン アカウント>#i41d6d52]]
--[[net use(WNetAddConnection)>#f712aad2]]
-[[ミラーアカウント]]
-[[ドメイン アカウント]]
-[[net use(WNetAddConnection)>#aec9f79c]]
>の何れかを使用する必要があります。
の何れかを使用する必要があります。
-[[ミラーアカウント]]~
***[[ミラーアカウント]] [#n5e7f04e]
WORKGROUP環境で利用。
-[[ドメイン アカウント]]~
***[[ドメイン アカウント]] [#i41d6d52]
Active Directory環境で利用。
--コンピュータ・アカウント~
-コンピュータ・アカウント~
AD環境下の場合、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用する場合、~
[[コンピュータ・アカウント>ドメイン アカウント#fdd7575b]]のアクセス許可をリソースに付与するだけでも良い。
--仮想アカウント~
-仮想アカウント~
AD環境下の場合、[[仮想アカウント]]は自動的に管理され、~
ドメイン環境でネットワークにアクセスすることができる。
-[[net use(WNetAddConnection)>#aec9f79c]]~
***net use(WNetAddConnection) [#f712aad2]
-[[net use(WNetAddConnection)>サービス・タスク系のいろいろ#aec9f79c]]~
WORKGROUP環境・Active Directory環境でも利用可能。
*ネットワークアクセス [#p618c297]
ネットワーク経由で、ファイル共有やプリンタにアクセスする場合。
**リモート・コマンド [#a0a84e44]
**リモート・コマンドの問題 [#g35786fe]
-RSH(rshsvcサービス)や
-PowerShell(WinRMサービス)で
リモート・コマンドを実行する場合、~
リモートでコマンドを実行する際の~
実行アカウントを考慮する必要があります。
***RSH [#hab20ce5]
***RSH [#j2c36322]
rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]であるLocal Systemとなるようです。
***WinRM [#f7a26752]
***WinRM [#od280807]
WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]であるNetwork Serviceとなるようです。~
しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、~
また、色々設定を行う事によってWinRMではダブルホップも可能であるようです。~
また、色々設定を行う事によってWinRMでは[[ダブルホップ>#r02409ee]]も可能であるようです。~
***PsExec [#bc46b342]
***PsExec [#a18ceed3]
RSH(rshsvcサービス)など、上記の実行アカウントで~
実行できないコマンドをリモート実行したい場合、PsExecが利用できる。
-リモート・コンピュータ上でプログラムを実行する(PsExec編) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1416psexec/psexec.html~
--ローカル・アカウントと同じ資格情報得で偽装しリモート・タスクを実行する。~
ただし、この偽装アカウントはダブルホップ問題を持つため適切な設定が無いと~
ただし、この偽装アカウントは[[ダブルホップ>#r02409ee]]問題を持つため適切な設定が無いと~
リモート・タスク上のネットワーク・アクセス時の認証等に失敗する。
--リモートで実行するときのアカウントを指定できる。
--Systemアカウントでプログラムを実行するよう指定できる。
***参考情報 [#c01be438]
***ダブルホップ [#r02409ee]
ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい~
「ダブルホップ」については「[[ベース クライアント セキュリティ モデル]]」→「[[委任]]」を参照。
**[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]で実行 [#j9fa37ae]
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]でプログラムを実行しようとしても、~
runasコマンドには[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を指定きません。~
*その他の問題 [#zf5dda66]
-参考:[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]
**コンピューター スタートアップ スクリプトの実行アカウント [#q95796ff]
スタートアップ スクリプトは Local System アカウントとして実行されるらしい。
この場合、「System」(LocalSystem)であれば、~
タスク スケジューラが既定で、「System」(LocalSystem)の~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用する性質を利用できます。
-コンピューター スタートアップ スクリプトを割り当てる~
https://technet.microsoft.com/ja-jp/library/cc770556.aspx
-一時的にSystemアカウントでプログラムを実行する - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1165atsys/atsys.html~
**Windowsサービスの偽装スレッドからEXE起動をした場合 [#ub7a5256]
また、ASP.NETなどの偽装スレッドからEXE起動をした場合、~
EXEが偽装スレッドの実行アカウントで実行されない問題があります。
***Win32 API [#r5468029]
-Microsoft ASP.NET で偽装ユーザーの~
コンテキストで実行されるプロセスを生成する方法。~
http://support.microsoft.com/kb/889251/ja
>偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、 ~
System.Diagnostics.Process.Startメソッドを使用できません。
-偽装スレッドの実行アカウントでEXEを起動する場合は、~
DuplicateTokenEx→CreateProcessAsUser関数を使用し、~
独自に、ユーザ権限を割り当てる必要があるようです。
***注意点 [#j47c2029]
以下の点に注意が必要のようです。
-ASP.NET偽装や、ImpersonateValidUserの偽装レベルは~
SecurityImpersonationなので、これに合わせる必要がある。
-独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
--SecurityImpersonation
--SecurityDelegation
-実行アカウントには、以下の設定が必要になる。
--「プロセス レベル トークンの置き換え」セキュリティ・ポリシー~
このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、~
CreateProcessAsUser() Win32APIを呼び出せるユーザ アカウントを決定します。~
このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。
---既定値:Network Service、Local System
-参考情報
--CreateProcessAsUser すなのかたまり~
http://msmania.wordpress.com/tag/createprocessasuser/
---[Win32] [C++] LogonUser と CreateProcessAsUser すなのかたまり~
http://msmania.wordpress.com/2011/02/06/win32-c-logonuser-%e3%81%a8-createprocessasuser/
---[Win32] [C++] CreateProcessAsUser #1 特権編 すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-1-%E7%89%B9%E6%A8%A9%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser #2 トークン編 すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-2-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser #3 ソース すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-3-%E3%82%BD%E3%83%BC%E3%82%B9/
---[Win32] [C++] CreateProcessAsUser #4 セキュリティ記述子 すなのかたまり~
http://msmania.wordpress.com/2012/01/01/win32-c-createprocessasuser-4-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%98%E8%BF%B0%E5%AD%90/
--[[Open棟梁のIdentityImpersonation.CreateProcessAsImpersonationUserメソッド>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/IdentityImpersonation.cs#L283]]
*事例 [#x6f2977d]
**[[svnコマンド>初回が遅い!#tfc1f81b]] [#tccf0a79]
**... [#o92319f1]
----
Tags: [[:あるある]], [[:Windows]], [[:アカウント]], [[:セキュリティ]], [[:障害対応]], [[:デバッグ]]