見出し画像

PowerShellでPC情報を取り出す

PowerShellを使うとパソコンのいろいろな情報が取り出せます。
これはIT資産管理や設定自動化で役立ちます。

下に思いつくまま書きました。
ほかにも思いつきましたら追記します。

取得できる項目:
コンピュータ名
ユーザーID
ログインユーザー名
メーカー(PCベンダー)
モデル名
シリアル番号
プロダクトID
デバイスID
BIOSバージョン
OS名
CPU名
GPU名
画面解像度(メイン画面)
ストレージの情報
論理ドライブ容量 空/全
メモリ 容量、搭載数、スピード
バッテリー消耗度 (デスクトップPCではエラーになるかも)
Microsoft365アカウント
ウィルス対策ソフト
Windows Defenderスキャン除外リスト
プリンタ一覧
インストール済みソフトウェア一覧
グローバルIPアドレス
位置情報
BitLockerが有効なドライブ
BitLockerが有効なドライブと回復キー
ファイヤーウォールのONOFF状態
ユーザーが所属するADグループのリスト
Windows Defender で発見された脅威
Windows Defender で発見された脅威と発見時間
パソコンの温度を測る
CPU負荷率
メモリ使用率
メモリ空き容量
接続中のWiFi SSID名
印刷ログ
WiFiの信号強度
WiFiの既知のネットワーク一覧
USBメモリ禁止のONOFF
モバイルホットスポットのONOFF


###
#コンピューター名
$PCName = $Env:COMPUTERNAME


###
#ユーザーID
$UserID = $Env:USERNAME


###
#ログインユーザー名
$UserName = ((Whoami /fqdn)  -split "="  -split "," )[1]


###
#メーカー
$Vendor = (Get-WmiObject Win32_ComputerSystemProduct).Vendor


###
#モデル名
$Model = (Get-WmiObject Win32_ComputerSystemProduct).Name


###
#シリアル番号
$IdentifyingNumber = (Get-WmiObject Win32_ComputerSystemProduct).IdentifyingNumber


###
#プロダクトID
$ProductID = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").ProductID


###
#デバイスID
$DeviceID = ((Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\SQMClient" -Name "MachineId")) 


###
#BIOSバージョン
$BIOS = (Get-CimInstance -ClassName Win32_BIOS).SMBIOSBIOSVersion


###
#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


###
#ストレージの情報
$Storage=""
$PhysicalDisk = Get-PhysicalDisk
foreach($i in $PhysicalDisk){
	$StorageMediaType = $i.MediaType
	#ストレージ容量
	$StorageSize = [String]($i.Size | Measure-Object -Sum | %{ [int] ($_.sum /1GB ) })+"GB"
	#ストレージの動作状況
	$DiskOperationalStatus = "Status_"+$i.OperationalStatus
	#ストレージの健康状態
	$DiskHealthStatus = "_"+$i.HealthStatus
	#RAID
	if ($i.FriendlyName.Contains("RAID") -eq $True){
		$StorageMediaType = "RAID"
		if ($i.FriendlyName.Contains("0") -eq $True){
			$StorageMediaType += "0"
		}
		if ($i.FriendlyName.Contains("1") -eq $True){
			$StorageMediaType += "1"
		}
		if ($i.FriendlyName.Contains("5") -eq $True){
			$StorageMediaType += "5"
		}
		if ($i.FriendlyName.Contains("6") -eq $True){
			$StorageMediaType += "6"
		}
	}
	$Storage+=$StorageMediaType,$StorageSize,$DiskOperationalStatus,$DiskHealthStatus
	$Storage+=" / "
}
$Storage=$Storage.TrimEnd(" / ")


###
#論理ドライブ容量 空/全
$Drive=""
foreach($i in ((Get-PSDrive) | Where-Object {$_.Free -ne $null})){
	if([long]($i.Free) -eq 0){
		continue
	}else{
		$Used = [Math]::Round([long]($i.Used)/1GB,2)
		$Free = [Math]::Round([long]($i.Free)/1GB,2)
		$Drive+=$i.Name+":"+[String]$Free+"/"+[String]($Free+$Used)+"GB  "
	}
}
$Drive=$Drive.TrimEnd("  ")


###
#メモリ 容量、搭載数、スピード
$MemoryTotalSize = ""
$MemoryCount = ""
$MemorySpeed =""
$PhysicalMemory = Get-WmiObject -Class Win32_PhysicalMemory
$MemoryTotalSize = [String]($PhysicalMemory | %{ $_.Capacity} | Measure-Object -Sum | %{ [int] ($_.sum /1GB)})+"GB"
$MemoryCount = [String]$PhysicalMemory.Count
$MemorySpeed = [String]$PhysicalMemory.Speed


###
#バッテリー消耗 (デスクトップPCではエラーになるかも)
$BatteryCapacityRatio="不明"
try{
  $tmp=POWERCFG /BATTERYREPORT /OUTPUT "batteryreport.xml" /XML
  $tmp = $tmp -replace "バッテリ寿命レポートがファイル パス",""
  $tmp = $tmp -replace "に保存されました。",""
  $tmp = $tmp -replace " ",""
  IF(Test-Path $tmp){
    $xml = [xml](Get-Content $tmp)
    $BatteryCapacityRatio = $xml.BatteryReport.Batteries.Battery.FullChargeCapacity / $xml.BatteryReport.Batteries.Battery.DesignCapacity * 100
    $BatteryCapacityRatio = [String]([Math]::Round($BatteryCapacityRatio,2))+ "%"
    Remove-Item -Path $tmp
  } else {
    $BatteryCapacityRatio="不明"
  }
}catch{
    $BatteryCapacityRatio="不明"
}


###
#Microsoft365アカウント
$Microsoft365=""
$Registry = 'HKCU:\SOFTWARE\Microsoft\Office\16.0\Common\Licensing\LicensingNext\LicenseIdToEmailMapping'
$PropertyList = (Get-Item -Path $Registry).Property
foreach($Property in $PropertyList ){
  $tmp=Get-ItemPropertyValue -Path $Registry -name $Property
  if($tmp -like "*@*"){
    $Microsoft365=$tmp
  }
}

IF($Microsoft365 -eq ""){
	$Registry=""
    $Registry = (reg query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Common\LanguageResources\" )  | Where-Object  {$_ -like "*Cache"}
    foreach($i in $Registry){ 
      $Microsoft365 += (Get-Item -Path "Registry::$i").GetValue("RegionalAndLanguageSettingsAccount")
      $Microsoft365 += " "
    }
    $Microsoft365 = $Microsoft365.TrimEnd(" ")
}


###
#ウィルス対策ソフト
$AntiVirus = ""
$antiVirusProduct = Get-WmiObject -Namespace "root/SecurityCenter2" -Query "SELECT * FROM AntiVirusProduct"
foreach($i in $antiVirusProduct.displayName){
	$antiVirus+="""$i"" "
}


###
 #Windows Defenderスキャン除外リスト
$ExclusionList=Get-MpPreference
echo "[除外ファイルとフォルダー]"$ExclusionList.ExclusionPath `n
echo "[除外するファイルの種類]"$ExclusionList.ExclusionExtension `n
echo "[除外するプロセス]"$ExclusionList.ExclusionProcess`n | Out-String -Stream | ?{$_ -ne ""}


###
#プリンタ一覧
$Printer=""
foreach($i in (Get-Printer | where-Object { $_.portname -match "IP_|USB|192.168." } | select-object name,portName)) {
	$Printer+="""$i"" "
}
$Printer = $Printer.TrimEnd(" ")


###
#インストール済みソフトウェア一覧
$Applist=""
$Applist=Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Sort-Object -Property DisplayName


###
#インストールされている修正プログラムの一覧
$FixEngineering=""
$FixEngineering=Get-CimInstance -ClassName Win32_QuickFixEngineering


###
#グローバルIPアドレス
$GlobalIP=""
$function_GetGlobalIP = {
	$res=""
	try{
		$res =  (Invoke-WebRequest -Uri "inet-ip.info/ip").Content
	}catch{
		try{
			$res =  (Invoke-WebRequest -Uri "http://myexternalip.com/raw").Content
		}catch{
			$res=""
		}
	}
	return $res
}
$timeoutSeconds = 10
# バックグラウンドジョブで並列実行
$jobGIP = Start-Job -ScriptBlock $function_GetGlobalIP
# バックグラウンドジョブのタイムアウト設定
Wait-Job -Job $jobGIP -Timeout $timeoutSeconds | Out-Null
# スリープして待つ(本来は別の処理を並行で行う)
Start-Sleep $timeoutSeconds
# バックグラウンドジョブの結果を取り出す
$GlobalIP = Receive-Job $jobGIP
# 終了しただけ残っているジョブを削除しておく
Get-Job | Remove-Job


###
#位置情報
$Location = "GeoLocation:none"
$function_GetGeoWatcher = {
	Param($timeout=10)
    $res=""
    Add-Type -AssemblyName System.Device
    $GeoWatcher = New-Object System.Device.Location.GeoCoordinateWatcher
 
    # 計測開始
    $GeoWatcher.Start()
 
    # 計測待ち。
    while("Ready" -ne $GeoWatcher.Status) {
        Start-Sleep 1
        $loopcnt+=1
        IF($loopcnt -ge ($timeout*0.8) ){
          break
        }
    }
 
    # 結果確認
    $res = $GeoWatcher.Position.Location | Select-Object Latitude,Longitude
    $GeoWatcher.Dispose()
    #Write-Host $Location.Latitude,$Location.Longitude
    IF([double]::IsNaN($res.Latitude) -And [double]::IsNaN($res.Longitude)){
    	return -1,-1
    } else {
	    return $res.Latitude,$res.Longitude
	}
}
$timeoutSeconds = 10
# バックグラウンドジョブで並列実行
$jobGPS = Start-Job -ScriptBlock $function_GetGeoWatcher -ArgumentList $timeoutSeconds
# バックグラウンドジョブのタイムアウト設定
Wait-Job -Job $jobGPS -Timeout $timeoutSeconds | Out-Null
# スリープして待つ(本来は別の処理を並行で行う)
Start-Sleep $timeoutSeconds
# バックグラウンドジョブの結果を取り出す
$Location = Receive-Job $jobGPS
# 終了しただけ残っているジョブを削除しておく
Get-Job | Remove-Job


###
#Bitlockerが有効なドライブ
$BitlockerDrive=""
$volume = Get-WMIObject -Namespace "root/CIMV2/Security/MicrosoftVolumeEncryption" -Query "SELECT * FROM Win32_EncryptableVolume"
foreach($i in $volume){
	if($i.ProtectionStatus){
		 $BitlockerDrive+=$i.DriveLetter
	}
}


###
#Bitlockerが有効なドライブと回復キー
$BitlockerEncryptedDrive=""
$BitlockerVolume = Get-BitLockerVolume
foreach($i in $BitlockerVolume){
	if($i.ProtectionStatus -eq "On"){
		$BitlockerEncryptedDrive+=$i.MountPoint
		$BitlockerEncryptedDrive+=((Get-BitLockerVolume -MountPoint $i.MountPoint).KeyProtector).RecoveryPassword
	}
}


###
#ファイヤーウォールのONOFFの状態
$Firewall=""
foreach($i in (Get-NetFirewallProfile |select-object name,Enabled)){
	$Firewall += $i.name +":"+ $i.Enabled+" "
}
$Firewall=$Firewall.trimend(" ")


###
#ユーザーが所属するADグループ
$ADGroupList=""
$ADGroup=(Get-ADPrincipalGroupMembership -Identity $Env:USERNAME|select-object name)
foreach($i in $ADGroup){
	$ADGroupList+="["+$i.name+"] "
}

###
# Windows Defender で発見された脅威
$DefenderThreat=""
$tmp=Get-MpThreat
foreach($i in $tmp){
	$DefenderThreat+="[ThreatID:"+$i.ThreatID+" "+$i.ThreatName+"]"
}

###
# Windows Defender で発見された脅威と発見時間
$DefenderDetectionTime=""
$tmp=Get-MpThreatDetection
$tmp2=Get-MpThreat
foreach($i in $tmp){
	$ThreatName=""
	foreach($j in $tmp2){
		IF($i.ThreatID -eq $j.ThreatID){
			$ThreatName=$j.ThreatName
			$DefenderDetectionTime+="["+$i.InitialDetectionTime.ToString("yyyy/MM/dd HH:mm:dd")+" "+$ThreatName+"]"
			break
		}
	}
}

###
# パソコンの温度を測る
$Temperature = ""
$data = Get-WmiObject MSAcpi_ThermalZoneTemperature -Namespace "root/wmi"
$temp=@()
$temp=$data.CurrentTemperature
$sensor = 0
$celsius= 0
foreach ($line in $temp) {
  $celsius+=($line/10)-273.15
  $sensor++
}
$celsius=[math]::round($celsius/$sensor,2)
$Temperature = $celsius+""

###
#CPU負荷率
Get-Counter "\Processor(_Total)\% Processor Time" | Foreach-Object {$_.CounterSamples[0].CookedValue}

###
#メモリ使用率
Get-Counter "\memory\% committed bytes in use" | Foreach-Object {$_.CounterSamples[0].CookedValue}

###
#メモリ空容量
Get-Counter "\memory\Available MBytes" | Foreach-Object {$_.CounterSamples[0].CookedValue}

###
#接続中のWiFi SSID名
$SSID=""
$result=netsh wlan show interfaces
foreach($i in $result){
 if($i.IndexOf(" SSID ") -ne -1){
  $i=$i.replace("SSID ","")
  $i=$i.replace(" ","")
  $i=$i.replace(":","")
  $SSID=$i
 }
}
write-host $SSID

###
#印刷ログ
#事前に印刷イベントログを有効化しておく。有効後の印刷ログが取れるようになる
wevtutil set-log "Microsoft-Windows-PrintService/Operational" /enabled:true

#印刷ログ 5件だけ出す
$PrintLogs = Get-WinEvent -FilterHashtable @{LogName="Microsoft-Windows-PrintService/Operational"; ID=307;} | select -first 5
foreach($i in $PrintLogs){write-host $i.TimeCreated,$i.message }


#WiFi信号の強さを測る
(netsh wlan show interface | Where-object {$_ -like '*%*'}).replace(' ','')


# WiFi既知のネットワーク一覧を表示
netsh wlan show profiles

###
# USBメモリ禁止のONOFF
$USBBlock="NO BLOCK"
$USBStrage = (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR\").start
if($USBStrage -eq 4){
	$USBBlock="BLOCK" #無効化されている
} else {
	if(test-path -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\"){
		$USBStrageWriteProtect = (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies\").WriteProtect
		if($USBStrageWriteProtect -eq 1){
			$USBBlock="WRITE PROTECT" #書き込み禁止
		}
	}
}


###
# モバイルホットスポット禁止のONOFF
$MobileHotSpotBlock = (Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Network Connections\").NC_ShowSharedAccessUI
if($MobileHotSpotBlock -eq 0){
	$MobileHotSpotBlock="BLOCK" #禁止されている
} else {
	$MobileHotSpotBlock="NO BLOCK" #禁止されていない
}





#PowerShell #Windows #キッティング #業務自動化 #IT資産管理 #SKYSEA #Lanscope #情シス #社内SE #プログラミング学習


参考になるいい本を紹介します
アマゾン会員なら無料で読めます


この記事が気に入ったらサポートをしてみませんか?