(เขียนเมื่อ 2008-08-15 01:15:16 +0700)

ขึ้นหัวข้อมาเหมือนจะเขียนโปรแกรมบน Windows เลยเนอะครับ จริงๆ แล้ว โค๊ดรอบนี้ จะทำงานได้เฉพาะบน Windows เท่านั้นแหละครับ เรื่องของเรื่องก็คือบังเอิญได้ไปอ่านหนังสือ Windows Power Shell แล้วไปเจอเรื่อง Windows Management Instrumentation (WMI) ซึ่งเป็น Class ที่สามารถดึงรายละเอียดทุกๆ อย่างของ Windows ออกมาได้ทั้งหมด แล้วใน PHP ก็สามารถติดต่อกับ Windows โดยผ่าน Class ที่ชื่อว่า Com() ด้วยสิ…. สนุกล่ะสิ

ในตัว WMI ผมไม่ขออธิบายนะครับ แต่สามารถอ่านได้จาก MSDN ในเว๊ป Microsoft หรือ คลิกเบาๆ ทีี่นี่เลยครับ (http://msdn.microsoft.com/en-us/library/aa394582(VS.85).aspx)

ผมจะอธิบายการเก็บค่าของ WMI สักนิดก่อนนะครับ ตัว WMI จะมีชื่อ Class ภายใน Class ก็จะประกอบด้วย property และ value ของแต่ละ property แบบตัวอย่างนี้ครับ

class Win32_Processor : CIM_Processor
{
  uint16 AddressWidth;
  uint16 Architecture;
  uint16 Availability;
  string Caption;
  uint32 ConfigManagerErrorCode;
  boolean ConfigManagerUserConfig;
  uint16 CpuStatus;
  string CreationClassName;
  uint32 CurrentClockSpeed;
  uint16 CurrentVoltage;
  uint16 DataWidth;
  string Description;
  string DeviceID;
  boolean ErrorCleared;
  string ErrorDescription;
  uint32 ExtClock;
  uint16 Family;
  datetime InstallDate;
  uint32 L2CacheSize;
  uint32 L2CacheSpeed;
  uint32 L3CacheSize;
  uint32 L3CacheSpeed;
  uint32 LastErrorCode;
  uint16 Level;
  uint16 LoadPercentage;
  string Manufacturer;
  uint32 MaxClockSpeed;
  string Name;
  uint32 NumberOfCores;
  uint32 NumberOfLogicalProcessors;
  string OtherFamilyDescription;
  string PNPDeviceID;
  uint16 PowerManagementCapabilities[];
  boolean PowerManagementSupported;
  string ProcessorId;
  uint16 ProcessorType;
  uint16 Revision;
  string Role;
  string SocketDesignation;
  string Status;
  uint16 StatusInfo;
  string Stepping;
  string SystemCreationClassName;
  string SystemName;
  string UniqueId;
  uint16 UpgradeMethod;
  string Version;
  uint32 VoltageCaps;
};

จะเห็นได้ว่า ค่าที่ต้องใช้คือ ชื่อ Class และ Property ที่เราต้องการ ดังนั้นผมก็เลยออกแบบ Class ใน PHP ได้ดังนี้

 <?php 	// phpwmi.class.php
class PHPWMI { 		// สร้างตัวแปรเก็บ Windows Management Instrumentation
private $wmi;
public function __construct() {
$objWindows = new COM("WbemScripting.SWbemLocator");
$this->wmi = $objWindows->ConnectServer();
		}

		// รับค่าจาก Windows Management Instrumentation
		public function getWMI($strClass, $strValue = array()) {
			// strClass เป็นตัวเลือก strValue เลือกค่าที่จะนำมาแสดง

			$obj = $this->wmi->GET($strClass);
			$arrProp = $obj->Properties_;
			$arrInst = $obj->Instances_();

			foreach ($arrInst as $instItem) {
				$temp = array();
				foreach ($arrProp as $propItem) {
					eval("\$value = \$instItem->" . $propItem->Name . ";");
					if (in_array($propItem->Name, $strValue)) {
						$temp[$propItem->Name] = $value;
					}
				}
			}
			return $temp;
		}
	}
?> 

Class PHPWMI ที่เราสร้างขึ้น ประกอบด้วย Constructor ที่จะทำการติดต่อไปยัง WMI เมื่อเราทำการสร้าง Object ขึ้นมา และ Method ชื่อว่า getWMI ที่ต้องส่งค่าไป 2 ค่าคือ WMI Class name และ Property ของ Class นั้น (เปิดดูจาก MSDN โลดครับ) ส่วนวิธีการเรียกใช้นั้น ก็ดูตัวอย่างโค๊ดนี้ได้เลยครับ

<?php
   require_once('phpwmi.class.php');
   // สร้าง obj ชื่อ wmi
   $wmi = new PHPWMI(); 	// สร้างตัวแปร cpu รับค่าจาก Class ชื่อ Win32_Processor
   $cpu = $wmi->getWMI("Win32_Processor", array("Name", "L2CacheSize", "CurrentClockSpeed", "ExtClock", "NumberOfCores"));
   print_r($cpu);
?>

WMI

ถ้าผลลัพท์ที่ได้เหมือนกัน แสดงว่าใจเราตรงกันแล้วล่ะครับ คริกๆๆๆๆๆๆ

ถ้าเรานำค่าออกมาได้แบบนี้ แสดงว่าเราก็สามารถเขียนโปรแกรมที่แสดงรายละเอียดของเครื่องได้ทั้งหมดเลย

wmi

ข้างบนนี้เป็นรูปนะครับ ส่วนโค๊ดของโปรแกรม ก็ทำการแก้ไขนิดหน่อย ก็ได้แบบนี้ล่ะครับ เพื่อนๆ ลองเอาไปเล่นดูกันได้เลย หรือจะไปประยุคใช้กันก็ได้ไม่ว่ากันครับ แต่ว่ามันทำงานได้เฉพาะบน Windows เท่านั้นนะครับ ส่วนระบบปฏิบัติการอื่นๆ เดี๋ยวค่อยมาว่ากันวันหลังครับ

<?php
    // ไฟล์ชื่อ phpwmi.class.php

    class PHPWMI {
        // สร้างตัวแปรเก็บ Windows Management Instrumentation
        private $wmi;

        public function __construct() {
            $objWindows = new COM("WbemScripting.SWbemLocator");
            $this->wmi = $objWindows->ConnectServer();
        }

        // รับค่าจาก Windows Management Instrumentation
        public function getWMI($strClass, $strValue = array()) {
            // strClass เป็นตัวเลือก strValue เลือกค่าที่จะนำมาแสดง
            $data = array();

            $obj = $this->wmi->GET($strClass);
            $arrProp = $obj->Properties_;
            $arrInst = $obj->Instances_();

            foreach ($arrInst as $instItem) {
                $temp = array();
                foreach ($arrProp as $propItem) {
                    eval("\$value = \$instItem->" . $propItem->Name . ";");
                    if (in_array($propItem->Name, $strValue)) {
                        $temp[$propItem->Name] = $value;
                    }
                }
                $data[] = $temp;
            }
            return $data;
        }
    }
?>

<?php
    header('Content-type: text/html; charset="utf-8"');

    require_once('phpwmi.class.php');
    // สร้าง obj ชื่อ wmi
    $wmi = new PHPWMI();
    // สร้างตัวแปร cpu รับค่าจาก Class ชื่อ Win32_Processor
    echo "<h1>คุณใช้ระบบปฏิบัติการ</h1>";
    $data = $wmi->getWMI("Win32_OperatingSystem", array("Version", "ServicePackMajorVersion","Caption","WindowsDirectory","TotalVisibleMemorySize","FreePhysicalMemory"));

    echo "<ul>";
    echo "    <li>OS :: " . $data[0]['Caption'] . "</li>";
    echo "    <li>Version :: " . $data[0]['Version'] . "</li>";
    echo "    <li>Service Pack :: SP" . $data[0]['ServicePackMajorVersion'] . "</li>";
    echo "    <li>เก็บไว้ที่ :: " . $data[0]['WindowsDirectory'] . "</li>";
    echo "</ul>";

    echo "<h1>หน่วยความจำในระบบ</h1>";
    echo "<ul>";
    echo "    <li>หน่วยความจำทั้งหมด :: " . number_format($data[0]['TotalVisibleMemorySize'] / 1024 / 1024 ,2) . " GB</li>";
    echo "    <li>หน่วยความจำที่ว่าง :: " . number_format($data[0]['FreePhysicalMemory'] / 1024 / 1024 ,2) . " GB</li>";
    echo "    <li>หน่วยความจำที่ใช้งาน :: " . number_format(($data[0]['TotalVisibleMemorySize'] - $data[0]['FreePhysicalMemory']) / 1024 / 1024 ,2) . " GB</li>";
    echo "</ul>";

    $data = $wmi->getWMI("Win32_Processor", array("Name", "L2CacheSize", "CurrentClockSpeed", "ExtClock", "NumberOfCores","Manufacturer","NumberOfLogicalProcessors"));

    echo "<h1>หน่วยประมวลผล</h1>";
    echo "<ul>";
    echo "    <li>ผู้ผลิต :: " . $data[0]['Manufacturer'] . "</li>";
    echo "    <li>รุ่น :: " . $data[0]['Name'] . "</li>";
    echo "    <li>Physical Core :: " . $data[0]['NumberOfCores'] . "</li>";
    echo "    <li>Logical Core :: " . $data[0]['NumberOfLogicalProcessors'] . "</li>";
    echo "    <li>ความเร็ว :: " . $data[0]['CurrentClockSpeed'] . " MHz</li>";
    echo "    <li>ความเร็วบัส :: " . $data[0]['ExtClock'] . " MHz</li>";
    echo "    <li>ตัวคูณ :: " . number_format($data[0]['CurrentClockSpeed'] / $data[0]['ExtClock'],1) . "</li>";
    echo "    <li>แคช L2 :: " . $data[0]['L2CacheSize'] . " KB</li>";
    echo "</ul>";

    $data = $wmi->getWMI("Win32_LogicalDisk", array("Name", "Size", "FreeSpace", "FileSystem", "DriveType", "MediaType"));

    $driveType = array("Unknown", "No Root Directory","Removable Disk","Local Disk","Network Drive","Compact Disc","RAM Disk");
    $mediaType = array("Format is unknown","5 1/4-Inch Floppy Disk - 1.2 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 1.44 MB -512 bytes/sector","3 1/2-Inch Floppy Disk - 2.88 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 20.8 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 720 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 360 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 320 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 320 KB - 1024 bytes/sector","5 1/4-Inch Floppy Disk - 180 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 160 KB - 512 bytes/sector","Removable media other than floppy","Fixed hard disk media","3 1/2-Inch Floppy Disk - 120 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 640 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 640 KB - 512 bytes/sector","5 1/4-Inch Floppy Disk - 720 KB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 1.2 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 1.23 MB - 1024 bytes/sector","5 1/4-Inch Floppy Disk - 1.23 MB - 1024 bytes/sector","3 1/2-Inch Floppy Disk - 128 MB - 512 bytes/sector","3 1/2-Inch Floppy Disk - 230 MB - 512 bytes/sector","8-Inch Floppy Disk - 256 KB - 128 bytes/sector");

    echo "<h1>รายละเอียดดิส</h1>";

    echo "<table width='100%' border='1' cellspacing='1' cellpadding='1'>";
    echo "  <tr>";
    echo "    <th scope='col'>Drive</th>";
    echo "    <th scope='col'>File System</th>";
    echo "    <th scope='col'>Paratition</th>";
    echo "    <th scope='col'>ชนิด</th>";
    echo "    <th scope='col'>ขนาด</th>";
    echo "    <th scope='col'>เนื้อที่ว่าง</th>";
    echo "    <th scope='col'>ใช้ไป</th>";
    echo " </tr>";
    foreach ($data as $value) {
        echo "  <tr>";
        echo "    <td align='center'>" . $value['Name'] . "</td>";
        echo "    <td align='center'>" . $value['FileSystem'] . "</td>";
        echo "    <td>" . $driveType[$value['DriveType']] . "</td>";
        echo "    <td>" . $mediaType[$value['MediaType']] . "</td>";
        echo "    <td>" . number_format($value['Size']/1024/1024/1024,2) . " GB</td>";
        echo "    <td>" . number_format($value['FreeSpace']/1024/1024/1024,2) . " GB </td>";
        echo "    <td>" . number_format(($value['Size'] - $value['FreeSpace'])/1024/1024/1024,2) . " GB</td>";
        echo "  </tr>";
    }
    echo "</table>";
?>

Comments

จำนวนความเห็น