-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ServiceAndTaskTopics
- 戻る(Windows OSの基礎的トピック、SCM、アカウント、あるある)
- サービス・タスク系のいろいろ
- サービス・タスク系のアカウント問題
- Windowsサービス
-
タスク = タスク・スケジューラ = Windowsサービスのため
「タスク・スケジューラも Windows サービス」です。
-
ココでは、Windows サービスの下記、
実行コンテキスト周辺のトラブルシュートについて説明します。- 一般ユーザの GUI から実行する場合
- 一般ユーザのタスクとして実行する場合
- 管理者権限の GUI から実行する場合
- 管理者権限のユーザのタスクとして実行する場合
補足(この 4 分類が肝である): 「開発者の手元では動くが、
タスクにすると動かない」という現象は、
ほぼ次の 4 つの差分のどれかで説明できる。
差分 何が変わるか 実行アカウント アクセス権・ネットワーク認証・HKEY_CURRENT_USER 昇格(UAC) 管理者グループでも、既定では権限が剥がされている 対話性(デスクトップ) ウィンドウ ステーション / デスクトップが無い ユーザ・プロファイル プロファイルが読み込まれていない 本ページはこの 4 つを順に扱っている。
切り分けの際も、この順に確認していくと早い。
WOW64関係
- 何気に、WOW64問題のケースもある。
- JP1/AJS のクライアントが 32bit と言うケース。
サービス・タスク系の実行アカウントがデバッグ時と異なり、トラブる。
- 詳細はサービス・タスク系のアカウント問題を参照。
権限関係(UAC)
UACの問題で動かず、トラブる。
タスク スケジューラとUAC
-
タスクのセキュリティ コンテキスト
タスク スケジューラのセキュリティ コンテキストに対して
Administrators グループを使用してタスクが登録されている場合、
タスクを実行するには、[最上位の特権で実行する]チェック ボックスが
オンになっていることも確認する必要があります。 -
Windows10 - 管理者権限が必要なアプリを自動起動(スタートアップ) - PC設定のカルマ
https://pc-karuma.net/windows-10-task-schedule-without-uac-prompt/
-
JP1/Automatic Job Management System 3 構築ガイド1
6.2.22 UAC 機能有効時に Administrators 権限でジョブを実行するための設定Windows の UAC 機能を有効にしていると、ビルトイン Administrator を除く、
すべての Administrators グループの OS ユーザーは、
Administrators 権限が無効な状態で動作します。
JP1/AJS3 では、Administrators 権限を必要とするジョブが
実行できなくなる場合があります。
・・・
「UAC 機能有効時に Administrators 権限でジョブを実行するための設定」を
有効にすることによって、UAC 機能が有効の場合でも Administrators グループの
OS ユーザーで Administrators 権限が必要なジョブを実行できます。
ネットワーク経由で、ファイル共有やプリンタにアクセスする場合。
Windows サービスやタスク スケジューラで
帳票ツールを使用しないで印刷を行う推奨された方式はない。
-
Office サーバー サイド オートメーションは
マイクロソフトの非推奨 -
一部、裏技的な方法もある。
同じフォルダーにあるファイルのグループを印刷するマクロ
http://support.microsoft.com/kb/107880/ja- Office サーバー サイド オートメーションに該当しなければ良いので、
サーバ側にゲスト OS を用意してログイン状態でログイン・アカウントから
Office オートメーションを実行すればこの問題には抵触しません。 - ただし、サーバ側にクライアントのゲスト OS を用意する必要があるので
ソリューションや製品の既定の処理方式としては問題のように思います。
- Office サーバー サイド オートメーションに該当しなければ良いので、
帳票ツールが出力するレベルを求めると難易度が高い。
また、帳票定義もないので開発・保守も難しくなる。
-
.NET
.NET の印刷機能もサーバサイドでの利用は非推奨- サービスからの .NET Framework 印刷クラスの使用はサポートされていません。
- 印刷するように設計されたすべてのサービスは、
Win32 API を直接使用する必要があります。
-
Win32 API
C++ の知識が必要となる。文字だけであればそれほど難しくはない。
これが推奨だが、要件によってはオーバースペックで、費用もかかってくる。
一番安い ActiveReports で、開発者ライセンス=1、サーバライセンス=1 で20万円。
#カッチリしていない帳票→レポートなら、.NET 同梱の ReportViewer も使用できる。
補足(現在の選択肢): 「サーバーサイドで Office を動かすな」という原則は
今も変わっていない(サポート対象外であり、ライセンス上も問題がある)。
一方で、代替手段は当時より格段に増えた。
用途 現在よく使われるもの Excel 生成 ClosedXML / EPPlus(有償化)/ NPOI。いずれも Open XML を直接操作、Excel 不要 Word 生成 Open XML SDK / DocX PDF 生成 QuestPDF(コード定義)/ iText / Chromium 系のヘッドレス印刷(HTML → PDF) 帳票(定義体あり) ActiveReports / SVF / 帳票クラウド サービス 特に HTML → PDF(Puppeteer / Playwright 等でヘッドレス Chromium を使う)は、
Web の表現力をそのまま使え、デザイナも巻き込みやすいため近年の主流の一つである。なお EPPlus は 5.0 以降 Polyform Noncommercial ライセンスとなり、
商用利用は有償である。無償で使うなら ClosedXML を選ぶことになる。
元ページが「OSS」として挙げている前提は現在では成り立たない点に注意。
- NPOI
- Fisshplate.net
- EPPlus(現在は商用有償。上記の補足を参照)
- ExcelCreator
- ComponentOne Studio
- ODBC
- Open XML SDK
- SharePoint
- SharePoint 2010 を使うと、サーバ側で、Word を PDF に変換できるらしい。
- Word Automation Services の概要
- SharePoint 2013 では、PowerPoint も PDF 変換できるらしい。
- SharePoint 2010 を使うと、サーバ側で、Word を PDF に変換できるらしい。
- 実行アカウントの指定
- UACが有効な場合、Administrators グループ権限の付与
- 作業フォルダ
補足(作業フォルダは必ず指定する): タスク スケジューラから起動されたプロセスの
カレント ディレクトリは、既定でC:\Windows\System32になる。
相対パスでファイルを読み書きしているバッチやスクリプトは、
これだけで動かなくなる。
[操作の編集]の**「開始(オプション)」に作業フォルダを必ず指定する**
のが定石である。
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 なので、条件が変わるかもしれません。- 手を離してるか、
- スクリーンセーバになってるか、
- Winlogon のログイン画面が出てるか
- このため、JP1 の KB にあった
「デスクトップとの対話を有効にする方法」では、
WinSta0\defaultではなく、自前の desktop を作ってた、と思います。 - Terminal Service (Remote Desktop Service) が
有効になると、挙動ががらっと変わり同じに動かない可能性もあります。
-
移行メモ(正誤): 元ページの「Winlogin」は Winlogon の誤記である。
補足(セッション 0 分離): Windows Vista / Server 2008 以降、
サービスは必ずセッション 0 で動作し、
対話ユーザのセッション(1 以降)とは分離されている。
これを「セッション 0 分離」という。このため、
- サービスから出したダイアログは誰にも見えない(応答待ちで固まる)
- 「デスクトップとの対話をサービスに許可」チェックは
実質的に機能しない(後継 OS では無効化されている)サービスから UI を出したい場合の正しい方法は、
WTSGetActiveConsoleSessionId+CreateProcessAsUserで
対話セッション側にプロセスを生成することである。
あるいは、UI は常駐アプリ側に置き、サービスとは
名前付きパイプなどで通信する設計にする。
バックグラウンドからの UI オートメーションはサポートされない。
従って、以下のように設定をして、フォアグラウンドで実行できるようにする。
- ログオン・ユーザの実行アカウントで実行させ、
- タスクスケジューラに以下の設定を行う。
- 「ユーザがログオンしている時のみ実行する。」にチェックを入れる
- 「操作の編集ダイアログ」の
- 「プログラム/スクリプト」に
cscriptを定義し、 - 「引数の追加」に「UI オートメーションを実行するVBScriptのパス」を指定する。
- 「プログラム/スクリプト」に
ユーザ・プロファイルが無い場合にエラーとなるような API は使用する事ができません。
この場合、必要に応じてユーザ・プロファイルをロードする必要があるようです。
以下の様な処理が該当します。
-
レジストリの
HKEY_CURRENT_USER -
My Documents、Desktop 等
HOMEPATH=\Documents and Settings\ユーザ名
以下のディレクトリに含まれる情報 -
ネットワーク ドライブの接続および切断
-
デバイスへのマッピング
ネットワーク ドライブの接続および切断を例にとると、- 例えば、
net use(WNetAddConnection)を使用して
ネットワーク・アクセスをすると、
Windows のデバイスへのマッピングを覚えます。- ファイル共有
- プリンタ共有
- ローカル・ドライブ
- ローカル・プリンタ
- これは、情報をプロファイルに覚えるので、
対話型ユーザでログオンしている必要があるようです。
- 例えば、
-
必要に応じてユーザ・プロファイルをロード
Windows サービスやタスク スケジューラの処理が、「ユーザ・プロファイルが存在しない実行アカウントの
コンテキスト上で実行される」場合、必要に応じてユーザ・プロファイルをロードします。
→ ユーザ・プロファイルをロードする方法の詳細は
Office サーバー サイド オートメーションを参照。
Office オートメーションをタスクスケジューラから実行しようとした場合に、
の問題に合致するケースがあり得るので注意する必要があります。
.batは cmd.exe を経由します
ので、標準入出力が用意されます。
- Windows サービスやタスクスケジューラから直接起動されると、標準入出力が無い。
- 標準入力が用意されないことで、動作がおかしくなるコマンドもあるようです。
Tags: 移行, あるある, Windows, アカウント, セキュリティ, 障害対応, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。