【WMI】コンピュータからの情報収集の仕方
WMI(Windows Management Instrumentation)といえば、Windows OSを管理する上で、便利極まりないプログラミングインターフェイスです
VBScriptを使って、Windows OSから情報収集をしてみようと思います。
そのためには、まず、対象コンピュータに接続する必要があります。接続方法には2通りあります。
(A)資格情報を明示的に指定して、対象コンピュータへ接続する方法
(B)スクリプト実行ユーザの資格情報で、対象コンピュータへ接続する方法
以下に、具体的な接続コードを記載しておきます。
(A)資格情報を明示的に指定して、対象コンピュータへ接続する方法
---------------------------------------------
Option Explicit
const strComputer="WIN2008R2AD"
const strUser="domain\administrator"
const strPassword="********"
const strNamespace="\root\CIMV2"
dim objLocator
dim objWMIService
set objLocator = CreateObject("WbemScripting.SWbemLocator")
set objWMIService = objLocator.ConnectServer(strComputer, strNamespace, strUser, strPassword)
---------------------------------------------
スクリプトの実行者の資格情報(権限)ではなくて、スクリプト内で指定したユーザ(domain\administrator)の資格情報(権限)で対象コンピュータ(WIN2008R2AD)に接続することになります。この場合、スクリプトの実行者が単なるDomainUser権限しか有していなくても、DomainAdmin権限を持ったdomain\administratorとして、対象コンピュータに接続することになります。
(B)スクリプト実行ユーザの資格情報で、対象コンピュータへ接続する方法
---------------------------------------------
Option Explicit
const strComputer="WIN2008R2AD"
const strNamespace="\root\CIMV2"
dim objWMIService
set objWMIService = GetObject("winmgmts:\\" & strComputer & strNamespace)
---------------------------------------------
スクリプトの実行者の権限で対象コンピュータに接続することになるので、スクリプトの実行者が単なるDomainUser権限しか有していないなら、GetObjectのステップで、オブジェクトを取得することができません。errオブジェクトを拾うと、err.number=70、err.description=書き込みできません、が返ってくるハズです。
1つ気をつけないといけないのは、スクリプトを実行しているローカルコンピュータへの接続には、(A)の方法(資格情報を明示的に指定してコンピュータに接続)が利用できない点です。errオブジェクトを拾うと、err.number=-2147217308、err.description=ユーザー資格情報はローカル接続には使用できません、が返ってくるハズです。つまり、ローカルコンピュータへ接続する場合は、必ず(B)の方法を使わねばなりません。
例えば、ローカルコンピュータも含む企業内の全てのコンピュータから情報を収集しようとする時に、(A)の方法を使うと、ローカルコンピュータの情報がだけ収集できないということになります。だったら、DomainAdmin権限を有したユーザで(B)の方法で収集すれば良いのでは?という意見もあるでしょうが、滅多矢鱈にDomainAdmin権限のユーザでコンソール作業すべきではないというセキュリティ重視の考え方もあるので、状況に応じて、接続方法を考えてあげないといけないでしょう。
以下は、ちょっと工夫して、スクリプト実行ホストと対象コンピュータが同じかどうかを判断材料にしたスクリプトの例です。これなら、1つのスクリプトで賄えます
---------------------------------------------
Option Explicit
On Error Resume Next
const strComputer="WIN2008R2AD"
const strUser="domain\administrator"
const strPassword="********"
const strNamespace="\root\CIMV2"
const RetSameValue=0
dim objLocator
dim objWMIService
dim colItems
dim objItem
dim colTemp
dim objWshShell, objEnv
set objWshShell = WScript.CreateObject("WScript.Shell")
set objEnv = objWshShell.Environment("Process")
if((strComp(ucase(objEnv.Item("COMPUTERNAME")), ucase(strComputer)))=RetSameValue) then
'*****ユーザ資格情報を利用しない接続の場合(ここから)*****************
set objWMIService = GetObject("winmgmts:\\" & strComputer & strNamespace)
if(err) then wscript.echo "[ERROR]:" & err.description & "(" & err.number & ")"
'*****ユーザ資格情報を利用しない接続の場合(ここまで)*****************
else
'*****ユーザ資格情報を利用して接続の場合(ここから)*****************
set objLocator = CreateObject("WbemScripting.SWbemLocator")
if(err) then wscript.echo "[ERROR]:" & err.description & "(" & err.number & ")"
set objWMIService = objLocator.ConnectServer(strComputer, strNamespace, strUser, strPassword)
if(err) then wscript.echo "[ERROR]:" & err.description & "(" & err.number & ")"
'*****ユーザ資格情報を利用して接続の場合(ここまで)*****************
end if
if(err) then wscript.quit
set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True",,48)
if(err) then wscript.echo "[ERROR]:" & err.description & "(" & err.number & ")"
for each objItem in colItems
wscript.echo "DNSHostName : " & objItem.DNSHostName
for each colTemp in objItem.IPAddress
wscript.echo "IPAddress : " & colTemp
next
next
---------------------------------------------
なお、対象コンピュータに接続した後は、Win32_NetworkAdapterConfigurationクラスのオブジェクトをWQLで取得しています。このクラスは、Win32クラスに属していて、名前空間はroot\CIMV2となります。
最近のコメント