PowerShellでユーザーごとのプリントジョブを確認する方法

PowerShellでユーザーごとのプリントジョブを確認する方法という問いには、Get-Printerから各キューを読み、Get-PrintJob結果を集約してUserName完全一致で対象ユーザーを抽出するという方法で答えます。Get-PrintJobは指定プリンターキューのジョブを返し、ユーザー名の表記は環境によりドメイン付きになる。ジョブは完了するとキューから消えるため履歴台帳ではない。この記事ではPrinterName、ID、UserName、DocumentName、SubmittedTimeを一つのジョブ識別票にするを判断軸にし、実行前の確認、記事固有のコード、合否判定、戻し方を一続きで示します。

印刷履歴ではなく、現在キューに残るジョブをユーザー別に確認する。完了は「対象ユーザーの現在キュー内ジョブをプリンター、ID、状態、投入時刻付きで示せる」と定義します。対象が取れない場合は「0件なら正常完了済み、別プリントサーバー、ユーザー表記、閲覧権限を確認し、印刷していないと断定しない」として切り分け、推測で成功扱いにしません。

日程Fit。無料・登録不要。「いつ空いてる?」を、ひとつのリンクで。リンクを送って、○△×でかんたん日程調整。無料で日程を作る。
目次

全プリンターのキューを読み取る

全プリンターのキューを読み取るでは、ユーザー別プリントジョブの確認の対象を「PrinterName、ID、UserName、DocumentName、SubmittedTimeを一つのジョブ識別票にする」という単位で扱います。Get-PrintJobは指定プリンターキューのジョブを返し、ユーザー名の表記は環境によりドメイン付きになる。ジョブは完了するとキューから消えるため履歴台帳ではない。対象が複数なら表示名の部分一致で先頭を採らず、一意になる条件を追加します。

ユーザー別プリントジョブの確認を始める前に、PowerShellの版、コマンドの提供元、必要権限、管理ポリシーの有無を確認します。権限不足と対象なしは意味が異なるため、例外を0件へ置き換えません。

UserNameを含むジョブ一覧を作る

UserNameを含むジョブ一覧を作るは変更前の基準点です。PrinterName、ID、UserName、DocumentName、SubmittedTimeを一つのジョブ識別票にするを出力に含め、取得時刻と一緒に保存します。値だけを切り取ると別対象との比較になるため、識別列を省きません。

$queueErrors = @()
$jobs = @(Get-Printer -ErrorAction Stop | ForEach-Object {
  $printerName = $_.Name
  Get-PrintJob -PrinterName $printerName -ErrorAction SilentlyContinue -ErrorVariable +queueErrors |
    Select-Object @{n='PrinterName';e={$printerName}}, ID, UserName,
      DocumentName, JobStatus, SubmittedTime, Size
})
$jobs | Select-Object PrinterName, ID, UserName, JobStatus, SubmittedTime
if ($queueErrors.Count) {
  Write-Warning "$($queueErrors.Count)個のキューを完全には読めませんでした。"
}

Get-PrintJobは指定プリンターキューのジョブを返し、ユーザー名の表記は環境によりドメイン付きになる。ジョブは完了するとキューから消えるため履歴台帳ではない。出力が多い場合も最初から無理に一件へ絞らず、候補数と除外理由を残してから対象を決めます。

対象ユーザーを完全一致で絞る

Get-Printerから各キューを読み、Get-PrintJob結果を集約してUserName完全一致で対象ユーザーを抽出する。ユーザー別プリントジョブの確認ではこの進め方により、操作したという事実ではなく、期待する状態へ到達したかでタイトルの問いへ答えられます。印刷履歴ではなく、現在キューに残るジョブをユーザー別に確認する。

対象ユーザーを完全一致で絞るの合格条件は、対象ユーザーの現在キュー内ジョブをプリンター、ID、状態、投入時刻付きで示せることです。作業時刻、実行ユーザー、端末名を添え、判断に使った値が後から追える形にします。

SubmittedTimeとJobStatusを確認

SubmittedTimeとJobStatusを確認では、Get-Printerから各キューを読み、Get-PrintJob結果を集約してUserName完全一致で対象ユーザーを抽出する。ユーザー別プリントジョブの確認の例中にある名前、パス、ID、時刻はサンプルなので、そのまま本番へ貼らず、直前の読み取り結果から承認値を入れます。

$targetUser = 'CONTOSO\user01'
if ([string]::IsNullOrWhiteSpace($targetUser)) { throw '対象UserNameを指定してください。' }
$observedUsers = @($jobs | Where-Object UserName | Select-Object -ExpandProperty UserName -Unique)
$userJobs = @($jobs | Where-Object { [string]$_.UserName -eq $targetUser })
if ($userJobs.Count -eq 0) {
  Write-Warning '現在キューでは対象UserNameのジョブは0件です。印刷履歴なしとは断定しません。'
  [pscustomobject]@{
    TargetUser=$targetUser; CurrentJobCount=0
    ObservedUserNames=($observedUsers -join ',')
    QueueReadErrorCount=$queueErrors.Count
    Interpretation='NoCurrentQueuedJob'
  }
} else {
  $userJobs | Sort-Object SubmittedTime |
    Select-Object PrinterName, ID, UserName, DocumentName, JobStatus, SubmittedTime, Size
}

診断中にRemove-PrintJobを実行しない。DocumentNameに機密情報が含まれるため結果を広く共有しない。ユーザー別プリントジョブの確認でプレビュー対応コマンドを使える場合はWhatIfを先に実行し、非対応の操作は対象一覧と引数を画面へ出して人が承認してから一度だけ実行します。

ジョブ0件を印刷失敗としない

ジョブ0件を印刷失敗としないでは同じ対象を別経路でもう一度読みます。判定したいのは「コマンドが終了したか」ではなく、対象ユーザーの現在キュー内ジョブをプリンター、ID、状態、投入時刻付きで示せるかどうかです。

$byPrinter = @($userJobs | Group-Object PrinterName | ForEach-Object {
  [pscustomobject]@{
    TargetUser=$targetUser; PrinterName=$_.Name; CurrentJobs=$_.Count
    OldestSubmitted=($_.Group | Sort-Object SubmittedTime | Select-Object -First 1).SubmittedTime
    States=(($_.Group.JobStatus | Select-Object -Unique) -join ',')
  }
})
[pscustomobject]@{
  TargetUser=$targetUser; TotalCurrentJobs=$userJobs.Count
  PrinterCount=$byPrinter.Count; QueueReadErrorCount=$queueErrors.Count
  CompleteQueueRead=($queueErrors.Count -eq 0)
}
$byPrinter

0件なら正常完了済み、別プリントサーバー、ユーザー表記、閲覧権限を確認し、印刷していないと断定しない。ユーザー別プリントジョブの確認の期待値と実測値が一致しないときは追加変更を重ねず、対象識別、権限、ポリシー、時間差の順で原因を分けます。

権限不足で他ユーザーが見えない場合

診断中にRemove-PrintJobを実行しない。DocumentNameに機密情報が含まれるため結果を広く共有しない。権限不足で他ユーザーが見えない場合に該当したら、警告を消して継続するのではなく、どの条件で止まったかを記録します。

0件なら正常完了済み、別プリントサーバー、ユーザー表記、閲覧権限を確認し、印刷していないと断定しない。ユーザー別プリントジョブの確認ではエラー本文、FullyQualifiedErrorId、対象ID、直前に成功した段階を残すと、別担当者が安全な地点から調査できます。

文書名を含む結果を保護

滞留監視ではJobStatusと経過時間を組み合わせ、瞬間的なPrintingを障害にしない。ユーザー別プリントジョブの確認を繰り返す場合は、正常、対象なし、要承認、失敗を異なる終了状態として記録し、前回値との比較だけで異常を決めません。

文書名を含む結果を保護の識別軸PrinterName、ID、UserName、DocumentName、SubmittedTimeを一つのジョブ識別票にする
採用する実測対象ユーザーの現在キュー内ジョブをプリンター、ID、状態、投入時刻付きで示せる
0件時の扱い0件なら正常完了済み、別プリントサーバー、ユーザー表記、閲覧権限を確認し、印刷していないと断定しない
保留にする兆候診断中にRemove-PrintJobを実行しない。DocumentNameに機密情報が含まれるため結果を広く共有しない

ユーザー別プリントジョブの確認の実行記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外した候補と理由を同じ作業番号で残します。特に「PrinterName、ID、UserName、DocumentName、SubmittedTimeを一つのジョブ識別票にする」を省くと、後日の再確認で別対象の値を比較するおそれがあります。画面コピーだけでなく、日時と端末名を含む構造化した出力も保存します。

PowerShellでユーザーごとのプリントジョブを確認する方法を定期手順へ組み込む場合も、初回は対話的に候補を確認します。正常時は「対象ユーザーの現在キュー内ジョブをプリンター、ID、状態、投入時刻付きで示せる」、判定不能時は「0件なら正常完了済み、別プリントサーバー、ユーザー表記、閲覧権限を確認し、印刷していないと断定しない」、中止時は「診断中にRemove-PrintJobを実行しない。DocumentNameに機密情報が含まれるため結果を広く共有しない」をそれぞれ別の結果として扱います。これにより、0件や例外を都合よく成功へ丸めず、次の担当者が同じ対象と条件で追試できます。

修正後コードの合格条件:まず全キューからUserNameの実表記を確認し、ドメイン付きか否かを含む一つのtargetUserを完全一致で指定します。対象ジョブはPrinterName・ID・SubmittedTime付きで返し、0件なら完了済み、別サーバー、権限不足のいずれかとして保留します。

公式情報・参考資料

ユーザー別プリントジョブの確認で使うコマンド名、引数、対応環境は次のMicrosoft一次資料で確認しました。記事の確認日は2026年7月17日です。OSやモジュール更新後は、実行端末のGet-Helpと併せて再確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次