PowerShellでSCCMのクライアント正常性をチェックし異常端末を自動修復する方法

SCCM (System Center Configuration Manager) は、多くの企業や組織でWindows端末の管理に活用されています。しかし、クライアント端末の正常性が損なわれると、ソフトウェアの配布やパッチ管理が適切に行えなくなり、システム全体のセキュリティや運用効率に悪影響を及ぼす可能性があります。

本記事では、PowerShellを活用してSCCMクライアントの正常性をチェックし、異常が検出された場合に自動的に修復や再インストールを行う方法について詳しく解説します。具体的には、以下の手順を紹介します。

  • SCCMクライアントの正常性とは何か?
  • PowerShellで正常性をチェックする方法
  • 異常を検知した場合の自動修復手法
  • SCCMクライアントの再インストールを自動化する手順
  • ログ記録や通知機能の実装
  • タスクスケジューラを利用した定期実行
  • 実際の運用で発生しやすいトラブルとその解決策

これらの手法を用いることで、SCCMの管理業務を効率化し、クライアント端末の安定性を確保することができます。PowerShellを活用した自動化によって、管理者の負担を軽減し、IT運用の信頼性を向上させましょう。

目次

SCCMクライアントの正常性とは


SCCM (System Center Configuration Manager) クライアントの正常性とは、クライアント端末が適切にSCCMサーバーと通信し、ポリシーの適用、ソフトウェア配布、パッチ適用などの管理タスクを正常に実行できる状態を指します。SCCMクライアントが正常に機能していないと、エンドポイントの管理が滞り、セキュリティリスクや運用の効率低下につながる可能性があります。

正常なクライアントの状態


SCCMクライアントが正常な場合、以下の条件を満たしている必要があります。

  • SCCM管理サーバーと正常に通信できる
  • クライアントがSCCMのMP (Management Point) と定期的に通信し、ポリシーやステータスの更新が行われている。
  • クライアントエージェントが有効かつ稼働している
  • CCMExec (SMS Agent Host) サービスが正常に動作している。
  • ハードウェアおよびソフトウェアのインベントリが最新
  • 定期的にインベントリデータを収集し、SCCMに報告している。
  • ソフトウェア配布やパッチ適用が成功する
  • 必要なアプリケーションやWindows Updateの配布が問題なく実行されている。

異常なクライアントの症状


一方で、異常なクライアントは以下のような問題を抱えている可能性があります。

  • SCCMサーバーとの通信が途絶えている
  • クライアントがSCCMサーバーと通信できず、最新のポリシーを取得できない。
  • CCMExecサービスが停止している
  • クライアントのエージェントが停止しており、管理タスクを実行できない。
  • インベントリデータの送信が行われていない
  • クライアントの情報がSCCMに更新されず、正確な状態が把握できない。
  • ソフトウェア配布やパッチ適用が失敗している
  • クライアントがソフトウェアやパッチの適用に失敗し、セキュリティリスクが高まる。

クライアント正常性のチェック方法


SCCMでは、クライアントの正常性を確認するために以下の方法を利用できます。

  1. SCCMコンソールでの正常性レポートの確認
  • SCCM管理コンソールの「クライアント正常性ダッシュボード」からステータスを確認できる。
  1. PowerShellスクリプトを使用したチェック
  • 各クライアントの状態をスクリプトで確認し、問題がある端末をリストアップする。
  1. ログファイルの分析
  • C:\Windows\CCM\Logs\ccmexec.log などのログを確認し、エラーの有無を判断する。

このように、SCCMクライアントの正常性を定期的に監視することで、異常が発生した際に迅速な対応が可能となります。次の章では、PowerShellを活用してクライアントの正常性を自動チェックする方法について詳しく解説します。

PowerShellを活用したSCCMクライアントの正常性チェック方法


SCCMクライアントの正常性を確認するためには、手動でSCCM管理コンソールを使用する方法もありますが、大規模環境では自動化が不可欠です。PowerShellを活用することで、複数のクライアント端末の状態を一括でチェックし、異常がある端末を特定することができます。

チェックするべき主要項目


PowerShellを使ってSCCMクライアントの正常性を確認する際には、以下のポイントを重点的にチェックします。

  1. SCCMエージェントのサービスが稼働しているか
  • CCMExec (SMS Agent Host) サービスが実行中であるか確認。
  1. クライアントがSCCMサーバーと正常に通信できるか
  • WMI を使ってMP (Management Point) との通信状況を確認。
  1. インベントリデータが最新であるか
  • クライアントの LastHardwareScan や LastSoftwareScan の時刻をチェック。
  1. ソフトウェア配布やパッチ適用が成功しているか
  • 失敗したアプリケーション配布やWindows Updateの適用状況を確認。

PowerShellスクリプトによる正常性チェック


以下のPowerShellスクリプトを使用すると、SCCMクライアントの正常性を一括でチェックできます。

# SCCMクライアントの正常性をチェックするPowerShellスクリプト
$Computers = Get-Content "C:\SCCM_Client_List.txt"  # クライアント一覧ファイル

foreach ($Computer in $Computers) {
    if (Test-Connection -ComputerName $Computer -Count 2 -Quiet) {
        Write-Host "$Computer に接続中..." -ForegroundColor Green

        # SCCMサービスの状態確認
        $ServiceStatus = Get-Service -ComputerName $Computer -Name CCMExec -ErrorAction SilentlyContinue
        if ($ServiceStatus.Status -ne "Running") {
            Write-Host "$Computer: SCCMサービスが停止しています" -ForegroundColor Red
        } else {
            Write-Host "$Computer: SCCMサービスは正常に稼働しています" -ForegroundColor Green
        }

        # WMI を使用してSCCMのMP接続を確認
        $MPStatus = Get-WmiObject -Namespace "root\ccm" -Class "SMS_Authority" -ComputerName $Computer -ErrorAction SilentlyContinue
        if ($MPStatus) {
            Write-Host "$Computer: MPとの通信は正常です" -ForegroundColor Green
        } else {
            Write-Host "$Computer: MPとの通信に失敗しました" -ForegroundColor Red
        }

        # インベントリデータの最新性を確認
        $Inventory = Get-WmiObject -Namespace "root\ccm\SoftwareMeteringAgent" -Class "CCM_SoftwareMeteringClientConfig" -ComputerName $Computer -ErrorAction SilentlyContinue
        if ($Inventory.LastHardwareScan -gt (Get-Date).AddDays(-7)) {
            Write-Host "$Computer: インベントリデータは最新です" -ForegroundColor Green
        } else {
            Write-Host "$Computer: インベントリデータが古い可能性があります" -ForegroundColor Red
        }
    } else {
        Write-Host "$Computer に接続できません" -ForegroundColor Yellow
    }
}

スクリプトの動作説明

  1. C:\SCCM_Client_List.txt に記載されたクライアント端末一覧を読み込みます。
  2. 各端末に対して、Test-Connection を使用して到達可能かどうかを確認します。
  3. Get-Service を使用して CCMExec サービスの状態を取得し、停止している場合は異常として報告します。
  4. Get-WmiObject を使って SMS_Authority クラスの情報を取得し、SCCMのMPとの通信状況を確認します。
  5. Get-WmiObject を用いて LastHardwareScan の日付を取得し、1週間以上前のデータであれば古いと判断します。

実行結果の例

PC01 に接続中...
PC01: SCCMサービスは正常に稼働しています
PC01: MPとの通信は正常です
PC01: インベントリデータは最新です

PC02 に接続中...
PC02: SCCMサービスが停止しています
PC02: MPとの通信に失敗しました
PC02: インベントリデータが古い可能性があります

PC03 に接続できません

スクリプトの応用


このスクリプトをタスクスケジューラに登録して定期的に実行すれば、クライアントの正常性を継続的に監視することが可能です。また、異常端末を検出した場合にメール通知を送る機能を追加すれば、迅速な対応ができるようになります。

次の章では、異常が検出された場合にPowerShellを用いて自動的に修復を試みる方法を解説します。

クライアント異常時の自動修復の仕組み


SCCMクライアントが異常な状態にある場合、手動で修正するのは手間がかかります。特に大規模環境では、多数の端末の異常を迅速に解決する必要があります。本章では、PowerShellを活用し、クライアント異常時に自動的に修復を試みる方法について解説します。

自動修復の対象となる異常


以下のような異常を検出した場合に、PowerShellスクリプトを用いて自動修復を実行します。

  1. SCCMエージェント (CCMExec) のサービスが停止している
  • 修復方法:CCMExec サービスを自動的に再起動
  1. SCCM管理ポイント (MP) との通信エラー
  • 修復方法:WMIの修復、クライアントポリシーのリセット
  1. ハードウェア・ソフトウェアインベントリが最新でない
  • 修復方法:インベントリ収集を強制実行
  1. ソフトウェア配布やWindows Updateの適用に失敗している
  • 修復方法:SCCMクライアントのリセットまたは再インストール

PowerShellスクリプトによる自動修復


以下のPowerShellスクリプトを使用すると、異常を検出した場合に自動的に修復を試みます。

$Computers = Get-Content "C:\SCCM_Client_List.txt"  # クライアント一覧ファイル

foreach ($Computer in $Computers) {
    if (Test-Connection -ComputerName $Computer -Count 2 -Quiet) {
        Write-Host "$Computer に接続中..." -ForegroundColor Green

        # SCCMサービスの状態確認
        $ServiceStatus = Get-Service -ComputerName $Computer -Name CCMExec -ErrorAction SilentlyContinue
        if ($ServiceStatus.Status -ne "Running") {
            Write-Host "$Computer: SCCMサービスが停止しています。再起動を試行します..." -ForegroundColor Yellow
            Invoke-Command -ComputerName $Computer -ScriptBlock { Start-Service -Name CCMExec }
        }

        # SCCM管理ポイント (MP) との通信確認
        $MPStatus = Get-WmiObject -Namespace "root\ccm" -Class "SMS_Authority" -ComputerName $Computer -ErrorAction SilentlyContinue
        if (-not $MPStatus) {
            Write-Host "$Computer: MPとの通信に失敗しました。WMIの修復を試行します..." -ForegroundColor Yellow
            Invoke-Command -ComputerName $Computer -ScriptBlock {
                # WMIリポジトリの修復
                winmgmt /salvagerepository
                winmgmt /resetrepository
                Restart-Service winmgmt -Force
            }
        }

        # インベントリ収集の強制実行
        $LastScan = Get-WmiObject -Namespace "root\ccm\SoftwareMeteringAgent" -Class "CCM_SoftwareMeteringClientConfig" -ComputerName $Computer -ErrorAction SilentlyContinue
        if ($LastScan.LastHardwareScan -lt (Get-Date).AddDays(-7)) {
            Write-Host "$Computer: インベントリデータが古いため、収集を強制実行します..." -ForegroundColor Yellow
            Invoke-Command -ComputerName $Computer -ScriptBlock {
                Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "TriggerSchedule" -ArgumentList "{00000000-0000-0000-0000-000000000113}"
            }
        }

        # ソフトウェア配布・更新の修正
        Invoke-Command -ComputerName $Computer -ScriptBlock {
            Write-Host "SCCMクライアントのポリシーをリセットします..."
            Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "ResetPolicy"
            Restart-Service -Name CCMExec -Force
        }
    } else {
        Write-Host "$Computer に接続できません" -ForegroundColor Red
    }
}

スクリプトの動作説明

  1. CCMExec サービスが停止している場合は再起動
  2. MPとの通信エラーが発生している場合はWMIを修復
  3. インベントリデータが7日以上更新されていない場合は強制収集を実行
  4. ポリシーリセットとSCCMクライアントサービスの再起動を実施

実行結果の例

PC01 に接続中...
PC01: SCCMサービスは正常に稼働しています
PC01: MPとの通信は正常です
PC01: インベントリデータが最新です

PC02 に接続中...
PC02: SCCMサービスが停止しています。再起動を試行します...
PC02: MPとの通信に失敗しました。WMIの修復を試行します...
PC02: インベントリデータが古いため、収集を強制実行します...
PC02: SCCMクライアントのポリシーをリセットします...

PC03 に接続できません

スクリプトの運用方法


このスクリプトを定期的に実行することで、SCCMクライアントの異常を自動的に修復できます。タスクスケジューラを利用して1日1回のスキャンを設定すると、管理者が手動で対応する手間を大幅に削減できます。

次の章では、SCCMクライアントが修復不可能な場合に、自動的に再インストールを行う方法について解説します。

PowerShellによるSCCMクライアントの再インストール手順


SCCMクライアントが深刻な異常状態にある場合、修復では対応しきれないケースもあります。たとえば、WMIの破損やSCCMエージェントが正常に動作しない場合は、再インストールが最も確実な解決策となります。本章では、PowerShellを用いてSCCMクライアントの自動再インストールを実施する手順について解説します。

再インストールが必要なケース


以下のような状況では、SCCMクライアントの修復ではなく再インストールを行う必要があります。

  1. WMIが深刻に破損している
  • WMIリポジトリの修復ができず、SCCMの管理機能が正常に動作しない。
  1. SCCMエージェントのサービス (CCMExec) が起動できない
  • サービスの再起動や修復を試しても改善しない。
  1. SCCMクライアントがサーバーと通信できない
  • ポリシーのリセットやネットワークの確認を行っても解決しない。
  1. インベントリ収集やソフトウェア配布が一切機能しない
  • クライアントが管理下にない状態となっており、コンソール上で「クライアントなし」と表示される。

PowerShellスクリプトによるSCCMクライアントの再インストール


以下のPowerShellスクリプトを使用すると、異常なクライアントを自動的に再インストールできます。

$Computers = Get-Content "C:\SCCM_Client_List.txt"  # クライアント一覧ファイル
$SCCMSetupPath = "\\SCCM_Server\SMSClient\ccmsetup.exe"  # SCCMクライアントのセットアップファイル

foreach ($Computer in $Computers) {
    if (Test-Connection -ComputerName $Computer -Count 2 -Quiet) {
        Write-Host "$Computer に接続中..." -ForegroundColor Green

        # SCCMクライアントのアンインストール
        Write-Host "$Computer: SCCMクライアントをアンインストール中..." -ForegroundColor Yellow
        Invoke-Command -ComputerName $Computer -ScriptBlock {
            $CCMSetupPath = "C:\Windows\ccmsetup\ccmsetup.exe"
            if (Test-Path $CCMSetupPath) {
                Start-Process -FilePath $CCMSetupPath -ArgumentList "/uninstall" -NoNewWindow -Wait
            } else {
                Write-Host "SCCMクライアントが見つかりませんでした。" -ForegroundColor Red
            }
        }

        # WMIのリセット (必要な場合)
        Write-Host "$Computer: WMIをリセットしています..." -ForegroundColor Yellow
        Invoke-Command -ComputerName $Computer -ScriptBlock {
            Stop-Service winmgmt -Force
            Remove-Item -Path "C:\Windows\System32\wbem\Repository" -Recurse -Force
            Start-Service winmgmt
        }

        # SCCMクライアントの再インストール
        Write-Host "$Computer: SCCMクライアントを再インストール中..." -ForegroundColor Yellow
        Invoke-Command -ComputerName $Computer -ScriptBlock {
            Start-Process -FilePath "\\SCCM_Server\SMSClient\ccmsetup.exe" -ArgumentList "/mp:SCCM_Server /logon SMSSITECODE=ABC FSP=SCCM_Server" -NoNewWindow -Wait
        }

        # SCCMクライアントのインストール状況確認
        Start-Sleep -Seconds 30  # インストール待機
        $ServiceStatus = Get-Service -ComputerName $Computer -Name CCMExec -ErrorAction SilentlyContinue
        if ($ServiceStatus.Status -eq "Running") {
            Write-Host "$Computer: SCCMクライアントの再インストールが完了しました。" -ForegroundColor Green
        } else {
            Write-Host "$Computer: SCCMクライアントのインストールに失敗しました。" -ForegroundColor Red
        }
    } else {
        Write-Host "$Computer に接続できません" -ForegroundColor Red
    }
}

スクリプトの動作説明

  1. SCCMクライアントのアンインストール
  • C:\Windows\ccmsetup\ccmsetup.exe /uninstall を実行して、既存のSCCMクライアントを削除します。
  1. WMIのリセット (必要な場合のみ実行)
  • winmgmt サービスを停止し、WMIリポジトリ (C:\Windows\System32\wbem\Repository) を削除後、再起動します。
  1. SCCMクライアントの再インストール
  • \\SCCM_Server\SMSClient\ccmsetup.exe を使用して、クライアントを再インストールします。
  • /mp:SCCM_Server は管理ポイントを指定するオプションです。
  • SMSSITECODE=ABC はSCCMサイトコードを指定します (環境に応じて変更)。
  1. 再インストールの成功確認
  • CCMExec サービスが起動しているかをチェックし、正常にインストールされたかを確認します。

実行結果の例

PC01 に接続中...
PC01: SCCMクライアントをアンインストール中...
PC01: WMIをリセットしています...
PC01: SCCMクライアントを再インストール中...
PC01: SCCMクライアントの再インストールが完了しました。

PC02 に接続中...
PC02: SCCMクライアントをアンインストール中...
PC02: SCCMクライアントのインストールに失敗しました。

PC03 に接続できません

スクリプトの運用方法

  • タスクスケジューラで定期的に実行
  • SCCMクライアントが正常に動作しているかを定期的に確認し、異常があれば再インストールを自動化する。
  • SCCMのリモート修復機能と組み合わせる
  • SCCM管理コンソールのスクリプト機能と併用することで、GUI上から手動で実行可能にする。
  • ログ記録機能を追加する
  • スクリプトの結果をログファイル (C:\Logs\SCCMClientHealth.log) に保存することで、トラブルシューティングを容易にする。

この方法を活用することで、SCCMクライアントの正常性を自動的に維持し、IT運用の効率を向上させることができます。次の章では、スクリプトのログ記録と管理者への通知機能の実装について解説します。

ログの記録と通知の実装方法


SCCMクライアントの正常性を自動でチェックし、異常時に修復・再インストールを実行する仕組みが整ったら、次に必要なのは結果の記録と通知の実装です。適切なログ管理と管理者への通知を行うことで、異常の発生状況を把握し、迅速な対応が可能になります。本章では、PowerShellスクリプトを用いてログを記録し、メールやイベントログを活用した通知の実装方法を解説します。

ログ記録の重要性


SCCMクライアントの状態を確認・修復するスクリプトを実行する際、実行結果を記録しておくことで以下のメリットがあります。

  • トラブルシューティングが容易になる
  • どの端末で問題が発生したか、どの処理が成功または失敗したかを確認できる。
  • 過去の異常発生履歴を追跡できる
  • 定期的に異常を検出している端末を特定し、恒久的な対策を講じることが可能。
  • 管理者が迅速に対応できる
  • 通知を活用することで、問題が発生した際にすぐに管理者に知らせることができる。

PowerShellによるログ記録の実装


以下のスクリプトは、SCCMクライアントの正常性チェックおよび修復の結果をログファイルに保存する機能を追加したものです。

$Computers = Get-Content "C:\SCCM_Client_List.txt"  # クライアント一覧ファイル
$LogFile = "C:\Logs\SCCMClientHealth.log"  # ログファイルの保存先

# ログ記録関数
Function Write-Log {
    param([string]$Message)
    $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $LogEntry = "$Timestamp - $Message"
    Add-Content -Path $LogFile -Value $LogEntry
    Write-Host $LogEntry
}

foreach ($Computer in $Computers) {
    if (Test-Connection -ComputerName $Computer -Count 2 -Quiet) {
        Write-Log "$Computer に接続中..."

        # SCCMサービスの確認
        $ServiceStatus = Get-Service -ComputerName $Computer -Name CCMExec -ErrorAction SilentlyContinue
        if ($ServiceStatus.Status -ne "Running") {
            Write-Log "$Computer: SCCMサービスが停止。再起動を試行..."
            Invoke-Command -ComputerName $Computer -ScriptBlock { Start-Service -Name CCMExec }
        }

        # SCCM管理ポイント (MP) との通信確認
        $MPStatus = Get-WmiObject -Namespace "root\ccm" -Class "SMS_Authority" -ComputerName $Computer -ErrorAction SilentlyContinue
        if (-not $MPStatus) {
            Write-Log "$Computer: MPとの通信エラー。WMIの修復を実行..."
            Invoke-Command -ComputerName $Computer -ScriptBlock {
                winmgmt /salvagerepository
                winmgmt /resetrepository
                Restart-Service winmgmt -Force
            }
        }

        # インベントリデータの最新性確認
        $LastScan = Get-WmiObject -Namespace "root\ccm\SoftwareMeteringAgent" -Class "CCM_SoftwareMeteringClientConfig" -ComputerName $Computer -ErrorAction SilentlyContinue
        if ($LastScan.LastHardwareScan -lt (Get-Date).AddDays(-7)) {
            Write-Log "$Computer: インベントリデータが古いため、強制収集を実行..."
            Invoke-Command -ComputerName $Computer -ScriptBlock {
                Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "TriggerSchedule" -ArgumentList "{00000000-0000-0000-0000-000000000113}"
            }
        }
    } else {
        Write-Log "$Computer に接続できません"
    }
}

スクリプトの実行結果 (ログファイルの内容例)

2025-02-10 10:00:15 - PC01 に接続中...
2025-02-10 10:00:16 - PC01: SCCMサービスが停止。再起動を試行...
2025-02-10 10:00:25 - PC01: MPとの通信エラー。WMIの修復を実行...
2025-02-10 10:00:40 - PC01: インベントリデータが古いため、強制収集を実行...
2025-02-10 10:00:45 - PC02 に接続できません

管理者へのメール通知の実装


異常が発生した場合に、管理者へメールで通知することも可能です。以下のスクリプトを追加することで、特定の条件に応じてメールを送信できます。

$SMTPServer = "smtp.example.com"
$From = "[email protected]"
$To = "[email protected]"
$Subject = "SCCMクライアント異常通知"

Function Send-AlertMail {
    param([string]$Body)
    $Message = New-Object System.Net.Mail.MailMessage $From, $To, $Subject, $Body
    $SMTP = New-Object System.Net.Mail.SmtpClient $SMTPServer
    $SMTP.Send($Message)
}

# もし異常が発生した場合、メールで通知
if (Select-String -Path $LogFile -Pattern "エラー" -Quiet) {
    $ErrorLog = Get-Content $LogFile | Select-String "エラー"
    Send-AlertMail -Body "以下のエラーが発生しました`n`n$ErrorLog"
}

このスクリプトは、ログファイル内に「エラー」などのキーワードを検出した場合に、管理者へ通知を送信します。


イベントログを利用した異常の記録


イベントビューアを利用して異常を記録することもできます。以下のコマンドをスクリプトに追加することで、Windowsのイベントログにエラーを記録できます。

Write-EventLog -LogName Application -Source SCCMHealthCheck -EntryType Error -EventId 1001 -Message "SCCMクライアントの異常を検出しました"

この方法を利用すると、SCCMクライアントの異常が発生した際に、Windowsの管理コンソールから問題の追跡が容易になります。


まとめ


本章では、SCCMクライアントの正常性チェック結果をログファイルに記録し、異常発生時にメールで通知する方法を解説しました。これにより、管理者は問題発生時に迅速に対応できるようになります。次の章では、タスクスケジューラを利用したスクリプトの自動実行について解説します。

スケジュール化と定期実行の設定


SCCMクライアントの正常性を定期的に監視し、異常が発生した場合に自動で修復・再インストールを実行するためには、タスクスケジューラを活用した定期実行の設定が必要です。本章では、PowerShellスクリプトをタスクスケジューラに登録し、自動で実行する方法を解説します。

タスクスケジューラを利用するメリット


タスクスケジューラを使用することで、以下のメリットがあります。

  • 手動でスクリプトを実行する手間を省ける
  • 毎日または一定間隔で自動実行し、継続的にクライアントの監視が可能
  • 夜間や業務時間外に実行することで、ユーザーの業務に影響を与えずに修復処理を行える

タスクスケジューラへのPowerShellスクリプト登録手順

  1. スクリプトの保存
  • 以下のPowerShellスクリプトを C:\Scripts\SCCMClientHealthCheck.ps1 に保存します。
   $LogFile = "C:\Logs\SCCMClientHealth.log"
   $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
   Add-Content -Path $LogFile -Value "$Timestamp - SCCMクライアント正常性チェック開始"

   # SCCMクライアント正常性チェックスクリプトを実行
   PowerShell -ExecutionPolicy Bypass -File "C:\Scripts\SCCMClientCheck.ps1"

   Add-Content -Path $LogFile -Value "$Timestamp - SCCMクライアント正常性チェック終了"
  1. タスクスケジューラを開く
  • Windowsキー + R を押して taskschd.msc を入力し、タスクスケジューラを開きます。
  1. 新しいタスクを作成
  • 「タスクの作成」をクリックし、以下の設定を行います。 [全般] タブ
  • 名前:「SCCMClientHealthCheck」
  • セキュリティオプション:「最上位の特権で実行する」にチェック [トリガー] タブ
  • 「新規」をクリックし、以下の設定を入力
    • 頻度:「毎日」
    • 開始時間:「03:00 AM」(夜間実行推奨)
    • 間隔:「1日」
    [操作] タブ
  • 「新規」をクリックし、以下の設定を入力
    • 操作:「プログラムの開始」
    • プログラム/スクリプト:powershell.exe
    • 引数の追加:-ExecutionPolicy Bypass -File "C:\Scripts\SCCMClientHealthCheck.ps1"
    [条件] タブ
  • 「コンピューターがアイドル状態になったときにのみタスクを開始する」のチェックを外す [設定] タブ
  • 「タスクが失敗した場合、再試行する」のオプションを「10分後に再試行」「最大3回まで」に設定
  1. タスクの保存とテスト実行
  • 「OK」をクリックし、タスクを保存
  • 作成したタスクを右クリックし、「実行する」を選択して動作を確認

タスクスケジューラの設定をPowerShellで自動化


手動でタスクスケジューラを設定する代わりに、以下のPowerShellスクリプトを実行すると、自動的にタスクを作成できます。

$TaskName = "SCCMClientHealthCheck"
$TaskPath = "C:\Scripts\SCCMClientHealthCheck.ps1"

$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File $TaskPath"
$Trigger = New-ScheduledTaskTrigger -Daily -At "3:00AM"
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest

Register-ScheduledTask -TaskName $TaskName -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings

このスクリプトを実行すると、タスクスケジューラに「SCCMClientHealthCheck」タスクが自動的に作成されます。

スケジュール実行後のログ確認


スクリプトの実行結果は、C:\Logs\SCCMClientHealth.log に記録されます。以下のコマンドを実行すると、ログの内容を確認できます。

Get-Content C:\Logs\SCCMClientHealth.log -Tail 20

メール通知との組み合わせ


タスクスケジューラで実行したスクリプトの結果を、管理者にメールで通知することも可能です。以下のようなメール送信スクリプトを C:\Scripts\SCCMClientCheck.ps1 に組み込めば、エラー発生時に通知が送信されます。

$SMTPServer = "smtp.example.com"
$From = "[email protected]"
$To = "[email protected]"
$Subject = "SCCMクライアント異常通知"
$ErrorLog = Get-Content C:\Logs\SCCMClientHealth.log | Select-String "エラー"

if ($ErrorLog) {
    Send-MailMessage -From $From -To $To -Subject $Subject -Body $ErrorLog -SmtpServer $SMTPServer
}

まとめ


本章では、PowerShellスクリプトをタスクスケジューラに登録し、定期的に実行する方法を解説しました。

  • 手動でタスクスケジューラに登録する方法
  • PowerShellを使ってタスクを自動登録する方法
  • 実行ログの記録と確認方法
  • エラー時にメールで通知する方法

この仕組みを導入することで、SCCMクライアントの異常を定期的に監視し、自動で修復・再インストールを行いながら管理者へ通知できます。次の章では、運用時に発生しやすいエラーとそのトラブルシューティングについて解説します。

よくあるエラーとトラブルシューティング


SCCMクライアントの正常性を監視し、自動修復・再インストールを実施する仕組みを導入しても、運用中にはさまざまな問題が発生する可能性があります。本章では、SCCMクライアント管理において発生しやすいエラーと、そのトラブルシューティング方法を詳しく解説します。

1. SCCMクライアントがSCCMサーバーと通信できない


エラーの兆候:

  • SCCM管理コンソールでクライアントの状態が「未登録」または「アクティブでない」と表示される
  • PowerShellスクリプトの Get-WmiObject でMP (Management Point) との接続エラーが発生

解決策:

  • クライアント側でMPの設定をリセットして再接続を試みる
Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "ResetPolicy"
Restart-Service CCMExec -Force
  • Windowsファイアウォールが必要なポート (TCP 80, 443, 8530, 8531) をブロックしていないか確認
Get-NetFirewallRule | Where-Object { $_.DisplayName -match "SCCM" }
  • DNS設定が正しく構成されているかを確認
Resolve-DnsName SCCM_Server_FQDN

2. SCCMクライアントのサービス (CCMExec) が停止する


エラーの兆候:

  • Get-Service CCMExec の実行結果が Stopped となる
  • C:\Windows\CCM\Logs\ClientIDManagerStartup.log に Failed to initialize エラーが記録される

解決策:

  • CCMExec サービスを再起動
Restart-Service CCMExec -Force
  • WMIのリポジトリを修復
winmgmt /salvagerepository
winmgmt /resetrepository
Restart-Service winmgmt -Force
  • SCCMクライアントを再インストール
Start-Process -FilePath "\\SCCM_Server\SMSClient\ccmsetup.exe" -ArgumentList "/mp:SCCM_Server /logon SMSSITECODE=ABC FSP=SCCM_Server" -NoNewWindow -Wait

3. インベントリデータが更新されない


エラーの兆候:

  • C:\Windows\CCM\Logs\InventoryAgent.log に Inventory data submission failed のエラーが記録される
  • SCCM管理コンソールでクライアントのハードウェア・ソフトウェア情報が古いまま

解決策:

  • 手動でインベントリ収集を強制実行
Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "TriggerSchedule" -ArgumentList "{00000000-0000-0000-0000-000000000113}"
  • SCCM管理ポイントのリセットを実施
Remove-WmiObject -Namespace "root\ccm" -Class "SMS_ActiveMPCache"
Restart-Service CCMExec

4. SCCMクライアントのインストールが失敗する


エラーの兆候:

  • C:\Windows\CCM\Logs\ccmsetup.log に Failed to download required files や CCMSetup failed with error code 0x80070002 の記録がある
  • Get-Service CCMExec の実行結果が Not Found

解決策:

  • クライアントの古いSCCMインストールを完全に削除してから再インストール
Start-Process -FilePath "C:\Windows\ccmsetup\ccmsetup.exe" -ArgumentList "/uninstall" -NoNewWindow -Wait
Remove-Item -Path "C:\Windows\CCM" -Recurse -Force
Remove-Item -Path "C:\Windows\ccmsetup" -Recurse -Force
Start-Process -FilePath "\\SCCM_Server\SMSClient\ccmsetup.exe" -ArgumentList "/mp:SCCM_Server /logon SMSSITECODE=ABC FSP=SCCM_Server" -NoNewWindow -Wait
  • クライアントに適切なアクセス権限があるか確認
icacls "C:\Windows\CCM" /T /C /grant SYSTEM:F

5. ソフトウェア配布やWindows Updateが適用されない


エラーの兆候:

  • C:\Windows\CCM\Logs\execmgr.log に Program failed with exit code が記録されている
  • Windows UpdateがSCCMの管理下にあるのに、適用が進まない

解決策:

  • SCCMのクライアントポリシーをリフレッシュ
Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "RequestMachinePolicy"
Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "EvaluateMachinePolicy"
  • Windows Updateのサービスをリセット
Stop-Service wuauserv -Force
Remove-Item -Path "C:\Windows\SoftwareDistribution" -Recurse -Force
Start-Service wuauserv

6. タスクスケジューラでスクリプトが実行されない


エラーの兆候:

  • タスクスケジューラの履歴に 0x1 や Access Denied のエラーが記録される
  • スクリプトの実行が失敗し、ログが生成されない

解決策:

  • 「最上位の特権で実行する」にチェックを入れる
  • PowerShellスクリプトの実行ポリシーを変更
Set-ExecutionPolicy Bypass -Scope LocalMachine -Force
  • タスクスケジューラで cmd.exe を経由してスクリプトを実行
cmd /c "powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\SCCMClientHealthCheck.ps1"

まとめ


本章では、SCCMクライアント運用時に発生しやすいエラーと、それぞれのトラブルシューティング方法について解説しました。

  • SCCMサーバーとの通信エラー → MPのリセット・ファイアウォール設定確認
  • SCCMクライアントサービスの停止 → CCMExecサービスの再起動・WMI修復
  • インベントリデータの更新失敗 → 手動でインベントリ収集を強制実行
  • クライアントのインストール失敗 → 古いクライアントを完全削除して再インストール
  • ソフトウェア配布やWindows Updateの適用失敗 → クライアントポリシーのリフレッシュ
  • タスクスケジューラの実行失敗 → 実行ポリシー変更・管理者権限の確認

これらのトラブルシューティング手法を活用することで、SCCMクライアントの管理をよりスムーズに行うことができます。次の章では、大規模環境でのSCCMクライアント管理の応用例について解説します。

応用例:大規模環境でのSCCMクライアント管理


SCCMクライアントの正常性チェックや修復は、数台の端末なら手動でも対応できますが、数百~数千台の端末を管理する大規模環境では、スクリプトを活用した自動化が不可欠です。本章では、大規模環境でのSCCMクライアント管理を最適化するための応用例について解説します。

1. PowerShellスクリプトを複数のサーバーで分散実行


クライアントのチェック・修復スクリプトを1台のSCCMサーバーで実行すると、負荷が集中して処理が遅くなる可能性があります。大規模環境では、スクリプトを複数の管理サーバーで分散実行することで負荷を分散できます。

解決策: SCCMの管理ポイント(MP)を複数用意し、各MPに対してクライアントを割り当て、スクリプトを分散実行する。

分散実行の例:

$MPs = @("MP01", "MP02", "MP03")  # SCCMの管理ポイント
$ClientsPerMP = 500  # 1つのMPが処理するクライアント数

foreach ($MP in $MPs) {
    Start-Job -ScriptBlock {
        param($MP)
        $Computers = Get-Content "C:\SCCM_Clients_$MP.txt"
        foreach ($Computer in $Computers) {
            # SCCMクライアントのチェック & 修復処理を実行
            Invoke-Command -ComputerName $Computer -ScriptBlock { ... }
        }
    } -ArgumentList $MP
}

この方法により、各管理ポイントごとに分担して処理を実行でき、負荷を軽減できます。


2. クライアントの異常をPower BIで可視化


多数の端末を監視する場合、異常発生状況を一覧で把握することが重要です。PowerShellのスクリプトをPower BIと連携させることで、SCCMクライアントの正常性データを可視化できます。

手順:

  1. スクリプトの実行結果をCSVファイルに保存
  2. Power BIでCSVデータを取り込み、ダッシュボードを作成

PowerShellスクリプト(CSV出力):

$LogFile = "C:\Logs\SCCMClientHealth.csv"
"ComputerName,Status,LastCheckTime" | Out-File -FilePath $LogFile -Encoding utf8 -Force

foreach ($Computer in $Computers) {
    $Status = "正常"
    if (-not (Test-Connection -ComputerName $Computer -Count 2 -Quiet)) {
        $Status = "接続不可"
    } elseif ((Get-Service -ComputerName $Computer -Name CCMExec).Status -ne "Running") {
        $Status = "サービス停止"
    }

    "$Computer,$Status,$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" | Out-File -Append -FilePath $LogFile
}

Power BIでこのCSVをインポートし、異常端末数の推移や、異常発生の頻度を可視化できます。


3. 異常検出時の自動チケット発行(ServiceNow/JIRA連携)


企業のIT運用では、クライアントに異常が発生した際、チケットシステムに自動登録して対応を記録することが求められる場合があります。PowerShellスクリプトとServiceNowやJIRAと連携することで、異常を自動的にチケット化することができます。

ServiceNow APIを使用したチケット発行(例):

$ServiceNowInstance = "https://example.service-now.com"
$Username = "admin"
$Password = "password"
$Headers = @{
    Authorization = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$Username`:$Password"))
    "Content-Type" = "application/json"
}

$Body = @{
    short_description = "SCCMクライアントの異常を検出"
    description = "PC01のSCCMクライアントが停止しています"
    urgency = "2"
    impact = "2"
} | ConvertTo-Json

Invoke-RestMethod -Uri "$ServiceNowInstance/api/now/table/incident" -Method Post -Headers $Headers -Body $Body

このスクリプトを異常検出スクリプトに組み込めば、SCCMクライアントの異常発生時に自動でチケットが作成され、運用チームが迅速に対応できるようになります。


4. 自己修復機能の強化(修復成功率の向上)


SCCMクライアントの自己修復スクリプトを運用する際、「1回の修復で解決しない」ケースがあることを考慮し、段階的な修復アプローチを取り入れることで、修復成功率を向上させることができます。

段階的修復の例:

  1. 軽微なエラー修正(CCMExecの再起動、ポリシーリフレッシュ)
  2. SCCMクライアントの完全リセット(WMI修復、クライアントのリセット)
  3. SCCMクライアントの完全再インストール

PowerShellスクリプト:

# 1. 軽微なエラー修正
Restart-Service CCMExec -Force
Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "ResetPolicy"

# 2. WMIの修復
if (-not (Get-WmiObject -Namespace "root\ccm" -Class "SMS_Client")) {
    winmgmt /salvagerepository
    winmgmt /resetrepository
    Restart-Service winmgmt -Force
}

# 3. SCCMクライアントの完全再インストール
if (-not (Get-Service CCMExec -ErrorAction SilentlyContinue)) {
    Start-Process -FilePath "C:\Windows\ccmsetup\ccmsetup.exe" -ArgumentList "/uninstall" -NoNewWindow -Wait
    Start-Process -FilePath "\\SCCM_Server\SMSClient\ccmsetup.exe" -ArgumentList "/mp:SCCM_Server /logon SMSSITECODE=ABC FSP=SCCM_Server" -NoNewWindow -Wait
}

このように段階的な修復を試みることで、より多くのクライアントを自動修復し、再インストールの頻度を最小限に抑えることができます。


まとめ


本章では、大規模環境におけるSCCMクライアント管理の応用例について解説しました。

  • 複数の管理サーバーでスクリプトを分散実行し、負荷を軽減
  • Power BIと連携して異常端末の可視化を実現
  • ServiceNowやJIRAと連携し、異常発生時に自動でチケットを発行
  • 段階的な修復アプローチを導入し、自己修復の成功率を向上

これらの手法を組み合わせることで、より効率的なSCCMクライアント管理が可能になります。次の章では、本記事の総まとめを行います。

まとめ


本記事では、PowerShellを活用したSCCMクライアントの正常性チェックと自動修復の手法について詳しく解説しました。SCCMのクライアント管理を効率化するためのポイントを整理すると、以下のようになります。

  1. SCCMクライアントの正常性とは
  • クライアントがSCCMサーバーと適切に通信し、ポリシー適用やソフトウェア配布を正常に実行できる状態が求められる。
  1. PowerShellを活用したクライアントチェック
  • CCMExec サービスの状態、MPとの通信、インベントリデータの更新状況をスクリプトで監視する。
  1. 異常検出時の自動修復
  • 軽微な異常(サービス停止やWMI破損)はスクリプトで即時修復し、致命的な問題はSCCMクライアントの再インストールを実行。
  1. ログの記録と通知
  • PowerShellスクリプトの実行結果をログに保存し、異常が発生した場合はメール通知やイベントログの記録を行うことで迅速な対応を可能にする。
  1. 定期実行の自動化
  • タスクスケジューラを活用して、クライアントチェック・修復スクリプトを毎日自動実行。
  1. 大規模環境での応用
  • 複数の管理ポイントでスクリプトを分散実行し、負荷を分散。
  • Power BIと連携して異常端末の可視化を実施。
  • ServiceNowやJIRAと連携し、異常検出時に自動でチケットを発行。
  • 段階的な自己修復アプローチを導入し、修復成功率を向上。

SCCMクライアントの正常性を維持し、異常を自動的に修復する仕組みを導入することで、IT運用の効率化とシステムの安定性向上が実現できます。PowerShellを活用した自動化を推進し、SCCM環境の最適化を図りましょう。

この記事を書いた人

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

コメント

コメントする

目次