Open棟梁Project - マイクロソフト系技術情報 Wiki * 目次 [#d9b690d4] #contents *概要 [#p7f2044e] タスク = タスク・スケジューラ = Windowsサービスのため >「タスク・スケジューラもWindowsサービス」です。 Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。 *アカウント関係 [#nda88705] -通常、Windowsサービスの実行アカウントとして~ [[ビルトイン システム アカウント]]が使用されます。 --IISでは、「Network Service」を使用します。 --タスク スケジューラでは、「System」(LocalSystem)を使用します。 -このため、Windowsサービスやタスク スケジューラからの実行では、~ 普段意識していないOSやAPIの認証機構の存在を意識する必要があります。 **runasコマンド実行アカウントを指定する(アンマッチ) [#z81fe89c] runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、~ コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので~ 非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。 -一時的にほかのユーザー権限でプログラムを~ 実行する方法(runasコマンドを利用する方法) - @IT~ http://www.atmarkit.co.jp/fwin2k/win2ktips/758runascmd/runascmd.html **タスク スケジューラの実行アカウントを指定する [#l35dae4c] ***タスク スケジューラの機能を使用する [#v72ed448] 以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。 -ユーザー アカウントにパスワードがないとタスク スケジューラでタスクが実行されない~ 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 ***タスクスケジューラに特権を付与する [#kd037fc9] [[こちら>#q768b5c5]]を参照して下さい。 ***タスクスケジューラからUIをコントロールする場合、 [#u4d19924] #メカニズムが、あまり解っていませんが、 始めに、以下を設定する。 -ログオン・ユーザの実行アカウントで実行させ、 -「ユーザがログオンしている時のみ実行する。」にチェックを入れる 次に、操作される側のアプリを以下のように起動する。 -タスクスケジューラでvbsを実行した時、起動したソフトが最前面… - 人力検索はてな~ http://q.hatena.ne.jp/1373728119 >「windows7の環境下で 以下のvbsプログラムをタスクスケジューラで起動したのですが~ 最前面に表示されず文字が送れません どうすればいいのでしょうか?」 --タスクスケジューラでvbsを実行すると上手に処理できない - マイクロソフト コミュニティ~ http://answers.microsoft.com/ja-jp/windows/forum/windows_7-windows_programs/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/2014c025-fb5f-42d5-a47f-339abcbd5af9 >「cmdを介せばフォアグラウンドが取れるようです。」 >>「objWShell.Run "%windir%\system32\calc.exe" の所を~ wShell.run "ccmd /c start c:\windir\system32\calc.exe"~ というようにしましたら解決しました!みなさん、ありがとうございますた!」 **Windowsサービスの実行アカウントを指定する [#a212352c] ***IISやSQL Serverなど [#ib21db08] 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| |ワーカープロセスグループ|IIS_WPG|IIS_IUSRS|IIS_IUSRS| -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(偽装) [#p4f563b8] 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を使用した偽装 [#cd724f4b] ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、~ Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。 -ASP.NET アプリケーションに偽装を実装する方法~ http://support.microsoft.com/kb/306158/ja --コード内で認証中のユーザーを偽装する --コード内で特定のユーザーを偽装する ***偽装スレッドからEXEを起動 [#a44cbeac] また、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 -参考情報 --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/C%23/Frameworks/Infrastructure/Public/Util/IdentityImpersonation.cs#L283 **実行アカウントの確認方法 [#hda848ff] ***.NET [#e41e7e38] 以下を参照下さい。 -@IT:.NET TIPS ユーザーのセキュリティ権限を確認するには?(基本編)~ http://www.atmarkit.co.jp/fdotnet/dotnettips/346rolebasesec1/rolebasesec1.html *権限 [#p8e677d7] **UAC [#r36372ef] UACの問題で動かないようなケースもパニックです。~ ~ Windowsのユーザー・アカウント制御(UAC)を一時的に無効にする - @IT~ http://www.atmarkit.co.jp/fwin2k/win2ktips/859disuac/disuac.html >UACとは、Windows Vista以降のOSに実装されている~ ユーザー・アカウント制御(User Account Control)を指す。 ***タスク スケジューラとUAC [#q768b5c5] タスクのセキュリティ コンテキスト~ http://technet.microsoft.com/ja-jp/library/cc722152.aspx~ >タスク スケジューラのセキュリティ コンテキストに対して Administrators グループを使用してタスクが登録されている場合、~ タスクを実行するには、[最上位の特権で実行する] チェック ボックスがオンになっていることも確認する必要があります。 ***JP1の場合 [#b010e297] 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権限が必要なジョブを実行できます。~ *ネットワークアクセス [#h3eb0eb4] **ビルトイン システム アカウントの問題 [#e8853015] タスクの実行には、ビルトイン システム アカウントが使用される事が多いです。~ しかし、ビルトイン システム アカウントを使用するとネットワーク間で認証できません。~ ビルトイン システム アカウントはADのグループに入れる事ができないのでAD環境下でもNGです。~ 一般的に、匿名アクセスを許可する以外、ネットワーク間の認証には~ -[[ミラーアカウント]]か、 -ADのアカウントを 使用する必要があります。 **リモート・コマンド [#v73746d8] -RSH(rshsvcサービス)や -PowerShell(WinRMサービス)で リモート・コマンドを実行する場合、~ リモートでコマンドを実行する際の~ 実行アカウントを考慮する必要があります。 ***RSH [#j2c36322] rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、~ ビルトイン システム アカウントであるLocal Systemとなるようです。 ***WinRM [#od280807] WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、~ ビルトイン システム アカウントであるNetwork Serviceとなるようです。~ しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、~ また、色々設定を行う事によってWinRMではダブルホップも可能であるようです。~ ***PsExec [#a18ceed3] RSH(rshsvcサービス)など、上記の実行アカウントで~ 実行できないコマンドをリモート実行したい場合、PsExecが利用できる。 -リモート・コンピュータ上でプログラムを実行する(PsExec編) - @IT~ http://www.atmarkit.co.jp/fwin2k/win2ktips/1416psexec/psexec.html~ --ローカル・アカウントと同じ資格情報得で偽装しリモート・タスクを実行する。~ ただし、この偽装アカウントはダブルホップ問題を持つため適切な設定が無いと~ リモート・タスク上のネットワーク・アクセス時の認証等に失敗する。 --リモートで実行するときのアカウントを指定できる。 --Systemアカウントでプログラムを実行するよう指定できる。 ***参考情報 [#r02409ee] ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい~ ダブルホップについては・・・。 *帳票印刷 [#m80b5499] Windowsサービスやタスク スケジューラで~ 帳票ツールを使用しないで印刷を行う推奨された方式はない。 **選択肢 [#yceaf61a] -Word などを利用する --[[Office サーバー サイド オートメーション]]はマイクロソフトの非推奨 --一部、裏技的な方法もある。~ 同じフォルダーにあるファイルのグループを印刷するマクロ~ http://support.microsoft.com/kb/107880/ja ---Office サーバー サイド オートメーションに該当しなければ良いので、~ サーバ側にゲストOSを用意してログイン状態でログイン・アカウントから~ Office オートメーションを実行すればこの問題には抵触しません。 ---ただし、サーバ側にクライアントのゲストOSを用意する必要があるので~ ソリューションや製品の既定の処理方式としては問題のように思います。 -APIを使用する~ 帳票ツールが出力するレベルを求めると難易度が高い。~ また、帳票定義もないので開発・保守も難しくなる。 --.NET~ .NETの印刷機能もサーバサイドでの利用は非推奨~ PRB: エラー ASP ページから、または Windows サービスからの印刷時に~ http://support.microsoft.com/kb/324565/ja~ ---サービスからの.NET Framework印刷クラスの使用はサポートされていません。 ---印刷するように設計されたすべてのサービスは、Win32 Api を直接使用する必要があります。 --Win32 API~ C++ の知識が必要となる。文字だけであればそれほど難しくはない。 ---プリンタプログラミング (その1)~ http://www30020u.sakura.ne.jp/nohito/program/memo/lecture/printer-1.html ---プリンタを利用する (その2)~ http://www30020u.sakura.ne.jp/nohito/program/memo/lecture/printer-2.html ---プリンタを利用する (その3)~ http://www30020u.sakura.ne.jp/nohito/program/memo/lecture/printer-3.html -帳票ツールを使用する~ これが推奨だが、要件によってはオーバースペックで、費用もかかってくる。~ 一番安い Active Reportsで、開発者ライセンス=1、サーバライセンス=1 で20万円。~ #カッチリしていない帳票→レポートなら、.NET同梱のReportViewerも使用できる。 **帳票ツール [#g555f2de] -OSS --NPOI --Fisshplate.net --EPPlus -Excel帳票 --ExcelCreator --ComponentOne Studio --ODBC --Open XML SDK 2.0 --support.microsoft.com ---ADO を使用して Excel ブックのデータの~ 読み取りおよび書き込みを行う方法 (ExcelADO)~ http://support.microsoft.com/kb/278973/ja~ ---Visual Basic .NET と ADO.NET を使用して~ Excel ブックのレコードの取得と変更を行う方法~ http://support.microsoft.com/kb/316934/ja~ --サーバーサイドにおける Open XML を利用したExcel ファイル~ の自動生成方法(ExcelPackage というOSSの紹介) ---(その1)~ http://crieilluminate.wordpress.com/2009/06/02/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B-open-xml-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Fexcel-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-2/ ---(その2)~ http://crieilluminate.wordpress.com/2009/06/02/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B-open-xml-%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9Fexcel-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB/~ **その他 [#sd0b5b14] -SharePoint --SharePoint 2010 を使うと、サーバ側で、Word を pdf に変換できるらしい。 ---Word Automation Services の概要~ http://msdn.microsoft.com/ja-jp/library/ee558830.aspx --SharePoint 2013 では、 PowerPoint も pdf 変換できるらしい。 ---PowerPoint 2013 新機能 Overview (SharePoint 連携)~ http://crieilluminate.wordpress.com/2012/10/10/powerpoint-2013-preview-%E6%96%B0%E6%A9%9F%E8%83%BD-overview-sharepoint-%E9%80%A3%E6%90%BA/ -Windows Live SkyDrive で Office Web Apps を使用する~ http://office.microsoft.com/ja-jp/web-apps-help/HA101231889.aspx --SkyDrive 使うと、Word を pdf に変換できる *その他 [#gda83bf4] **非対話型プロセス [#p5c3a582] Windowsサービスやタスク スケジューラからの~ UIを伴うWindowsアプリケーションの起動は推奨されない。 以下のフォーラムのスレッドでは、~ 非対話型プロセスで偽装ユーザを~ 対話ウインドウステーションに追加する方法を説明している。 -C#のWindowsサービスからのProcessによるEXE起動について - Insider.NET - @IT~ http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32959&forum=7 -補足 --WinSta0\default は、コンソールへログインした~ 状態の desktop なので、条件が変わるかもしれません。 ---手を離してるか、 ---スクリーンセーバになってるか、 ---Winlogin の ログイン画面が出てるか --このため、JP1 の KB にあった、~ 「デスクトップとの対話を有効にする方法」では、~ WinSta0\defaultではなく、自前の desktop を作ってた、と思います。~ --Terminal Service (Remote Desktop Service) が~ 有効になると、挙動が、がらっと変わり同じに動かない可能性もあります。 **ユーザ・プロファイル [#e6fe2f00] ユーザ・プロファイルが無い場合にエラーとなるようなAPIは使用する事ができません。~ この場合、必要に応じてユーザ・プロファイルをロードする必要があるようです。~ ***該当する処理 [#nbfd2dbb] 以下の様な処理が該当します。 -レジストリのHKEY CURRENT USER -My Documents、Desktop等~ HOMEPATH=\Documents and Settings\ユーザ名~ 以下のディレクトリに含まれる情報 -ネットワーク ドライブの接続および切断 -.etc --ユーザー プロファイルに保存される設定~ http://technet.microsoft.com/ja-jp/library/cc781142.aspx ***処理の例 [#aec9f79c] ネットワーク ドライブの接続および切断を例にとると、 >例えば、net use(WNetAddConnection)~ を使用してネットワーク・アクセスをすると、 Windowsの -ファイル共有 -プリンタ共有 -ローカル・ドライブ -ローカル・プリンタ といったデバイスへのマッピングを覚えます。 -参考 --Windows XP でネットワーク ドライブの接続および切断を行う方法~ http://support.microsoft.com/kb/308582/ja しかし、これは、情報をプロファイルに覚えるので、~ 対話型ユーザでログオンしている必要があるようです。 Windowsサービスやタスク スケジューラの処理が、 >ユーザ・プロファイルが存在しない実行カウントのコンテキスト上で実行される場合、 必要に応じてユーザ・プロファイルをロードします。~ [[こちら>Office サーバー サイド オートメーション#y12437e8]]を参照ください。 **ビルトイン システム アカウントで実行 [#b599750e] ビルトイン システム アカウントでプログラムを実行しようとしても、~ runasコマンドにはビルトイン システム アカウントを指定きません。~ -参考:[[ビルトイン システム アカウント]] この場合、「System」(LocalSystem)であれば、~ タスク スケジューラが既定で、「System」(LocalSystem)の~ ビルトイン システム アカウントを使用する性質を利用できます。 -一時的にSystemアカウントでプログラムを実行する - @IT~ http://www.atmarkit.co.jp/fwin2k/win2ktips/1165atsys/atsys.html~ **[[Office サーバー サイド オートメーション]] [#t6f474b4] Office オートメーションをタスクスケジューラから実行しようとした場合に、 >[[Office サーバー サイド オートメーション]] の問題に合致するケースがあり得るので注意する必要があります。 **タスク・スケジューラの設定 [#g66ace73] ***設定可能な項目 [#h0bd3e85] -実行アカウント(前述) -UACが有効な場合、Administratorsグループ権限の付与 --[最上位の特権で実行する]チェック ボックスをオンに設定 -作業フォルダ --[Windows]タスクスケジューラで作業フォルダを指定する方法 DelightMode~ http://www.delightmode.jp.net/win-taskscheduler.html ***参考情報 [#me82fda6] --タスク スケジューラの概要~ http://technet.microsoft.com/ja-jp/library/cc721871.aspx ---タスク スケジューラのトラブルシューティング~ http://technet.microsoft.com/ja-jp/library/cc721846.aspx **.batはcmd.exeを経由します。 [#ccb7761d] -ので、標準入出力が用意されます。 --標準入力 が用意されないことで、動作がおかしくなるコマンドもあるようです。~ タスクスケジューラ(=Windowsサービス)から直接起動されると、標準入出力が無い。 -以下レジストリが設定されていますと、~ bat起動前に設定されているプログラムが実行され、思わぬ動きとなります。 --HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun --HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun --コマンドプロンプトを起動させた時に、~ バッチスクリプトが自動で実行されるのを止めたいです。 - マイクロソフト コミュニティ~ http://answers.microsoft.com/ja-jp/windows/forum/windows_7-windows_programs/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97/c00bd58b-efd0-4a50-99be-2f6291ed2aa4?msgId=604ae0c6-5e5e-4461-94c4-6a9ddca800b8