製品コラム

セイテクエンジニアのブログ  製品コラム  JCSessionのご紹介: アクティブなユーザーセッションでコマンドを実行ーJob Director R17活用例

 

 

JCSessionのご紹介: アクティブなユーザーセッションでコマンドを実行ーJob Director R17活用例

2026年09月09日配信
執筆者:セイ・テクノロジーズ エバンジェリスト

 Job Director R17(以下、Job Director)は、タスクスケジューラでは物足りないが、統合運用管理ツールでは高機能すぎるというお悩みを抱えるシステム管理者にぴったりなジョブ管理ツールです。それ自身、スケジュール機能を備えたWindowsの機能や他社ツールは多いですが、それらの機能やツールをコマンドラインで制御できれば、Job Directorの柔軟なジョブネットワークとカレンダ/スケジュール定義に基づいて、運用管理タスクのスケジュールを一元化できます。 今回は、RTAツールの実行管理にも利用できる、Job Directorに付属の「JCSession.exe」コマンドについて紹介します。

※この記事の内容は、Job Director R16以前も対応しています。

 

単位ジョブのスクリプト内で利用できるJCSessionコマンドとは

 

 Job Directorの業務プロセスの単体または集まりをジョブとして定義し、ジョブネットワークでグループ化して、スケジュール実行させることができます。ジョブの最小単位である「単位ジョブ」では、スクリプトとしてバッチファイルまたはコマンドラインを定義します。通常、単位ジョブのスクリプトは、Job Director管理者ユーザー(既定)、またはジョブの実行設定でジョブ実行ユーザーに指定したユーザーの権限を使用して、セッション0(サービスのセッション)で実行されます。そのため、実行ユーザーのログオン状態に関係なく、ジョブを実行させることができます。

 Job Directorに付属するJCSessionコマンドを使用すると、対象のWindowsコンピューターにログオン(サインイン)中のアクティブなユーザーセッション上で、対話型のGUIアプリケーションを含む任意のスクリプトをそのユーザーセッションのユーザー権限で実行させることができます。JCSessionコマンドは、セッション0の分離が導入された、Windows Server 2008およびWindows Vista以降で、GUIアプリケーションやExcelのマクロを設定したジョブを正常に実行するために導入されました。

 

 JCSessionのコマンドの構文は次のとおりです(%InstallDirectory%は通常、C:¥Job Director¥SV)。詳細については、Job Directorのマニュアル「コマンドリファレンス」の「3.27. JCSession 単位ジョブから指定したコマンドをActive状態のセッションで実行」を参照してください。

 

%InstallDirectory%\bin\utils\JCSession.exe [-i セッションID] コマンド 引数


 セッションIDとは、リモートデスクトップ接続を含むユーザーのログオンセッションのIDであり、1以上のIDがログオンごとに自動的に割り当てられます。ユーザーのセッションIDは、query userまたはquserコマンドの実行結果、またはタスクマネージャーの「ユーザー」タブの「ID」列で確認することができます。Windows Serverのようにマルチユーザーセッション環境の場合はセッションIDの指定が必要ですが、Windowsクライアントの場合はアクティブなユーザーセッションは1つだけなので、セッションIDの指定は省略できます。

 また、JCSessionコマンドを含む単位ジョブでは、単位ジョブパラメータとして投入キューに、LSA(Local System Account)属性が付与されたバッチキュー(“LSAバッチ”キュー)を指定する必要があります。LSAバッチキューに投入されたジョブは、システム(NT AUTHORITY¥SYSTEM)権限で実行されます。JCSessionコマンドはシステム権限を使用することで、アクティブなユーザーセッション上でスクリプトの実行を可能にしています。

 画面1の右側は、通常の単位ジョブとして、次のコマンドラインをスクリプトに定義したものです。左側は一般ユーザーでログオン中にこのジョブがスケジュール実行されたときのものです。このように、このPowerShellのコマンドラインは、コマンドラインを実行したユーザー名とセッションIDを取得し、Windows標準のMsg.exeコマンドを使用してログオンユーザーにメッセージを送信します。Administratorの権限で、セッション0でコマンドが実行されたことを示しています。

 

powershell.exe -Command "msg * ([PSCustomObject]@{UserName=[Environment]::UserName;SessionId=(Get-Process -Id $PID).SessionId})"

 

画面1 通常の単位ジョブによるメッセージの表示。Msg.exeコマンドがAdministrator、セッション0で実行されたことがわかる
画面1 通常の単位ジョブによるメッセージの表示。Msg.exeコマンドがAdministrator、セッション0で実行されたことがわかる

 画面2は、上記のコマンドラインをJCSessionのコマンドとして実行するように定義し、同じように一般ユーザーでログオン中にスケジュール実行させたときの結果です。

 

"C:\Job Director\SV\bin\utils\JCSession.exe" powershell.exe -Command "msg * ([PSCustomObject]@{UserName=[Environment]::UserName;SessionId=(Get-Process -Id $PID).SessionId})"

 

画面2 JCSessionコマンドとLSAバッチキューを使用して、同じコマンドラインを実行させると、ログオンユーザー(aduser01)の権限で、現在のログオンセッション(セッションID 6)で実行された
画面2 JCSessionコマンドとLSAバッチキューを使用して、同じコマンドラインを実行させると、ログオンユーザー(aduser01)の権限で、現在のログオンセッション(セッションID 6)で実行された

LSAバッチキューの作成

 

 LSAバッチキューは、Job Directorのインストールによって既定で作成されることはありません。「Job Directorクライアント(CL/Win)」で「マシン一覧」から対象のマシンを開き、「キュー一覧」を開いて、「追加 > バッチキュー」を選択してバッチキューを作成します。その後、作成したキューを右クリックして「キューパラメーター」を選択し、「キュー」タブで「LSA」を「ON」に設定します(画面3)。キューの優先度(既定 10)や多重度(既定 1)は「リクエスト」タブで調整できます。

 

 または、「Job Directorのインストールディレクトリ(通常、C:¥Job Director¥SV)¥bin¥qcmd」にインストールされるqmgrコマンドを実行して、次のように作成します。この例は、LSAバッチキュー「usersessionq1」を、優先度「20」、多重度「3」で作成しています(画面3)。詳細については、Job Directorのマニュアル「NQS機能利用の手引き」の「6.1.3.8. LSAキュー属性」を参照してください。

 

create batch_queue usersessionq1 priority=20 run_limit=3
set lsa batch_queue usersessionq1
enable queue usersessionq1
start queue usersessionq1
exit

 

jdandrtatool_scr03new
画面3 LSA属性を付与したバッチキューを作成する。qmgrコマンドを使用して作成することも可能

 

活用例: RTAツールの実行スケジュールの集中管理

 

 JCSessionコマンドは、ログオン中のユーザー権限で実行したいコマンドや、アクティブなユーザーセッションのデスクトップ上で実行したいツールの集中的なスケジュール管理に利用できます。例えば、GUI操作を含む定型的な操作を自動化するRTA(Robotic Task Automation)ツールのスケジュール実行などです。集中管理まで含めたRTAの環境を構築すると、管理製品(通常、クラウドサービス)の契約など、導入・運用コストが高くなりやすいという課題があります。 例えば、Microsoft Power Automateの場合、スタンドアロンでの利用(ワークフローの作成と実行)は無料ですが、クラウドからの集中管理や高度なオーケストレーション機能を利用するには、有償ライセンス(Power Automate PremiumやPower Automate Premium Processなど)が必要です。 

 RTAツールの利用が限定され、管理製品の導入は大げさすぎるという場合、Job DirectorのJCSessionコマンドの機能を活用することで、コストを抑えながら、RTAツールのスケジュール実行と成功/失敗の集中管理を実現できます。Job Directorの導入・運用コストの利点については、以下のサイトでご確認ください。

 

Job Directorへの切り替えで運用コストを削減|高機能ジョブスケジューラー『Job Director R17』(SAY Technologies


 Power Automateを例に、Job DirectorによるRTAツール実行の自動化の例を紹介しましょう。Power Automateは、MicrosoftアカウントまたはMicrosoft Entra IDアカウントでサインインして利用できます。いずれの場合も自分で作成したフローを、以下のURLスキームで呼び出すことができます。ワークフローIDは、フローのプロパティの詳細設定で確認できます(画面4)。

 

ms-powerautomate:/console/flow/run?workflowid=ワークフローID

 

画面4 コマンドラインからのPower Automateのフローの実行
画面4 コマンドラインからのPower Automateのフローの実行

 なお、外部からのフローの呼び出しを確認なしで実行できるようにするには、Power Automateの設定にある「フローを外部から呼び出すときに確認ダイアログを表示する」をオフにする必要があります。設定が表示されない、あるいはグレーアウトして変更できないという場合は、コマンドプロンプトやPowerShell(管理者昇格不要)で次のコマンドラインを実行します。

 

REG ADD "HKCU\Software\Microsoft\Power Automate Desktop" /v EnableAskBeforeRunningAFlowExternally /t REG_DWORD /d 0 /f

 

 ワークフローが実行されると、ワークフローの実行(RunID)ごとに作成されるJSONファイル「RunDefinition.json」に実行ステータス(Status)が書き込まれます。次のPowerShellスクリプト「runflow.ps1」は、Job Directorからワークフローを実行するために用意したもので、引数にワークフローIDを指定して実行することで、ワークフローを実行し、その結果を標準出力および終了コード(成功は0)で返します。このスクリプトを単位ジョブのスクリプトに記述し、LSAバッチキューを投入キューとして指定すれば、ジョブネットワークのスケジュールに従ってユーザーのワークフローをユーザー自身の環境(ユーザーセッションのデスクトップ上)で自動実行させることができます(画面5)。

 

"C:\Job Director\SV\bin\utils\JCSession.exe" powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\runflow.ps1 -WorkflowId "ワークフローID"

 

[runflow.ps1]プレーンテキストで表示/ダウンロード)

param (
  [Parameter(Mandatory = $true)]
  [string]$WorkflowId
)
$TimeoutSec = 300
$startTime = Get-Date
$logRoot = Join-Path $env:LOCALAPPDATA "Microsoft\Power Automate Desktop\Console\Scripts"

# ワークフローの開始
Start-Process "ms-powerautomate:/console/flow/run?workflowid=$WorkflowId"

# 5分以内に作成されたこのワークフローのRunDefinition.jsonを探す
# $logRoot\{WorkflowID}$Ruuns\{RunID}\RunDefinition.json
$deadline = (Get-Date).AddSeconds($TimeoutSec)
$runDefinition = $null

while ((Get-Date) -lt $deadline) {
    $runDefinition = Get-ChildItem $logRoot -Recurse -Filter "RunDefinition.json" -ErrorAction SilentlyContinue |
        Where-Object {
            $_.LastWriteTime -ge $startTime -and
            ((Get-Content $_.FullName -Raw | ConvertFrom-Json).workflow.workflowId -eq $WorkflowId)
        } |
        Sort-Object LastWriteTime -Descending |
        Select-Object -First 1

    if ($runDefinition) {
        break
    }

    Start-Sleep -Seconds 1
}

if (-not $runDefinition) {
    Write-Error "RunDefinition.json not found. Is WorkflowId: $($WorkflowId) correct? "
    exit 9
}

# 実行完了まで待機
do {
    Start-Sleep -Seconds 1
    $json = Get-Content $runDefinition.FullName -Raw | ConvertFrom-Json
    $status = $json.status
} while ($status -in @("Running", "NotStarted", "Queued"))
$status
switch ($status) {
    "Succeeded" { exit 0 }
    "Failed"    { exit 1 }
    "Canceled"  { exit 2 }
    default     { exit 9 }
}


画面5 Power Automateの個人の定義済みワークフローを自動実行させるジョブネットワークの例
画面5 Power Automateの個人の定義済みワークフローを自動実行させるジョブネットワークの例

 ジョブネットワークでは、ワークフローを実行する単位ジョブの前後に、前処理と後処理を含めています。最初の「CheckActiveUser」ジョブは、アクティブなユーザーセッションが存在するかどうかを確認し、存在しない場合は終了コード1で異常終了させ、以降のジョブを実行させないために追加しました。JCSessionコマンドは、アクティブなユーザーセッションが存在しない場合、異常終了(終了コード1)で失敗するからです。


 ワークフロー実行の前後にある「ShowMsg_Start」と「ShowMsg_End」ジョブは、ワークフロー開始前と後に開始と終了のメッセージ(WPFウィンドウ)を一定期間(開始60秒、終了30秒)、デスクトップ右下に表示させるもので、ワークフローのジョブと同様に、JCSessionコマンドとLSAバッチキューで実行させます。GUI操作を自動化するようなRTAツールのワークフロー実行中に、ユーザーが勝手に操作してしまうと、ワークフローが失敗する可能性があります。開始前にユーザーにその旨を案内し、完了通知も表示することで、ユーザー操作がワークフローに影響するのを回避できるでしょう(画面6)。

CheckActiveUserジョブ(投入キュー: 指定不要)のスクリプト

(※ジョブネットワークのパラメーターの実行設定で「エラー時の自動停止: 停止する」にすることで、アクティブユーザーがいない場合にジョブネットワークを即時終了させることができます)
ShowMsg_Startジョブ(投入キュー: LSAバッチ)のスクリプト
ShowMsg_Endジョブ(投入キュー: LSAバッチ)のスクリプト

 

 画面6 Job DirectorでスケジューリングしたPower Automateのワークフロー実行中の様子
画面6 Job DirectorでスケジューリングしたPower Automateのワークフロー実行中の様子

 JCSessoionは異常終了した場合、終了コード1を返します。成功した場合、JCSession自身は終了コード0で終わりますが、その終了コードは最終的にJCSessionで実行したコマンドの終了コードで上書きされます。そのため、コマンドの実行結果は、単位ジョブの成功/失敗に反映されます(画面7)。

 

画面7 終了コード0は、JCSessionで実行したrunflow.ps1の終了コードが0、つまりワークフローの実行成功を示している
画面7 終了コード0は、JCSessionで実行したrunflow.ps1の終了コードが0、つまりワークフローの実行成功を示している

 

JCSessionコマンドのFAQ

 

Q. JCSessionコマンドのエラー: Active session is not found

A. 単位ジョブ実行時にアクティブなユーザーセッションが存在していませんでした。


Q. JCSessionコマンドのエラー: WTSQueryUserToken ERROR、SessionId=X,ec=1314

A. 投入キューとしてLSAバッチキューが設定されていません。

 

Q. JCSessionコマンドのエラー: CreateProcessAsUser ERROR, ec=740.

A. UAC(ユーザーアカウント制御)の昇格が必要なコマンドをJCSessionに直接指定した場合、このエラーが発生します。UACの昇格が必要なコマンドは、「JCSession.exe cmd /c コマンド」のように指定してください。なお、UAC昇格を自動化するものではありません。UAC昇格にはユーザーの対話操作が必要です。


Q. ジョブ実行時にデスクトップがロックされていた場合、どうなりますか?

A. ローカルコンピューターにログオン中にワークステーションをロックした場合、ユーザーセッションはアクティブなままであるため、JCSessionコマンドは実行されます。ただし、ロック中は、通常のデスクトップとは別のセキュリティで保護されたデスクトップ(Secure Desktop)がアクティブになるため、通常のデスクトップがアクティブであることを想定しているRTAツールなどは実行に失敗する可能性があります。ディスプレイの電源をオフにする、スクリーンセーバー(再開時にログオン画面に戻る)でも、同様の影響がある可能性があります。

 

Q. ジョブ実行時にユーザーがセッションから切断されていた場合、どうなりますか?

A. 切断されたセッションはアクティブではないため、JCSessionコマンドはエラー(Active session is not found)、終了コード1で異常終了します。

 

Q. JCSessionコマンドを実行する単位ジョブで、実行ユーザーを指定することはできますか?

A. 実行ユーザーの指定は無視されます。

blog_column_subscribe

blog_column_comment

最新記事