Windowsの管理インターフェースであるWMI (Windows Management Instrumentation)から
値を取得する方法を調べていて、いくつか便利そうな情報を見つけたのでメモ
- WMIC コマンド
- WMI テスト (wbemtest)
- WMI コントロール (wmimgmt.msc)
- WMI Administrative Tools
- WMI Query
- WQLについて(参考URL)
Windowsの管理インターフェースであるWMI (Windows Management Instrumentation)から
値を取得する方法を調べていて、いくつか便利そうな情報を見つけたのでメモ
参考になりそうな情報をかき集めてみた。
Linux用wmicの出力結果は以下のようなもので、そのままでは取り込みずらい。
1 |
# /bin/wmic --namespace='root\CIMV2' --authentication-file=/etc/cacti/cactiwmi.pw //<対象端末名 or IPアドレス> "SELECT Size,FreeSpace FROM Win32_LogicalDisk WHERE DeviceID='対象ドライブ名(例 C:)'" |
1 2 3 |
CLASS: Win32_LogicalDisk DeviceID|FreeSpace|Size C:|36511567872|52322889728 |
そこで、別の監視ツール用だけど、
「cactiEZでWindowsOSのWMI値を直接取得してグラフを作成する手順」
http://pnpk.net/cms/?p=3861
さんのページのwmi.phpを使うと、以下のフォーマットに変更できるとのこと。
1 |
# /usr/bin/php /var/www/html/scripts/wmi.php -h '<対象端末名 or IPアドレス>' -u '/etc/cacti/cactiwmi.pw' -w 'Win32_LogicalDisk' -k 'DeviceID' -v '対象ドライブ名(例 C:)' -c 'Size,FreeSpace' -d1 |
1 2 3 4 5 |
Exec Status: 0 DeviceID:C FreeSpace:36509941760 Size:52322889728 |
このフォーマットだと、スクリプトで処理しやすい。
このような形式でのサンプルを探してみると、このような例が見つかった。
/proc/meminfoの実行例がこんなフォーマットなので、ほとんど同じですね。
1 2 3 4 5 |
MemTotal: 503832 kB MemFree: 8048 kB Buffers: 0 kB Cached: 83800 kB ~ |
あとは、
/proc/meminfoの情報をzabbixで収集してみるqiita.com/mutz0623/items/2a8186de010c494cbfe0
さんのスクリプトを参考に
「:」文字の前部分をZabbix_senderのキー、後部分を値として取り込めば、
行けるんじゃないかと妄想中。
Linuxから、WMI経由でWindowsの情報を取得できるツールがあったので試してみた。
これと、ZABBIXとうまく連携できれば、(SNMP経由でない)本当のエージェントレスができそう。
インストール方法は以下の通り
1 2 3 4 |
# wget http://www.orvant.com/files/packages/source/wmi_1.3.14.orig.tar.bz2 # bzip2 -cd wmi_1.3.14.orig.tar.bz2 | tar xvf - # cd wmi-1.3.14 # make |
ここで、以下のメッセージが出る場合は、
/bin/sh: line 2: ./configure: そのようなファイルやディレクトリはありません
yumで autoconfをインストールして、再度makeします。
1 2 |
# yum install autoconf # make |
makeには結構時間かかります。
make install前に動作確認します。
1 |
# ./Samba/source/bin/wmic Usage: [-?|--help] [--usage] [-d|--debuglevel DEBUGLEVEL] [--debug-stderr] [-s|--configfile CONFIGFILE] [--option=name=value] [-l|--log-basename LOGFILEBASE] [--leak-report] [--leak-report-full] [-R|--name-resolve NAME-RESOLVE-ORDER] [-O|--socket-options SOCKETOPTIONS] [-n|--netbiosname NETBIOSNAME] [-W|--workgroup WORKGROUP] [--realm=REALM] [-i|--scope SCOPE] [-m|--maxprotocol MAXPROTOCOL] [-U|--user [DOMAIN\]USERNAME[%PASSWORD]] [-N|--no-pass] [--password=STRING] [-A|--authentication-file FILE] [-S|--signing on|off|required] [-P|--machine-pass] [--simple-bind-dn=STRING] [-k|--kerberos STRING] [--use-security-mechanisms=STRING] [-V|--version] [--namespace=STRING] [--delimiter=STRING] //host query Example: wmic -U [domain/]adminuser%password //host "select * from Win32_ComputerSystem" [root@zabbix2 wmi-1.3.14]# |
試しに、情報を取得してみます。
Windowsの情報を取得
1 2 3 4 5 6 7 8 9 10 11 12 |
# ./Samba/source/bin/wmic -U username%password //192.168.29.40 "Select * From Win32_ComputerSystem" CLASS: Win32_ComputerSystem AdminPasswordStatus|AutomaticResetBootOption|AutomaticResetCapability|BootOptionOnLimit|BootOptionOnWatchDog|BootROMSupported|BootupState|Caption|ChassisBootupState|CreationClassName|CurrentTimeZone| DaylightInEffect|Description|Domain|DomainRole|EnableDaylightSavingsTime|FrontPanelResetStatus|InfraredSupported|InitialLoadInfo|InstallDate|KeyboardPasswordStatus|LastLoadInfo|Manufacturer|Model|Name| NameFormat|NetworkServerModeEnabled|NumberOfLogicalProcessors|NumberOfProcessors|OEMLogoBitmap|OEMStringArray|PartOfDomain|PauseAfterReset|PowerManagementCapabilities|PowerManagementSupported| PowerOnPasswordStatus|PowerState|PowerSupplyState|PrimaryOwnerContact|PrimaryOwnerName|ResetCapability|ResetCount|ResetLimit|Roles|Status|SupportContactDescription|SystemStartupDelay|SystemStartupOptions| SystemStartupSetting|SystemType|ThermalState|TotalPhysicalMemory|UserName|WakeUpType|Workgroup 1|True|True|3|3|True|Normal boot|XP-VMCLIENT|3|Win32_ComputerSystem|540|False|AT/AT COMPATIBLE|NSB-LAN|0|True|3|False|NULL|(null)|3|(null)|VMware, Inc.|VMware Virtual Platform|XP-VMCLIENT|(null)|True|3|1| NULL|([MS_VM_CERT/SHA1/27d66596a61c48dd3dc7216fd715126e33f59ae7],Welcome to the Virtual Machine)|False|3932100000|NULL|False|0|0|3|(null)|his|1|-1|-1| (LM_Workstation,LM_Server,NT,Potential_Browser,Backup_Browser,Master_Browser)|OK|NULL|30|("Microsoft Windows XP Professional" /noexecute=optin /fastdetect)|0|X86-based PC|3|3220676608|XP-VMCLIENT\j-masuda|6| (null) |
1 2 3 4 5 6 7 8 9 10 |
# ./Samba/source/bin/wmic -U username%password //192.168.29.40 "Select * From Win32_Process where Caption='EpgTimerSrv.exe'" CLASS: Win32_Process Caption|CommandLine|CreationClassName|CreationDate|CSCreationClassName|CSName|Description|ExecutablePath|ExecutionState|Handle|HandleCount|InstallDate|KernelModeTime|MaximumWorkingSetSize| MinimumWorkingSetSize|Name|OSCreationClassName|OSName|OtherOperationCount|OtherTransferCount|PageFaults|PageFileUsage|ParentProcessId|PeakPageFileUsage|PeakVirtualSize|PeakWorkingSetSize|Priority| PrivatePageCount|ProcessId|QuotaNonPagedPoolUsage|QuotaPagedPoolUsage|QuotaPeakNonPagedPoolUsage|QuotaPeakPagedPoolUsage|ReadOperationCount|ReadTransferCount|SessionId|Status|TerminationDate|ThreadCount| UserModeTime|VirtualSize|WindowsVersion|WorkingSetSize|WriteOperationCount|WriteTransferCount EpgTimerSrv.exe|C:\wintool\HDP2\EpgDataCap_Bon\EpgTimerSrv.exe|Win32_Process|20140125092622.282684+540|Win32_ComputerSystem|XP-VMCLIENT|EpgTimerSrv.exe|C:\wintool\HDP2\EpgDataCap_Bon\EpgTimerSrv.exe|0|11484| 115|(null)|773593750|1413120|204800|EpgTimerSrv.exe|Win32_OperatingSystem|Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1|9817532|161060012|174899|23060480|1020|31715328|78991360| 35393536|8|23060480|11484|4808|65884|6256|70172|36078|76863544|0|(null)|(null)|11|713750000|76890112|5.1.2600|27054080|974246|225966796 [root@zabbix2 wmi-1.3.14]# |
特定のプロセスの情報を取得(値の行のみ)
1 2 3 4 |
# wmic -U username%password //192.168.29.40 "Select * From Win32_Process where Caption='EpgTimerSrv.exe'" | tail -n +3 EpgTimerSrv.exe|C:\wintool\HDP2\EpgDataCap_Bon\EpgTimerSrv.exe|Win32_Process|20140125092622.282684+540|Win32_ComputerSystem|XP-VMCLIENT|EpgTimerSrv.exe|C:\wintool\HDP2\EpgDataCap_Bon\EpgTimerSrv.exe|0|11484| 114|(null)|889218750|1413120|204800|EpgTimerSrv.exe|Win32_OperatingSystem|Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1|11744618|191886458|212378|25841664|1020|32411648|78991360| 36548608|8|25841664|11484|4648|65852|6256|70172|45978|111959645|0|(null)|(null)|9|822812500|74792960|5.1.2600|29843456|1082336|259218725 |
動作確認したら、インストールします。
1 2 3 |
# make istall # whereis wmic wmic: /bin/wmic |
RPMもあるっぽい(けど、まだ試していません)
http://www.harumaki.net/2012/05/09/centos%E3%81%ABwmi%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%82%8B/
ちなみに、ファイルの情報を取得する場合は以下の様にします。
1 2 3 4 |
# wmic -U username%password //192.168.29.40 "Select * From CIM_DataFile Where Name = 'c:\\\temp\\\test.txt'" CLASS: CIM_DataFile AccessMask|Archive|Caption|Compressed|CompressionMethod|CreationClassName|CreationDate|CSCreationClassName|CSName|Description|Drive|EightDotThreeFileName|Encrypted|EncryptionMethod|Extension|FileName|FileSize|FileType|FSCreationClassName|FSName|Hidden|InstallDate|InUseCount|LastAccessed|LastModified|Manufacturer|Name|Path|Readable|Status|System|Version|Writeable 18809343|True|c:\temp\test.txt|False|(null)|CIM_LogicalFile|20140126190415.202647+540|Win32_ComputerSystem|XP-VMCLIENT|c:\temp\test.txt|c:|c:\temp\test.txt|False|(null)|txt|test|0|テキスト ドキュメント|Win32_FileSystem|NTFS|False|20140126190415.202647+540|0|20140126190415.202647+540|20140126190415.202647+540|(null)|c:\temp\test.txt|\temp\|True|OK|False|(null)|True |
なぜか、\ -> \\\に変換しないと、エラーになります(\\ではダメ)。
それと、ファイルパスに2バイト文字を含むような場合も失敗しますが、こちらはまだ未解決。
フォルダ単位で各ファイル全部をWMIで取得して後からGrepで文字列抽出するのならいけましたが、とりあえずこれで。
なお、接続先がWindows Vista,2008以降だとセキュリティーがきびしくなっているので、
UACを無効にするか、ローカルのAdministratorもしくは、管理者権限を持ったドメインユーザで接続する必要があるようです。
UACはGUIで設定するか、レジストリを変更して再起動します。
1 2 3 |
HKLM¥SOFTWARE¥Microsoft¥Windows¥CurrentVersion¥Policies¥System\EnableLUA DWORD:0 |
UACを無効にできるのであれば一番早いですが、そのままだと管理者権限を持ったローカルユーザで接続しても接続を拒否られる場合は、以下のレジストリを作成・変更してみてください。
再起動は不要らしいです。
1 2 3 |
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy DWORD:1 |
その他接続できない場合は次の点を確認してみてください。
(Administratorsグループのユーザであれば、Firewall以外はデフォルトでは大丈夫なはずですが・・・)
・Firewallの設定
WindowsFireWallが有効の場合は以下の項目を有効にします。
[標準プロファイル]or[ドメインプロファイル]
・[Windowsファイアウォール:リモート管理の例外を許可する](2003)
・[Windowsファイアウォール:着信リモート管理の例外を許可する](2008以降)
・サービスの起動確認
Windows Management Instrumentationサービス(サービス名:WinMgmt)が
起動しているかの確認
・DCOMのアクセス権限(接続元)
dcomcnfg.exeを起動し、
コンポーネントサービス->コンピュータ->マイコンピュータのプロパティーを開き、
・[既定のプロパティ]タブを選択して,[このコンピュータ上で分散COMを有効にする]が
チェックされているか確認する。
・DCOMのアクセス権限(接続先)
dcomcnfg.exeを起動し、
コンポーネントサービス->コンピュータ->マイコンピュータのプロパティーを開き、
・[既定のプロパティ]タブを選択して,[このコンピュータ上で分散COMを有効にする]が
チェックされているか確認する。
・[COMセキュリティ]タブを選択して、[制限の編集]から接続ユーザで
アクセス許可されているかを確認する。
・WMIの名前空間のセキュリティーの確認
wmimgmt.mscを起動し、WMIコントロールでプロパティーを表示し、
セキュリティタブのRoot->CIMV2のセキュリティーを確認します。
接続ユーザでアクセス許可されていることを確認します。
どうしてもうまくいかない場合でUACのセキュリティ機能が有効の場合は、
ユーザー自身に対して設定するか、
UsersグループとAdministratorsグループ以外のユーザーが属するグループに対して
設定してみてください。
なお、一緒に、winexeというツールもインストールされます。
これは、Linux側のコマンドラインからWindows上でプログラムを実行するものです。
基本的には、以下のコマンド実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# winexe -U username%password //192.168.29.40 "ipconfig" Windows IP Configuration Ethernet adapter ローカル エリア接続 5: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.168.29.40 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.29.1 Ethernet adapter ローカル エリア接続 7: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.168.30.40 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : |
ただ、実行時以下のようにエラーが出ることがあります。
1 |
[winexe/winexe.c:120:on_ctrl_pipe_error()] ERROR: Failed to install service winexesvc - NT code 0x00000424 |
その場合は、対象のWindows側で、以下のコマンドを実行しておけばよいようです。(参考:http://community.zenoss.org/people/chitambira/blog)
1 2 |
sc create winexesvc binPath= C:\WINDOWS\WINEXESVC.EXE start= auto DisplayName= winexesvc sc description winexesvc "Remote command provider for Zenoss monitoring" |
ちなみにこれ、バグだそうで、
winexe/service.c ファイルの以下の部分を修正して、
再度make&make installすれば治るようです。
1 2 3 |
#define NT_STATUS_SERVICE_DOES_NOT_EXIST NT_STATUS(0xc0000424) ↓ #define NT_STATUS_SERVICE_DOES_NOT_EXIST NT_STATUS(0x00000424) |
実際やってみたら、ちゃんと自動でWindows側にサービスが登録され、リモート実行できるようになりました。
また、以下のようにメッセージが出た場合は、
1 |
ERROR: Failed to install service winexesvc - NT_STATUS_UNSUCCESSFUL |
いったん、次のコマンドを入れると解決できる場合もあるそうです
1 |
sc delete winexesvc |
なお、上記winexeはバージョン0.80ですが、、最新版(1.00)が出ているんので、必要があればこちらを
http://sourceforge.net/projects/winexe/files/
インストール方法はこちらを参考に