目次
結構辛い、インベントリ作業
2026年度が始まり1週間弱が経ちました。情シスにとって年度初めは年度末と同じく何かと忙しい時期です。
そんな年度初めによく依頼される業務として、「社内のPC一覧を出してほしい」という依頼、(要はインベントリ作業)が挙げられます。
IT資産管理ツールや、IntuneのようなMDMを導入していれば、管理コンソールから一覧を出力できるのですが、SOHOや中小企業では導入していないケースが多く、Excelやスプレッドシートの台帳を主導で管理している、というケースが多いのではないでしょうか。
台帳の手動更新は特別なツールの導入は不要なものの、人力で行うためどれだけ注意深く実施したとしても、記載漏れや入出庫の頻度に追い付かず実態と乖離してしまうリスクを抱えています。
IT資産管理ツールやMDMが無くてもインベントリ作業を半自動化できる運用体制を敷いてみよう
そんなSOHOや中小企業あるあるな課題を解決する一つの解決策として、PowerShellスクリプトを使った半自動化が挙げられます。
IT資産管理ツールやMDMと違って、越えねばならぬハードルがいくつかあるため事前の準備は少し大変ですが、一度運用体制を敷けば来年度以降の年度初めのインベントリ作業や、監査対応が格段とらくになります。
そんなインベントリ作業の半自動化を実現するための第一歩として、今回はPCのインベントリ情報を取得するスクリプトを紹介します。
インベントリ情報として必要な項目
インベントリ情報として必要な項目について、僕の経験上下記の情報があれば資産管理台帳としての役割を十分に果たせると考えます。
| 項目 | 用途 | 最低限必要か |
|---|---|---|
| コンピューター名 | PC識別 | 〇 |
| シリアル番号 | 資産管理、メーカーサポート問い合わせ | 〇 |
| メーカー名 | 調達管理 | |
| モデル名 | 調達管理、スペック管理 | 〇 |
| OS名 | OS管理 | 〇 |
| OSバージョン(ビルド番号) | Windows Update適用状況の管理 | |
| CPU名 | スペック管理 | |
| 搭載メモリ数(GB) | スペック管理 | |
| ディスク容量(GB) | ストレージ管理 | |
| ディスク空き容量(GB) | ストレージ管理 | |
| 最終起動日時 | 資産稼働状況の確認 | 〇 |
| ログインユーザー名 | 利用者追跡 | 〇 |
資産管理台帳として最低限必要な項目については、上記表の「最低限必要か」に「〇」を付けています。
その他はあると便利だけども必須ではなく、企業のポリシーや調達状況によって取捨選択すると良い項目です。
例えば、メーカー名は調達先メーカーの数が限られており、モデル名から逆引きする手間が無い/少ない場合はスクリプトで収集しなくても良いでしょう。
OSバージョン(ビルド番号)については、厳格なパッチ管理ポリシーが無く基本的に最新のWindows Updateを適用させる運用を取っていれば不要です。
逆に機能更新の適用状況を管理し、サポート期限切れ対応者への周知や対応を分けて実施したい場合は収集すべき項目です。
CPU名や搭載メモリ数、ディスク容量、空き容量については各モデル毎複数のSKUの端末を調達していないのであれば不要です。
インベントリスクリプト
「インベントリ情報として必要な項目」で挙げた項目を取得するスクリプト例を以下に紹介します。
なおスクリプトの仕様は以下の通りです。
- インベントリデータ出力先:ログインユーザーのデスクトップ
- PowerShellスクリプトの実行:PCのローカル管理者権限で実行
スクリプト内容
# 情報取得
$computerSystem = Get-CimInstance -ClassName Win32_ComputerSystem
$bios = Get-CimInstance -ClassName Win32_BIOS
$os = Get-CimInstance -ClassName Win32_OperatingSystem
$processor = Get-CimInstance -ClassName Win32_Processor
$disk = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'"
# オブジェクトに整形
$enventory = [PSCustomObject]@{
"コンピューター名" = $computerSystem.Name
"シリアル番号" = $bios.SerialNumber
"メーカー" = $computerSystem.Manufacturer
"モデル" = $computerSystem.Model
"OS" = $os.Caption
"OSバージョン" = $os.Version
"OSビルド" = $os.BuildNumber
"CPU" = $processor.Name
"メモリ(GB)" = [math]::Round($computerSystem.TotalPhysicalMemory / 1GB, 1)
"ディスク容量(GB)" = [math]::Round($disk.Size / 1GB, 1)
"ディスク空き(GB)" = [math]::Round($disk.FreeSpace / 1GB, 1)
"最終起動日時" = $os.LastBootUpTime
"ログインユーザー" = $computerSystem.UserName
"取得日時" = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
}
# CSV出力
$csvPath = "$env:USERPROFILE\Desktop\Enventory_$($computerSystem.Name).csv"
$enventory | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
Write-Host "完了: $csvPath に出力しました" -ForegroundColor Green
こんな感じでCSVファイルで必要な情報が取得できる形です。
スクリプト内容の解説
Get-CimInstance
WMI(Windows Management Instrumentation)からシステム情報を取得するコマンドレットです。
wmic(Windows Management Instrumentation Command line utility)の後継にあたるようなコマンドレットで、Windows 11 24H2からwmicが来ていてインストールされなくなったため、代わりに使っています。
-ClassNameオプションでどの情報(クラス)を取得するか指定しています。今回指定しているクラスの説明は以下の通りです。
- Win32_ComputerSystem:コンピューター名やメーカー、モデル名、搭載されているメモリの情報が取得できます。
- Win32_BIOS:シリアル番号などUEFIに関連した情報を取得できます。
- Win32_OperatingSystem:OS名やバージョン、最終起動日時などの情報が取得できます。
- Win32_Processor:CPU情報が取得できます
- Win32_LogicalDisk:ディスク容量や空き容量が取得できます。
Export-Csv
PowerShellスクリプト上でPSCustomObjectとして取得したハッシュテーブル(オブジェクト)の内容を、ExcelやスプレッドシートにインポートしやすいようCSVファイルに変換できるコマンドレットです。
-PathオプションではCSVファイルを出力する先を指定しており、-EncodingオプションではExcelやスプレッドシートにインポートした際、日本語が文字化けしないように出力されるCSVファイルの文字エンコーディングを指定しています。
Visual Studio Codeを使ってスクリプトファイルを作成する際の注意点
Visual Studio Codeを使ってスクリプトを作成する際は、「エンコード付きで保存」から「Japanse(Shift JIS)」で必ず保存するようにしてください。
実行方法
方法はいくつかありますが、主な実行方法は以下の通りです。
PowerShellから直接実行
- スクリプトを.ps1ファイルとして保存(Get-Enventory.ps1など)
- PowerShell(管理者)/ターミナル(管理者)で開く
- Set-ExecutionPolicy RemoteSigned -Scope Processを実行し、ローカルに保存されているPowerShellスクリプトを実行できるよう、実行ポリシーを一時的に変更する
- .\Get-Enventory.ps1を実行する
直接貼り付けて実行
- PowerShell(管理者)/ターミナル(管理者)で開く
- スクリプトの内容をコピペしてEnterキーを押す
batファイルからPowerShellスクリプトを呼び出す
- 「powershell.exe -ExecutionPolicy RemoteSigned -File “%UserProfile%\Desktop\Get-Enventory.ps1」と記載したbatファイルを作成する
- 作成したbatファイルを右クリックし、「管理者として実行」をクリック
タスクスケジューラーを使って実行
- タスクスケジューラーから「タスクの作成」をクリックする
- セキュリティオプションを「ユーザーがログオンしているかどうかにかかわらず実行する」を指定
- トリガータブでスクリプトを実行するタイミングを指定
- 操作タブで「新規」をクリックし、下記の通り設定する
操作:プログラムの開始
プログラム/スクリプト:powershell.exe
引数の追加:-ExecutionPolicy RemoteSigned -File “%UserProfile%\Desktop\Get-Enventory.ps1
出力されるCSV例(Enventory_hoge.csv)
"コンピューター名","シリアル番号","メーカー","モデル","OS","OSバージョン","OSビルド","CPU","メモリ(GB)","ディスク容量(GB)","ディスク空き(GB)","最終起動日時","ログインユーザー","取得日時"
"hoge","XXXXXXXX","LENOVO","21QLCTO1WW","Microsoft Windows 11 Business","10.0.26200","26200","AMD Ryzen AI 7 PRO 350 w/ Radeon 860M ","91.6","1674.5","916","2026/04/02 22:58:12","syobon","2026-04-06 00:24:32"
カスタマイズのヒント
今回取得した情報以外にも追加で取得したい場合は、# 情報取得セクションに変数を追加し、$enventory = [PSCustomObject]@{の末尾に追加した変数を追加すればOKです。
例えば、Get-NetIPAddressやGet-NetAdapterを使えばIPアドレスやMACアドレスが取得できます。ただスクリプトが少し複雑になるので、今回は省略し次回カスタマイズ応用編として今後の記事で詳しく紹介予定です。
複数台のPCから一括取得したい場合
Invoke-Commandを使ってリモートから実行する方法がありますが、WinRM(Windows Remote Managemt)の有効化が必要です。
また、これ以外にもプロビジョニングパッケージを使った自動設定などでも実現可能です。
これら複数のPCから一括取得する仕組み化については、今後の記事で詳しく紹介予定です。
BitLocker回復キーも取得したい場合
Get-BitLockerVolumeコマンドレットを使えば、BitLocker回復キーの取得も可能ですがこちらもスクリプトが複雑になる事や、生成されたファイルの取り扱いや回収に注意が必要ですので、こちらも今後の記事で詳しく紹介予定です。
プロビジョニングパッケージについて
「複数台のPCから一括取得したい場合」でプロビジョニングパッケージについて触れましたが、これは管理者が指定した設定を自動で反映してくれる便利なものです。
当ブログの同人誌として、プロビジョニングパッケージの入門書や設定リファレンスを用意していますので、プロビジョニングパッケージの詳細を知りたい方は下記から同人誌をお求めください。
