Skip to content

MS_ServiceAndTaskTopics

nishi_74322014 edited this page Aug 12, 2026 · 1 revision

サービス・タスク系のいろいろ

概要

  • タスク = タスク・スケジューラ = 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の場合

  • 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 サービスやタスク スケジューラで
帳票ツールを使用しないで印刷を行う推奨された方式はない。

選択肢

Word などを利用する

  • Office サーバー サイド オートメーション
    マイクロソフトの非推奨

  • 一部、裏技的な方法もある。
    同じフォルダーにあるファイルのグループを印刷するマクロ
    http://support.microsoft.com/kb/107880/ja

    • Office サーバー サイド オートメーションに該当しなければ良いので、
      サーバ側にゲスト OS を用意してログイン状態でログイン・アカウントから
      Office オートメーションを実行すればこの問題には抵触しません。
    • ただし、サーバ側にクライアントのゲスト OS を用意する必要があるので
      ソリューションや製品の既定の処理方式としては問題のように思います。

APIを使用する

帳票ツールが出力するレベルを求めると難易度が高い。
また、帳票定義もないので開発・保守も難しくなる。

  • .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」として挙げている前提は現在では成り立たない点に注意。

帳票ツール

OSS

  • NPOI
  • Fisshplate.net
  • EPPlus(現在は商用有償。上記の補足を参照)

Excel帳票

  • ExcelCreator
  • ComponentOne Studio
  • ODBC
  • Open XML SDK

その他

  • SharePoint
    • SharePoint 2010 を使うと、サーバ側で、Word を PDF に変換できるらしい。
      • Word Automation Services の概要
    • SharePoint 2013 では、PowerPoint も 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 useWNetAddConnection)を使用して
      ネットワーク・アクセスをすると、
      Windows のデバイスへのマッピングを覚えます。
      • ファイル共有
      • プリンタ共有
      • ローカル・ドライブ
      • ローカル・プリンタ
    • これは、情報をプロファイルに覚えるので、
      対話型ユーザでログオンしている必要があるようです。
  • 必要に応じてユーザ・プロファイルをロード
    Windows サービスやタスク スケジューラの処理が、

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

    場合、必要に応じてユーザ・プロファイルをロードします。
    → ユーザ・プロファイルをロードする方法の詳細は
    Office サーバー サイド オートメーションを参照。

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

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

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

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

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

ので、標準入出力が用意されます。

  • Windows サービスやタスクスケジューラから直接起動されると、標準入出力が無い。
  • 標準入力が用意されないことで、動作がおかしくなるコマンドもあるようです。

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

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally