PowerShell を用いた PC管理の需要が高いようですね。
今回は、PowerShell での アンチウィルスソフト検出 を見てみましょう。
結構前から WMIでのやり方はあるのですが、ただ出しただけの事例が多く注意点が余り説明されていないようなのでいい機会だと思います。
目次
取得方法
セキュリティセンターを利用します。
ご存知の通り、セキュリティセンターにはアンチウィルスソフトの情報が表示されます。
そのため、ここの情報を取得すれば欲しい情報は得れますね。
対象バージョン
PowerShell バージョン
今回は、 CIMインスタンスを利用しています。
そのため、対象PowerShellバージョンは PowerShell 3.0以上です。
OS
上記の取得方法は、CIM (WMI) の NameSpace SecurityCenter2
を利用しています。 (XPの場合は SecurityCenter
です)
対象OSは、非サーバー系OSのWindows 7以降 となります。
対象のまとめ
対象OS | 対象PowerShell |
---|---|
Windows 7以上 (非サーバー系OS) | PowerShell 3.0以上 |
なぜサーバー系OSが対象にならないのか
理由は、CIM(WMI)に NameSpace SecurityCenter2
を含んでいないためです。
Windows Server 2012 の名前空間一覧を見てみましょう。
(Get-CimInstance -namespace "root" -className "__Namespace").Name
結果です。
subscription DEFAULT MicrosoftWmiNet CIMV2 msdtc Cli nap MicrosoftIISv2 SECURITY RSOP WebAdministration StandardCimv2 WMI Amazon AccessLogging directory Policy Interop Hardware ServiceModel Microsoft aspnet
ないですねー。
Windows 8.1 の名前空間一覧を見てみましょう。
subscription DEFAULT CIMV2 msdtc Cli nap SECURITY SecurityCenter2 RSOP StandardCimv2 WMI directory Policy virtualization Interop Hardware ServiceModel SecurityCenter Microsoft aspnet
あります。つまり取得できるわけです。
コードサンプル
GitHubに挙げておきます。
#Requires -Version 3.0 function Get-AntiSpyware { [CmdletBinding()] Param ( # Input ComputerName you want to check [Parameter(Mandatory = 0, ValueFromPipeline, ValueFromPipelineByPropertyName, Position=0)] [ValidateNotNullOrEmpty()] [string] $computerName = [System.Environment]::MachineName, # Input PSCredential for $ComputerName [Parameter(Mandatory = 0, Position=1)] [System.Management.Automation.PSCredential] $credential ) Begin { $nameSpace = "SecurityCenter2" $className = "AntiSpywareProduct" } Process { if ($PSBoundParameters.count -eq 0) { if ((Get-CimInstance -namespace "root" -className "__Namespace").Name -contains $nameSpace) { Write-Verbose ("localhost cim session") Get-CimInstance -Namespace "root\$nameSpace" -ClassName $className } else { Write-Warning ("You can not check AntiSpyware with {0} as it not contain SecutiryCenter2" -f $OSName) } } else { try { Write-Verbose ("creating cim session for {0}" -f $computerName) $cimSession = New-CimSession @PSBoundParameters if ((Get-CimInstance -namespace "root" -className "__Namespace" -cimsession $cimSession).Name -contains $nameSpace) { Get-CimInstance -Namespace "root\$nameSpace" -ClassName $className -CimSession $cimSession } else { Write-Warning ("{0} not contains namespace {1}, you can not check {2}." -f $computerName, $nameSpace, $className) } } finally { $cimSession.Dispose() } } } End { } }
実行例
複数のPCに行う場合 (credential が同一ならですが)、パイプライン越しに渡してください。
$credential = Get-Credential "10.0.0.10","10.0.0.11" | Get-AntiSpyware -credential $credential
モジュールに入れたり、ps1に入れておけば valentiaと連携できて簡単です。
valea 10.0.0.10,10.0.0.11 {Get-AntiSpyware}
出力例
isplayName : Windows Defender instanceGuid : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46} pathToSignedProductExe : %ProgramFiles%\Windows Defender\MSASCui.exe pathToSignedReportingExe : %ProgramFiles%\Windows Defender\MsMpeng.exe productState : 397568 timestamp : Fri, 25 Oct 2013 14:31:11 GMT PSComputerName : 127.0.0.1
まとめ
CIM を利用すると、cimsession
が利用できていいのですよ。
wmi
からcim
に移行しましょう。