PowerShellで作るPC台帳(オンプレ版)
会社のパソコンの台帳ってどうやってますか?
SkySeaとかLANSCOPEのようなIT資産管理ツールを導入している会社なら自動的に作られるんでしょうけど、大きな会社でも半分程度しか導入されていないと聞きます。きっとエクセル台帳で管理しているのだと思います。
エクセル台帳でもある程度は管理できるんでしょうけど完璧に管理は難しいです。
そこで
PowerShellでうまいことやってパソコン台帳を作りたいと思います。
前提条件
・OSはWindows10/11
・ファイルサーバがあり、書き込みできる共有フォルダがあること
・説明の都合上、ファイルサーバ192.168.1.100の共有フォルダlogに台帳が自動的に作成されることにします。
作り方
まずパソコン情報を収集する部分を作ります。
1.Cドライブ直下にフォルダ「temp」を作ります。
2.テキストエディタを開いて下のスクリプトを貼り付け
さっきの1で作ったc:\tempの中にファイル名log.ps1で保存します。
#コンピューター名
$PCName = $Env:COMPUTERNAME
#ユーザーID
$UserID = $Env:USERNAME
#メーカー
$Vendor = (Get-WmiObject Win32_ComputerSystemProduct).Vendor
#モデル名
$Model = (Get-WmiObject Win32_ComputerSystemProduct).Name
#シリアル番号
$SerialNumber = (Get-WmiObject Win32_ComputerSystemProduct).IdentifyingNumber
#OSを取得
$OS = (Get-WmiObject Win32_OperatingSystem).Caption + " Ver." + (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").DisplayVersion
#CPUの種類
$CPU = (Get-WmiObject Win32_Processor).name
#グラボ
$GPU = (gwmi win32_videocontroller).Caption
#画面解像度
$graphics_info = (gwmi win32_videocontroller)
$DisplayWH=[String]$graphics_info.CurrentHorizontalResolution+"x"+[String]$graphics_info.CurrentVerticalResolution
#メモリ
$Memory = ([String](Get-WmiObject -Class Win32_PhysicalMemory | %{[string]($_.Capacity/1GB) +"GB("+ [string]($_.Speed)+")+"}) ).TrimEnd("+")
#ストレージ
$Strage = ([String](Get-PhysicalDisk | where-object {$_.SerialNumber -ne $null} | %{$_.MediaType + [string][int]($_.size/1GB)+"GB" + "+"})).TrimEnd("+")
#論理ドライブの空き容量割合
$PSDriveFree=[string](Get-PSDrive | Where-Object {$_.Free -ne $null}| %{ $_.Name+":"+[String][Math]::Round( ($_.Free*100 / ($_.Free+$_.Used)),2)+"% " })
#ローカルIPアドレス
$IPAddress=ipconfig | ?{ $_ -match '^ *IPv4'} | Select-Object -first 1 | %{ $_.Split()[-1] }
#WiFi
$SSID=(netsh wlan show interfaces | where-object {$_ -match "^ *SSID"}).replace(" " ,"").replace("SSID:" ,"")
#アンチウィルス
$AntiVirus = [String]((Get-WmiObject -Namespace "root/SecurityCenter2" -Query "SELECT * FROM AntiVirusProduct") | %{"("+$_.displayName+")"})
#適応されている更新プログラム
$HotFixes="";(Get-ComputerInfo).OsHotFixes|select-object HotFixID,InstalledOn|foreach{$HotFixes+=$_.HotFixID+"("+$_.InstalledOn+") "}
#コンピュータの説明
$Description=(gwmi Win32_OperatingSystem).Description
# カスタムオブジェクト(要素の入れ物)
$Datas = @()
# カスタムオブジェクトの要素作成
$Data = New-Object PSObject | `
Select-Object DATE, PCNAME, USERID, VENDOR `
,MODEL ,SERIALNUMBER ,OS ,CPU ,GPU `
,DISPLAYWH , MEMORY ,STRAGE ,PSDRIVEFREE `
,IPADDRESS ,SSID ,ANTIVIRUS ,HOTFIXES `
,DESCRIPTION
# カスタムオブジェクトの要素に値を設定
$Data.DATE = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
$Data.PCNAME = $PCName
$Data.USERID = $UserID
$Data.VENDOR = $Vendor
$Data.MODEL = $Model
$Data.SERIALNUMBER = $SerialNumber
$Data.OS = $OS
$Data.CPU = $CPU
$Data.GPU = $GPU
$Data.DISPLAYWH = $DisplayWH
$Data.MEMORY = $Memory
$Data.STRAGE = $Strage
$Data.PSDRIVEFREE = $PSDriveFree
$Data.IPADDRESS = $IPAddress
$Data.SSID = $SSID
$Data.ANTIVIRUS = $AntiVirus
$Data.HOTFIXES = $HotFixes
$Data.DESCRIPTION = $Description
# カスタムオブジェクトに要素を追加
$Datas += $Data
$OutputFilename = "c:\temp\pclog.csv"
$Datas | Export-Csv $OutputFilename -Encoding Default -NoTypeInformation -Append
3.テストのためにlog.ps1を実行します。
そのまま実行するとエラーが出るので
このコマンドで実行します
powershell -ExecutionPolicy Bypass c:\temp\log.ps1
4.c:\temp\にファイルpclog.csvが作成されているので開いて確認します。
パソコンの情報が取れていたら成功
5.ファイル「log.ps1」を書き換えます。
下から2行目の「$OutputFilename = "c:\temp\pclog.csv"」
がCSVファイルの保存される場所なので
ファイルサーバに保存されるように書き換えます。
保存先がファイルサーバが192.168.1.100で共有フォルダlog
$OutputFilename = "\\192.168.1.100\log\pclog.csv"
書き換えたら、log.ps1も\\192.168.1.100\logへ保存して、
もう一度実行します。
ここまでで、9割完成。
あとは、それぞれのパソコンでps1ファイルを手で実行してもらうか
グループポリシーでログインスクリプトに仕込むかになります。
それぞれのパソコンで手で実行する方法はちょっと工夫が必要で
実行用のbatファイルを用意します。
batファイルの中身はこれです。ファイル名はlog.batとでもしましょう。
PowerShell -ExecutionPolicy Bypass \\192.168.1.100\log\log.ps1
log.batを実行すると"\\192.168.1.100\log\pclog.csv"に実行結果がたまっていきます。自動的に収集されるPC台帳の完成です。
#PowerShell #プログラミング入門 #プログラミング学習 #コマンドレット #PC台帳 #SkySea #LANSCOPE #IT資産管理ツール #Windows