tech.guitarrapc.cóm

Technical updates

PowerShell で インストールされているアンチウィルスソフトを取得する

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に挙げておきます。

PowerShellUtil / Get-AntiSpyware / Get-AntiSpyware.ps1

#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に移行しましょう。