スクリプト

【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となります。

【VMware】仮想マシンのディスク情報を入手する

vSphere Hypervisor(ESXi)にはサービスコンソールがないので、仮想マシンの仮想ハードディスク(vmdk)がどうなっているのかを知るには、外部からスクリプトを使って入手するしかないようです。

一つずつ仮想マシンを指定して、get-harddiskを実行して、情報を取得するのも、Powershellっぽくないので、get-vmで取得した仮想マシン名を元に、get-harddiskで情報を取得します。

--------------------------------

get-vm | foreach {get-harddisk -vm $_.name} | select-object Parent, Filename,CapacityKB, StorageFormat, DiskType | export-csv c:\tmp\list.txt

--------------------------------

”$_”は直前のコマンドレットで取得したオブジェクトが格納されています。この場合は、get-vmで取得した仮想マシンの情報となります。仮想マシン名は、nameプロパティに格納されているので、”$_.name”をget-harddiskへ渡してあげます。

欲しい情報は、仮想マシン名、仮想ディスク名、ディスクサイズ、フォーマットタイプ、ディスク種別なので、select-objectで該当するプロパティを指定します。

最後に、この実行結果をCSV出力するために、export-csvに結果を渡しています。

CSVファイルに出力した結果は、次の通り。

--------------------------------

#TYPE Selected.VMware.VimAutomation.ViCore.Impl.V1.VirtualDevice.FlatHardDiskImpl
"Parent","Filename","CapacityKB","StorageFormat","DiskType"
"Win2008R2","[DataStorage] Win2008R2/Win2008R2.vmdk","41943040","Thin","Flat"
"Win2003R2","[SystemStorage] Win2003R2/Win2003R2.vmdk","31457280","Thick","Flat"
"Win2003R2","[DataStorage] Win2003R2/Win2003R2_1.vmdk","20971520","Thick","Flat"
"Win2003R2-2","[DataStorage] Win2003R2-2/Win2003R2-2.vmdk","31457280","Thin","Flat"
"Win2003R2-2","[DataStorage] Win2003R2-2/Win2003R2-2_1.vmdk","20971520","Thin","Flat"

--------------------------------

各コマンドレットの詳細な書式は以下を参照。

Get-VM - vSphere PowerCLI Cmdlets Reference

Get-HardDisk - vSphere PowerCLI Cmdlets Reference

ExportCsv Members (Microsoft.PowerShell.Utility.Activities)

get-vmとget-harddiskが取得するオブジェクトの詳細は以下を参照。

VirtualMachine - Object

HardDisk - Object

【VMware】PowerCLIを使ってみる

VMware vSphereにスクリプトを使ってアクセスできるためのツールを、VMwareが用意してますが、そのPoweshell版であるPowerCLIを使ってみます。

(1)PowerCLIをインストールします。

(2)初めて、起動するときは、”管理者として”PowerCLIのコンソールを開きます。

ここで、「スクリプトの実行がシステムで無効になっているため、ファイル C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1 を読み込めません。」とメッセージが出ると思います。

Powercli001

(3)、そこで、以下を入力します。

-------------------------------

Set-ExecutionPolicy RemoteSigned

-------------------------------

次のようなメッセージが表示されたら、「Y」をタイプします。

-------------------------------

実行ポリシーの変更

実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプトピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?

[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

-------------------------------

これで、PowerCLIを利用できるようになり、以後、通常ユーザで起動しても、エラーは表示されなくなります。

管理者として起動するのは、”実行ポリシーを変更する”のに権限が足りないからです。

(4)vSphere Hypervisor(ESXi 4.1)へ接続してみます(vCenterでも、たぶん同じ)。

-------------------------------

Connect-VIServer 192.168.164.140 -User root -Password (パスワード)

-------------------------------

書式は、「Connect-VIServer - vSphere PowerCLI Cmdlets Reference」を参照。

ここで、ユーザとパスワードを指定しないと、入力ダイアログが表示されるので、そこに入力すれば、同じように接続できます。

Powercli002

(5)接続に成功すると、接続先と接続ユーザが表示されます。

-------------------------------

Name                           Port  User
----                           ----  ----
192.168.164.140                443   root

-------------------------------

(6)コンソールに”get-vm”と入力すると、仮想マシンの情報を取得できます。

-------------------------------

get-vm

-------------------------------

実行結果は次の通り。

-------------------------------

Name                 PowerState Num CPUs Memory (MB)
----                 ---------- -------- -----------
Win2008R2            PoweredOff 1        2048
Win2003R2            PoweredOff 1        1024
Win2003R2-2          PoweredOff 1        1024

-------------------------------

書式は「Get-VM - vSphere PowerCLI Cmdlets Reference」を参照。

こんな感じで、vSphereから、情報を抜き出したり、設定の変更、仮想マシンの起動停止がでます。

【VMware】SATAでESX-Serverは動くのか?

ESX-Servers試用版・・・」でSATAディスクを認識しませんでしたが、ぐぐってみると、認識できるSATAコントローラがあるようです。VMwareのサポートはありませんが・・・

Motherboards and unsupported servers that work with ESX 3.5 and / or ESXi 3.5 Installable

このページを見ると、intelのICHシリーズ、AdaptecのHostRAIDカード、nVidiaのMCPシリーズなら、SATA接続のローカルストレージを認識するようです。

VIAのチップセットはダメみたいです・・・。

2021年11月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

最近のトラックバック

無料ブログはココログ