NePo
Lapkritis 15, 2006

Pažintis su WMI

WMI reiškia Windows Management Instrumentation, kas aiškinant moksliškai turėtų būti DMFT (Distributed Management Task Force) organizacijos WBEM (Web-Based Enterprise Management ) standarto realizacija. Kalbant liaudiškai, tai galingas įrankis, dirbant Windows operacinėje sistemoje.

WMI yra kuriamas nuo Windows NT 4.0 ir kiekviena nauja sistema papildoma naujomis funkcijomis. Windows 2000 WMI tiekėjas (provider) buvo labai nestabilus ir dažnai lūždavo, tuo tarpu Windows XP ir Windows 2003 jis pagaliau tapo normaliu darbo įrankiu.
Dirbant su WMI reikia rašyti WQL (WMI Query Language) užklausas, kurių sintaksė labai panaši į SQL. Įvykdžius užklausą veiksmai labai panašūs į duomenų paimtų iš duomenų bazės apdorojimą.

Kodėl man prireikė WMI? Atsimenate, aš aiškinau kaip susikurti savo Task Manager ? Jeigu atidžiai skaitėte straipsnį galėjote pastebėti, kokių nuostabių galimybių suteikia Process klasė. Tačiau, jeigu būtumėte uždavę teisingus klausimus, pastebėtumėt jos trūkumus. Teisingi klausimai:

  • 1. Kas yra proceso autorius/savininkas?
  • 2. Koks yra proceso tėvo id?
  • Deja, Process klasė negali atsakyti į šiuos klausimus, norėdami atsakyti į juos turėsime į pagalbą pasitelkti WMI.

    Standartiškai projektui naudosiu dataGridView komponentą, o visą kodą surašysiu į formos konstruktorių. Kad galėtume dirbti su WMI reikia įtraukti System.Management, kuri nėra standartiškai įtraukta, todėl teks pasinaudoti meniu mygtuku “Add Reference“.
    Jeigu pavyko susitvarkyti, parašykim truputį kodo:

    ManagementObjectCollection queryCollection;
    ManagementObjectSearcher query;
    query = new ManagementObjectSearcher("Select * from Win32_Process ");
    queryCollection = query.Get();

    Šiuo kodu aš apsirašiau užklausą ir objektą queryCollection, kuriame bus saugomi visi gauti duomenys. Dabar reiktų gautus duomenis ištraukti ir pateikti vartotojui:

    foreach (ManagementObject mo in queryCollection)
    {
    string parentid, processid, user, name;
    parentid = mo["ParentProcessId"].ToString();
    processid = mo["ProcessId"].ToString();
    name = mo["Name"].ToString();
    try
    {
    string[] o = new String[2];
    mo.InvokeMethod("GetOwner", (object[])o);
    user = o[0].ToString();
    }
    catch {
    user = "";
    }
    dataGridView1.Rows.Add(processid, name, user, parentid);
    }

    Šiuo ciklu iš queryCollection ištraukiu ManagementObject tipo kintamąjį, kuriame ir saugoma visa mane dominanti informacija.
    Try ir catch šiame kode naudojama todėl, kad System Idle Process neturi savininko/jį sukūrusio proceso, taigi vykdant užklausą programa lūžta. Tikiuosi artimiausiu laiku pasirodys atskiras straipsnis Pixel.lt, kuriame galėsite daugiau sužinoti apie try catch naudojimą.
    Norėčiau atkreipti dėmesį, jog GetOwner nėra savybė, kaip kad ProccesId, o metodas, todėl šių duomenų gavimas atrodo šiek tiek sudėtingesnis nei kitų.

    Rodos ir viskas ką norėjau papasakoti šį kartą, bet pabaigai dar vienas triukas. Kaip jau minėjau WQL labai panaši į SQL, todėl jeigu norėtumėte paimti informaciją apie vieną konkretų procesą užtektų užrašyti tokią užklausą:

    query = new ManagementObjectSearcher("Select * from Win32_Process Where ProcessID = '" + processId + "'");

    processId - čia, savaime suprantama, yra jūsų nurodyto proceso id.

    Daugiau informacijos pasiskaitimui:
    Wikipedia apie WMI
    WMI - Microsoft puslapis.
    WMI Code Creator v1.0 - labai naudinga programa, norintiems dirbti su WMI

    Parsisiuntimui - programa, kurią jūs galite susikurti pagal šią instrukciją.

    Panašūs straipsniai


    “Pažintis su WMI” komentarų: 1

    1. dotarull

      [*map/map_cn_sd4_mordy.txt||10||r||1|| @]

    Rašyti komentarą

    Jūs privalote prisijungti jeigu norite rašyti komentarą.