社内PCの SMART 情報とイベントログを毎日集め、ディスク故障の予兆を予測して交換の優先順位をつける
社内のPCからディスクの信頼性の値とディスク関連のイベントを毎日集め、故障しそうなディスクを、故障する前に見込みの高い順に並べます。情報システムの担当者は、その一覧の上から交換を決めます。
- 連携・自動化
- Python
- 対象業界
- IT・SaaS/士業/製造/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 判断に時間がかかる/属人化している/期限・対応漏れが起きる
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- 個別開発(大)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 利用者から「遅い」「固まる」「起動に時間がかかる」という問い合わせが来る
- 担当者が遠隔でPCにつなぎ、ディスクの信頼性の値を見る
- イベントビューアーで、システムのログのディスク関連のイベントを探す
- 値とイベントから、ディスクの交換が要るかを判断する
- 交換が要れば、利用者にデータの退避を頼み、交換の日を調整する
- 判断と対応をチケットに書く
- 自動Intune の Remediations で、各PCが毎日、ディスクの信頼性の値とディスク関連のイベントの数を集め、短い1行にして返す
- 自動毎朝、Python が Microsoft Graph から各PCの結果を取り、PCごと・日ごとに貯める
- 自動7日・30日の増え方を計算する
- 自動確実な兆し(ファイルシステムの破損、予期しない取り外しなど)が出ていれば `replace_now` を付ける
- 自動それ以外は、過去の故障から学んだモデルで、30日以内に故障で交換が要る見込みを出す
- 自動見込みと、端末の台帳の業務への影響の区分を合わせ、交換の優先順位の一覧を作る
- 人担当者が、一覧の上位と `replace_now` を確かめ、交換するかを決める
- 人交換するPCの利用者に、データの退避と交換の日を連絡する
- 自動問い合わせが来たPCは、チケットにそのPCの値の推移と見込みを添える
- 自動交換の結果(故障だったか、交換後に外したディスクが壊れていたか)をチケットから取り、学ばせる記録に足す
各工程の詳しい説明を読む
- 利用者から「遅い」「固まる」「起動に時間がかかる」という問い合わせが来る
- 担当者が遠隔でPCにつなぎ、ディスクの信頼性の値を見る
- イベントビューアーで、システムのログのディスク関連のイベントを探す
- 値とイベントから、ディスクの交換が要るかを判断する
- 交換が要れば、利用者にデータの退避を頼み、交換の日を調整する
- 判断と対応をチケットに書く
(a)壊れてから分かる。 問い合わせが来るのは、利用者が困ってからです。問い合わせの無いまま、ある朝起動しなくなるPCもあります。 そのときは、手元にしか無かったデータの取り出しから始まります。
(b)どの値を危ないと見るかが担当者で違う。 経験の長い担当者は、訂正できなかった誤りの数が増えていれば交換を急ぎますが、入ったばかりの担当者は、問い合わせの症状が落ち着けば様子見にします。 同じ値でも、誰が調べるかで判断が変わります。
(c)1回の点検では増え方が分からない。 遠隔でつないで見られるのは、その時点の値だけです。先週から増えたのか、何年も同じ値なのかは分かりません。 過去の値が残っていないので、増え方で判断できません。
(d)調べた結果が次に活きていない。 交換したPCの、交換の前の値はチケットに書かれていることもあれば、書かれていないこともあります。どの値の動きが故障の前に出ていたかを、まとめて見る人がいません。
- 【自動】 Intune の Remediations で、各PCが毎日、ディスクの信頼性の値とディスク関連のイベントの数を集め、短い1行にして返す
- 【自動】 毎朝、Python が Microsoft Graph から各PCの結果を取り、PCごと・日ごとに貯める
- 【自動】 7日・30日の増え方を計算する
- 【自動】 確実な兆し(ファイルシステムの破損、予期しない取り外しなど)が出ていれば
replace_nowを付ける - 【自動】 それ以外は、過去の故障から学んだモデルで、30日以内に故障で交換が要る見込みを出す
- 【自動】 見込みと、端末の台帳の業務への影響の区分を合わせ、交換の優先順位の一覧を作る
- 【人】 担当者が、一覧の上位と
replace_nowを確かめ、交換するかを決める - 【人】 交換するPCの利用者に、データの退避と交換の日を連絡する
- 【自動】 問い合わせが来たPCは、チケットにそのPCの値の推移と見込みを添える
- 【自動】 交換の結果(故障だったか、交換後に外したディスクが壊れていたか)をチケットから取り、学ばせる記録に足す
7番目が、この設計の分かれ目です。人が見るのは3,000台ではありません。 上位と replace_now だけを見て、遠隔でつなぐのは、値だけでは判断がつかないPCに限ります。 全台を人が見る設計にすると、60.0時間はほとんど減りません。
9番目で、問い合わせへの対応も変わります。 「遅い」という問い合わせが来たとき、遠隔でつなぐ前に、そのPCの30日分の値の推移が手元にあります。 つながなくても判断できる問い合わせが増えます。
02今回想定するシステム構成
社内PC(約3,000台、Windows) │ Remediations の検出スクリプト(毎日) │ Get-StorageReliabilityCounter / Get-WinEvent(System ログの 55・98・129・153・157 など) ▼ 1行の結果(2,048文字以内) Microsoft Intune ▼【トリガー】毎朝 7:00 Python ├──▶ Microsoft Graph(beta)deviceRunStates で各PCの結果を取る ├──▶ PCごと・日ごとに貯め、7日・30日の増え方を計算 ▼ 規則 ── 確実な兆しは replace_now ▼ scikit-learn HistGradientBoostingClassifier(class_weight="balanced") │ 30日以内に故障で交換が要る見込み ▼ 優先順位 ── 見込み × 業務への影響の区分 ▼ 【担当者が上位と replace_now を確かめ、交換を決める】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas・scikit-learn) | R |
| 処理エンジン | scikit-learn の HistGradientBoostingClassifier | LightGBM |
| 連携 | Microsoft Intune の Remediations と Microsoft Graph | Configuration Manager のスクリプト |
| 集計 | Python(日ごとの値の蓄積と、増え方の計算) | 端末管理の仕組みのレポート |
| データの取得元 | 端末の台帳と、問い合わせ・修理のチケット | 資産管理の仕組み |
| 結果の出力先 | 交換の優先順位の一覧と、チケットへの添付 | 社内チャットへの通知 |
PCには、値を読む以外のことをさせません。 検出スクリプトは値を集めて1行を返すだけで、ディスクの修復も再起動もしません。 修復のスクリプトは置かず、検出の結果だけを使います。
値は、Windows の Get-StorageReliabilityCounter で読みます。 ディスクの信頼性の値を返すコマンドで、温度、誤り、摩耗、使われてきた時間などを含みます。返る値には、ReadErrorsTotal・ReadErrorsUncorrected・WriteErrorsUncorrected・Wear・Temperature・TemperatureMax・PowerOnHours・ManufactureDate などがあります。値の入らない項目があるディスクもあり、 公式の例でも Wear は空です。
イベントは、Get-WinEvent の -FilterHashtable で絞って数えます。 LogName・ID・StartTime を指定して、システムのログからディスク関連のイベントだけを取ります。数えるイベントは、Microsoft の手引きがデータ破損とディスクの誤りを示すとして挙げているものです。 55(ファイルシステムの構造の破損)、98(ボリュームのオフラインでの検査が必要)、129(デバイスへのリセット)、153(論理ブロックアドレスへの入出力の再試行)、157(ディスクの予期しない取り外し)です。
集める仕組みは、Intune の Remediations です。 検出のスクリプトと修復のスクリプトの組を端末に配り、結果を集める機能で、毎日の決まった時刻に動かす設定ができます。 使うには、端末が Microsoft Entra 参加か Entra ハイブリッド参加で、利用者に Windows Enterprise E3/E5 などのライセンスが要ります。
生成AIは使いません。 見込みは確率の数字、優先順位は決まった計算で出します。交換するかを文章で考えさせると、根拠の無い判断が混ざります。
03どうやって実装するのか
処理の起点を決める
端末の側は、Remediations の割り当ての「毎日」で、毎日決まった時刻に動かします。 予定の時刻にPCが動いていなかったときは、オンラインになった後、できるだけ早く動きます。 ノート型でも、1日のどこかで値が集まります。
ただし、結果が毎日 Intune に届くとは限りません。 繰り返し動くスクリプトの結果は、最初の6日のあいだは変化があったときだけ報告され、7日ごとには変化が無くても報告されます。 そのため、検出スクリプトが返す1行は、変化が意味を持つ値だけに絞ります。 毎回変わる時刻や温度をそのまま入れると、毎回が「変化」になり、Microsoft もそうした値を避けるよう勧めています。
サーバー側の Python は、毎朝7時に動かします。 前日の結果を取り、届いていないPCは「前回の値のまま」として扱います。届かない日が続いたPCは、別に数えます。 休職者のPCや、倉庫に置かれた予備機が多く含まれるので、端末の台帳と照らして、使われているPCだけを見込みの対象に残します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 信頼性の値 | 読み取り・書き込みの訂正できなかった誤り、読み取りの誤りの合計、摩耗、最高温度、使われてきた時間、製造の年と週 | Get-StorageReliabilityCounter(PCごと・ディスクごと) |
| イベントの数 | 55・98・129・153・157 の、集め始めてからの累計 | Get-WinEvent(System ログ) |
| ディスクの種類 | SSDかHDDか、型番 | Get-PhysicalDisk |
| 端末の台帳 | PCの名前、購入日、機種、利用者の部署、業務への影響の区分 | 端末の台帳 |
| 修理・交換の記録 | 交換した日、交換の理由、外したディスクの検査の結果 | チケットの仕組み |
質を決めるのは、いちばん下の修理・交換の記録です。 モデルが学ぶ「故障」は、この記録から作ります。交換の理由が「遅いので念のため」と「ディスクの故障を確認」で分かれていないと、 故障していないディスクを故障として学ばせることになります。
イベントは、日ごとの数ではなく累計で返します。 日ごとの数は毎日変わり、報告の仕組みと合いません。PCの中に前回までの累計を小さなファイルで持ち、新しく出た分を足して返します。 1日ごとの増え方は、サーバー側で前の日の累計との差から計算します。
データの取得方法を決める
検出スクリプトは、値を集めて1行のJSONを書き出し、exit 0 で終わります。 修復のスクリプトは、検出のスクリプトが exit 1 を返したときだけ動くので、exit 0 なら何も直しに行きません。 書き出した1行は、検出のスクリプトの出力として Intune に残ります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 各PCの検出の出力 | Graph の deviceHealthScripts/{id}/deviceRunStates の preRemediationDetectionScriptOutput | 信頼性の値とイベントの累計 |
| 実行の日時と状態 | 同じく lastStateUpdateDateTime・detectionState | 届いていないPC、スクリプトの誤りの把握 |
| 対象のPC | 同じく managedDevice の関係 | 端末の台帳と結びつける |
| 交換の記録 | チケットの仕組みの書き出し | 学ばせる答え |
Graph のこの資源は beta の版です。 Microsoft は Intune の beta の API を支えていますが、変更がより頻繁で、v1.0 を使えるならそちらを勧めるとしています。変わったときに気づけるよう、取れた件数が前日から大きく減ったら止まるようにします。Intune の管理センターからも、結果を .csv に書き出せるので、API が使えない日はそれで代えます。
AIへ渡す前に整形する
- 出力を読む … 1行のJSONを読み、読めないもの・2,048文字で切れたものを分けます
- PCとディスクを結ぶ … PCの名前と、ディスクの型番・番号の組で、日ごとの行にします。ディスクだけを交換したPCは、交換の日で別のディスクとして扱います
- 届かなかった日を埋める … 報告の無い日は前回の値をそのまま使い、「埋めた」印を付けます
- 増え方を作る … 訂正できなかった誤り、読み取りの誤りの合計、各イベントの累計について、7日と30日の差を作ります
- 年数を作る … 製造の年と週から、ディスクの経過の週数を作ります
- 答えを作る … 交換の記録で「ディスクの故障を確認」となったものについて、交換の日の前30日のあいだの各日を1、それ以外を0にします
- 学ばせる期間と確かめる期間を分ける … 日付で分け、後の期間で確かめます
4番目が、この構成の中心です。 値の大きさだけを特徴にすると、昔一度だけ誤りが出て、その後は落ち着いているディスクが上位に並びます。増え方を並べると、いま動いているディスクが上に来ます。
3番目の埋めた値は、増え方の計算では0として扱います。 届かなかった日に値が増えていたかは分からないので、次に届いた日に、空いた日数分の増加がまとめて出ます。 ノート型を長く持ち出していたPCは、戻った日に急に増えたように見えるので、埋めた日数を特徴の列に足して区別します。
6番目で、交換の理由を確かめないまま答えにしないでください。 「念のため交換」を故障として学ばせると、問い合わせが多い部署のPCほど故障しやすい、という偏りを学びます。
AIに処理させる
させるのは、規則で replace_now にならなかったディスクについて、30日以内に故障で交換が要る見込みを出すことだけです。
| 見るもの | 使うもの | 判断できないときの扱い |
|---|---|---|
| 確実な兆し | 55・98・157 の新しい発生、訂正できなかった誤りの7日での増加 | 規則で replace_now。モデルを通さない |
| 故障の見込み | 増え方、値の大きさ、経過の週数、種類、機種、129・153 の増え方 | 学ばせた機種に無いものは low_history |
| 値の欠け | Wear や PowerOnHours が空 | 空のまま渡す。埋めない |
右下の「埋めない」には理由があります。 HistGradientBoostingClassifier は、欠けた値を、分かれ目ごとに左右どちらへ送るとよいかを学びます。 欠けていること自体が「値を返さない型のディスク」という情報なので、0や平均で埋めると、それが消えます。
129と153を確実な兆しに入れないのも、意図してのことです。 Microsoft の手引きでは、153はストレージの仕組みが過負荷で、要求が時間切れになったことを示し、129も同じく過負荷を示します。ディスクの故障だけでなく、負荷やドライバーでも出ます。 そのため、出たら交換ではなく、増え方をモデルの材料にします。
| させないこと | 理由 |
|---|---|
| 交換するかの決定 | 在庫・予算・利用者の予定を見て人が決める |
ディスクの修復・chkdsk の実行 | 利用者の作業中に動くと、データを壊すおそれがある |
| データの退避の自動実行 | 退避の範囲は利用者と決める |
| 利用者への直接の通知 | 情報システムから人が連絡する |
| 学ばせた機種の外の見込み | low_history にして人へ |
2行目を最初に決めておいてください。 兆しが出たPCに検査と修復を自動でかけると、壊れかけたディスクに負荷をかけ、取り出せたはずのデータが取り出せなくなることがあります。
指示内容を固定する
この構成は生成AIを使わないので、プロンプトの代わりに、検出スクリプトの出力の決まりと、モデルと規則の設定を書いておきます。
【検出スクリプトの出力(1行のJSON、2,048文字以内)】
- v: 出力の形の版
- disks: ディスクごとに
id, media(SSD|HDD), model, rd_unc, wr_unc, rd_total, wear, temp_max,
poh_bucket(使われてきた時間を500時間ごとに丸めた値), mfg(製造の年と週)
- ev: { "55": 累計, "98": 累計, "129": 累計, "153": 累計, "157": 累計 }
- 入れない値:今の温度、時刻、利用者の名前、ファイルの名前
- 管理者の権限で動かす(利用者の資格情報で動かさない)
- 必ず exit 0 で終わる(修復のスクリプトを動かさない)
【規則(replace_now)】
- ev の 55・98・157 が前日より増えた
- rd_unc または wr_unc が 7日で 1 以上増えた
【モデル】
- HistGradientBoostingClassifier(class_weight="balanced")
- 答え = 交換の理由が「ディスクの故障を確認」の交換の、前30日に入る日なら 1
- categorical_features = ["media", "model"]
- 欠けた値は埋めずに渡す
【優先順位】
- 順位の点 = predict_proba の 1 の確率 × 業務への影響の区分の重み(高 3 / 中 2 / 低 1)
- 一覧に出すのは replace_now と、点の上位 30 台
「今の温度と時刻を入れない」を明記しないと、毎日すべてのPCが報告を返します。 報告の仕組みは変化を前提にしているので、毎回変わる値は、意味のある変化を埋もれさせます。 温度は、最高温度だけを入れます。
class_weight="balanced" を付けるのは、故障の日が全体のごく一部だからです。 付けないと、すべてを0と答えるモデルが見かけ上よく当たります。この指定で、少ない側の重みが、件数に反比例して重くなります。
出力形式を固定する
ディスクごとに、次の形のJSONを作り、一覧とチケットへの添付にします。
{
"device_name": "",
"disk_id": "",
"media": "SSD | HDD",
"verdict": "replace_now | ranked | low_history | stale",
"fail_prob_30d": 0.0,
"priority_score": 0.0,
"impact_class": "high | mid | low",
"signals": [ { "name": "", "value_now": 0, "delta_7d": 0, "delta_30d": 0 } ],
"last_report": "",
"model_version": ""
}
1つ目の理由は、verdict で規則とモデルを分けて見せられることです。 replace_now は規則が出したもので確率は付かず、ranked はモデルの見込みです。担当者は、どちらの理由で一覧に出たかを最初に分かります。
2つ目は、signals で増え方を並べられることです。 確率だけでは、遠隔でつなぐべきか判断がつきません。どの値が7日・30日でどれだけ増えたかが並べば、つながずに判断できるPCが増えます。
3つ目は、stale で届いていないPCを分けられることです。 報告が14日以上届いていないPCは、見込みを出さずに stale にします。見込みが低いのではなく、値が古いだけです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Microsoft Intune | Remediations の検出のスクリプト(毎日) | PCごとの値の収集 |
| Microsoft Graph(beta) | API呼び出し(読み取り) | 検出の出力と実行の状態 |
| 端末の台帳 | 表の読み取り | 業務への影響の区分、購入日 |
| チケットの仕組み | 読み取りと、添付の書き込み | 交換の記録の取得、問い合わせへの値の推移の添付 |
| 交換の優先順位の一覧 | 表の書き出し | replace_now と上位30台 |
チケットへの添付は、問い合わせが登録されたときだけ行います。 問い合わせのPCの名前で日ごとの値を引き、30日分の推移の表と、そのときの verdict を添えます。問い合わせの無いPCのチケットを、この処理から作ることはしません。 交換の候補は一覧で人が見て、チケットは人が起こします。
Graph へは読み取りの権限だけで足ります。 スクリプトの割り当てや端末の操作の権限は、この処理に持たせません。値を読む処理と、端末を操作する処理を同じ資格で動かさないようにします。
人が確認する
人が見るのは、replace_now と上位30台だけです。 3,000台の全部を見る設計にすると、第10章の16.0時間には収まりません。
replace_nowを先に見る … 確実な兆しの出たPCです。利用者に、その日のうちにデータの退避を頼みます- 上位30台の
signalsを読む … 増え方が続いているか、一度だけの増加かを見ます - 判断がつかないPCだけ遠隔でつなぐ … 値の推移だけで決められないものです
staleの台数を見る … 届かないPCが増えていれば、スクリプトの誤りか、使われていないPCです- 交換したら理由を正しく書く … 「ディスクの故障を確認」「念のため」を分けます。これが次の学ばせる答えになります
5番目を省かないでください。 外したディスクを検査して、本当に壊れていたかをチケットに書くと、見込みが当たっていたかを測れます。 書かないと、モデルは正しくなっていきません。
一覧は毎朝出ますが、見るのは週に2回で足ります。 replace_now だけは出た日に担当者へ知らせ、その日のうちに見ます。
目標は、120件をならして1件8分です。 遠隔でつなぐのは一部という想定で、それより多い月は、signals の並べ方が判断に足りていません。
例外に対処する
| 起きること | 対応 |
|---|---|
| 出力が2,048文字で切れた | ディスクの多いPC。項目を減らすか、ディスクごとに分けて返す |
Get-StorageReliabilityCounter が値を返さない | 欠けとして扱い、low_history |
| 検出のスクリプトが誤りで終わる | detectionState を見て数え、多ければスクリプトを直す |
| 報告が14日以上届かない | stale。端末の台帳で、使われているPCかを確かめる |
| Graph の取得件数が前日から大きく減った | beta の API の変更を疑い、一覧を出さずに止める。管理センターの書き出しで代える |
| ディスクだけを交換したPC | 交換の日から別のディスクとして扱い、累計を引き継がない |
| 外付けのディスクの値が混ざる | 種類と番号で、内蔵のディスクだけを残す |
| 機種が新しく、学ばせた記録が無い | low_history。規則だけで見る |
上から2行目が、最初の数か月でいちばん起きます。 機種やドライバーによって、返す値の項目が違います。機種ごとに、どの値が入っているかを最初に一覧にしてください。 値の入らない機種は、イベントの累計と規則だけで見ることになります。
記録を残す
- PCごと・ディスクごと・日ごとの値(届いた値と、埋めた値の印)
- 実行ごとの取得件数と、
detectionStateごとの台数 - モデルの版(学ばせた期間、特徴の列、確かめる期間での成績)
- 毎日の出力のJSON(
verdict、fail_prob_30d、priority_score) - 担当者の判断(交換した・様子見・遠隔で確かめた)と、その理由
- 交換したディスクの検査の結果
成績は、上位30台のうち、30日以内に本当に故障したのが何台かで測ります。故障が全体のごく一部なので、全体の正解率では何も分かりません。一覧の上から見ていく使い方に合わせて、上位の当たり方を見ます。
04実装レベルの3段階
半自動化で、遠隔でつなぐ回数が減ります。 問い合わせの来たPCの値の推移が手元にあり、規則で拾える故障は問い合わせの前に分かります。 本格構成で、1件30分が8分になります。 本記事の想定はこの段階です。規則の閾値の下にある、まだ壊れていないディスクの順位が出るので、 交換の判断が「来たものから」から「危ない順に」変わります。 段階を飛ばさないでください。 モデルは、毎日の値と交換の記録が半年以上たまってから作ります。その前に作ると、学ばせる故障の数が少なすぎて、偶然を学びます。
05工数削減シミュレーション
導入後 120件 × 8分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 数千台のWindows PCを Microsoft Intune で管理し、Remediations を使えるライセンスを持つ情報システム部門。ディスクの故障が「PCが遅い」「起動しない」という問い合わせで初めて分かり、そのたびに担当者が遠隔で状態を調べて交換を決めている場合。修理・交換の記録がチケットの仕組みに残っており、過去の故障と結びつけられる場合。
- PCが数十台で、故障したら交換すれば足りる場合。PCを Intune で管理しておらず、端末から定期的に値を集める手段が無い場合。PCのデータをすべてクラウドに置いており、ディスクの故障が業務の中断にほとんどつながらない場合。なお、交換の発注、データの移行、保証の請求の判断は、この構成では代替できません。
07最小構成で試す方法
- 過去1年の修理のチケットから、「ディスクの故障」で交換したPCを20台選ぶ
- まだ使われているPCの中から、問い合わせが多い20台と少ない20台を選ぶ
- 60台で、管理者の PowerShell から
Get-PhysicalDisk | Get-StorageReliabilityCounterを実行し、値を表に写す - 同じ60台で、システムのログの55・98・129・153・157の数を
Get-WinEventで数える - 2週間後にもう一度同じことをして、値の増え方を並べる
最初に確かめるのは、機種ごとにどの値が入っているかです。 訂正できなかった誤りも摩耗も空の機種が多ければ、イベントの数が主な材料になります。
| 出てきた内容 | 判断 |
|---|---|
| 問い合わせの多いPCで、誤りやイベントが増えていた | Remediations での毎日の収集に進む |
| ほとんどの機種で値が空だった | イベントの数で組む。機種の入れ替えのときに値を返す機種を選ぶ |
| 交換の記録で、理由が書き分けられていない | 記録の書き方を先に直す。 学ばせる答えが作れない |
3行目が出ても、構成は有効です。 交換の理由を書き分けるところから始め、半年たまってからモデルに進みます。その間は規則だけで replace_now を出します。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 毎回変わる値を返して、全PCが毎日報告する | 今の温度・時刻を入れない。 累計と丸めた値にする |
| 出力が2,048文字で切れる | 項目を絞り、短い名前にする |
| 値の大きさだけで、昔の誤りのPCが並ぶ | 7日・30日の増え方を特徴にする |
| 153や129が出ただけで交換にする | 過負荷でも出る。増え方をモデルの材料にする |
| 欠けた値を0で埋める | 埋めずに渡す。欠けていること自体が情報 |
| 「念のため交換」を故障として学ばせる | 交換の理由を書き分け、検査の結果を残す |
| すべて0と答えるモデルが当たって見える | class_weight="balanced" と、上位の当たり方で測る |
| Graph の beta の API が変わる | 取得件数を見て止め、管理センターの書き出しで代える |
| 兆しが出たPCに修復を自動でかける | 修復は自動でしない。 データの退避が先 |
| ディスクだけ交換したPCの累計が続く | 交換の日で別のディスクとして扱う |
上の2行が、この構成の失敗のほとんどです。 どちらも、Remediations の報告の決まりを前提に出力を設計していないと起きます。変化の意味がある値だけを短く返すことが、収集の仕組み全体の土台です。
下の2行のうち、自動の修復は最初から作らないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: PCの名前、ディスクの型番と信頼性の値、ディスク関連のイベントの数、端末の台帳の利用者の部署です。ファイルの中身や名前、利用者の操作は集めません。
- 個人の情報を集めない … Microsoft は、Remediations のスクリプトで個人の情報を集めないよう求めています。出力に利用者の名前やファイルの名前を入れません。 PCと利用者の結びつきは、社内の端末の台帳で行います
- 値を読む権限と、端末を操作する権限を分ける … Graph へは読み取りの権限だけで接続します
- 修復と再起動を自動でしない … Microsoft も、検出と修復のスクリプトに再起動の命令を入れないよう求めています。交換と退避の判断は人が行います
- 見込みを利用者の評価に使わない … ディスクが早く壊れるのは、使い方より機種と個体の差によることが多いものです
- スクリプトの変更を管理する … 検出スクリプトは全PCで管理者の権限で動きます。変更は2人で確かめてから配ります
誤りが起きた場合のリスクは、壊れかけたディスクを見逃すことと、壊れていないディスクを交換することの2つです。 前者は増え方を見ないと起き、後者は過負荷のイベントを故障と取り違えると起きます。どちらも、規則とモデルを分け、人が上位を確かめることで守ります。
10まず何から始めるか
1週目:交換の理由を書き分ける
チケットの仕組みの交換の理由に、「ディスクの故障を確認」「念のため」「その他」を分けて選べるようにします。外したディスクの検査の結果を書く欄も足します。
2週目:60台で値を読む
故障で交換したPCの記録と、まだ使われているPC40台で、信頼性の値とイベントの数を読み、機種ごとにどの値が入っているかを一覧にします。
3週目:検出スクリプトを作る
値を集めて1行のJSONを返し、exit 0 で終わるスクリプトを作ります。情報システム部のPC20台に「毎日」で割り当て、出力が2,048文字に収まるか、報告がどう届くかを確かめます。
4週目:Python で貯める
Graph から出力を取り、PCごと・日ごとに貯めて、7日・30日の増え方を出します。規則で replace_now を出し、担当者が確かめます。
2か月目: 全PCに割り当て、問い合わせの来たPCのチケットに値の推移を添えます。3か月目以降: 交換の記録が半年分たまったらモデルを学ばせ、上位30台の当たり方を測ります。一覧の上から交換を決め、1件30分が何分になったかを実測できた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Get-StorageReliabilityCounter が温度・誤り・摩耗・使われてきた時間などの信頼性の値を返すこと。例に ReadErrorsUncorrected・WriteErrorsUncorrected・Wear・TemperatureMax・PowerOnHours・ManufactureDate があり、Wear が空の例であること | Microsoft Learn: Get-StorageReliabilityCounter | 2026-10-08 |
Get-WinEvent が Windows でのみ使え、-FilterHashtable で LogName・ID・StartTime などを指定できること。管理者でないとログを読めないことがあること | Microsoft Learn: Get-WinEvent | 2026-10-08 |
| イベント55・98・129・153・157がデータ破損やディスクの誤りを示すこと。153と129がストレージの過負荷による時間切れを示すこと。157が非リムーバブルのディスクの予期しない取り外しで、ディスクの故障でも起きること | Microsoft Learn: Troubleshoot data corruption and disk errors | 2026-10-08 |
Remediations の前提(Entra 参加・ハイブリッド参加、Windows Enterprise E3/E5 などのライセンス)。修復のスクリプトは検出が exit 1 のときだけ動くこと。出力の上限が2,048文字であること。毎日などの予定、オンライン後の実行、変化の無い報告が7日ごとであること。毎回変わる値を避けること。再起動の命令と個人の情報の収集を入れないこと。.csv への書き出し | Microsoft Learn: Remediations | 2026-10-08 |
deviceHealthScriptDeviceState に preRemediationDetectionScriptOutput・detectionState・lastStateUpdateDateTime と managedDevice の関係があること。beta の版で、変更がより頻繁なこと | Microsoft Graph: deviceHealthScriptDeviceState | 2026-10-08 |
HistGradientBoostingClassifier の class_weight="balanced" が件数に反比例した重みを付けること。predict_proba。欠けた値を分かれ目ごとに左右へ送ることを学ぶこと。categorical_features(scikit-learn 1.9.1) | scikit-learn: HistGradientBoostingClassifier | 2026-10-08 |
ディスクの交換、データの退避、保証の請求は、情報システム部と利用者の判断で決めてください。 本記事は製品の公開ドキュメントで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1096)についてのご相談はこちらから。
