26 Februari 2009

Windows Management Instrumentation (WMI)

Susah banget yah dapetin MAC address atau info prosesor atau mungkin info tentang hardware yang lain. Kalo ga mau susah, ada cara lain lagi. Pada sistem operasi Windows ada sebuah service yaitu Windows Management Instrumentation (WMI). Dengan WMI, kita bisa mendapatkan info tentang hardware dari komputer kita. Tidak hanya itu kita bisa juga memperoleh info tentang siapa saja user/group, service yang ada, info sistem operasi yang dipakai, dan lain-lain seperti yang ada pada System Information-nya windows. Dengan WMI, mendapatkan info tentang berbagai macam hardware di komputer kita akan lebih mudah dan simpel. Penjelasan detail tentang apa itu WMI dan apa saja fungsinya bisa dilihat di http://msdn.microsoft.com.
Sedikit gambaran tentang WMI, jika sistem operasinya adalah Windows XP maka jalankan perintah wmic pada command prompt, maka akan muncul prompt seperti: “wmic: root\cli>”. Setelah muncul prompt tersebut, kita bisa mendapatkan info apa saja tentang komputer. Misal untuk mendapatkan info tentang prosesor ketikkan perintah “cpu” (tanpa tanda petik) pada prompt. Untuk mendapatkan list perintah apa saja yang didukung, ketikkan perintah “/?” pada prompt (tanpa tanda petik). Sedangkan untuk keluar ketik “exit”.
Supaya dapat menjalankan fungsi ini dibutuhkan WMI core yang sudah terinstall pada PC. Sistem operasi mulai Windows 2000 dan XP sudah ada secara default, sedangkan yang Windows 98 musti download dulu dari websitenya Microsoft. Langkah pertama adalah mengimport WMI scripting library. Setelah diimport, akan muncul file yang bernama “WbemScripting_TLB.pas”. Kemudian tinggal pakai saja pada program yang mengakses WMI. Dibawah ini adalah sebuah contoh pemakain WMI pada program.
uses WbemScripting_TLB, ActiveX, Variants;

function GetWMIstring(wmiHost, wmiClass, wmiProperty: string): string;
var
  Locator: ISWbemLocator;
  Services: ISWbemServices;
  SObject: ISWbemObject;
  ObjSet: ISWbemObjectSet;
  SProp: ISWbemProperty;
  Enum: IEnumVariant;
  Value: Cardinal;
  TempObj: OleVariant;
  s: string;
begin
  Result := '';
  try
    Locator := CoSWbemLocator.Create; // Create the Location object
    // Connect to the WMI service, with the root\cimv2 namespace
    Services := Locator.ConnectServer(wmiHost, 'root\cimv2', '', '', '', '', 0, nil);
    ObjSet := Services.ExecQuery('SELECT * FROM ' + wmiClass, 'WQL',
      wbemFlagReturnImmediately and wbemFlagForwardOnly , nil);
    Enum := (ObjSet._NewEnum) as IEnumVariant;
    while Enum.Next(1, TempObj, Value) = S_OK do
    begin
      try
        SObject := IUnknown(TempObj) as ISWBemObject;
      except
        SObject := nil;
      end;
      TempObj := Unassigned; // Always need to free interface in TempObj
      if SObject <> nil then
      begin
        SProp := SObject.Properties_.Item(wmiProperty, 0);
        s := SProp.Get_Value;
        if not VarIsNull(s) then
        begin
          Result := s;
          Break;
        end;
      end;
    end;
  except
    // Trap any exceptions (Not having WMI installed will cause one!)
  end;
end;
Cara memanggilnya adalah seperti berikut:
GetWMIstring('', 'Win32_Processor', 'ProcessorId')
Parameter wmiHost diisi kosong untuk akses ke PC lokal, “Win32_Processor” adalah class yang kita akses, dan “ProcessorId” adalah properti yang ingin kita dapatkan. Pada websitenya, Microsoft mempunyai referensi lengkap tentang class dan properti, juga event dan method yang dapat dilihat di http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/r_wmicls_6r6t.asp.

1 komentar:

  1. Mas.. Saya Mau tanya apakah ada cara script sql server 2000 utk mengetahui IP Address dari User yang memakai Thin Client. Karena Selama ini saya pakai Audit Trail dengan @@Spid gak masalah karena pakai PC, tp dikantor semua dirubah pakai thin client utk Usernya..jadi yang terbaca hanya IP Address dari komputer servernya saja.. atau apakah ada perintah dari WMI yang mengetahui tentang IP Address Thin Client. Thanks atas bantuannya

    BalasHapus