Új WMI osztály létrehozása

A WMI objektumokat felhasználhatjuk Group Policy Objektumok szűrésére, azaz köthetjük bizonyos jellemzők meglétéhez a csoportos házirendek érvényességét akár felhasználók vagy gépek számára. Például csak laptopokra akarjuk az adott házirendet kiterjeszteni. Hasonló célokra felhasználhatók a WMI objektumok a Microsoft System Center Configuration Manager gépgyűjteményei (collection) lekérdezés-alapú összeállítására.

Azonban lehet olyan helyzet, amikor ez a jellemző nincs benne a WMI-ben, viszont akár bele tudnánk tenni ezt oda. Érdemes lehet ilyenkor a saját, egyedi WMI objektumainknak külön névteret létrehozni, hogy ne keveredjenek és esetlegesen ütközzenek más gyártók objektumaival.

Az alábbi függvény a következőket végzi el nekünk:

Ha olyan névteret adunk meg az új WMI osztály létrehozására, ami még nincs, akkor létrehozza azt.

Új, egyedi osztályt hoz létre a megadott névtérben.

Egy hashtábla alapján létrehozza az osztály tulajdonságait.

Function New-STWMIClass {

    param(

        [parameter(Mandatory = $true)] [string] $Name,

        [hashtable[]]$PropertyHashArray,

        $NameSpace = "root\cimv2"

    )

 

    $namespaceroot, $namespacename = $NameSpace -split "\\(?!.*\\)"

   

    if(!(Get-WmiObject -Namespace $namespaceroot -Class __NAMESPACE -Filter "Name = '$namespacename'")){

        $NameSpaceInstance = ([WMICLASS]"\\.\$($namespaceroot):__Namespace").CreateInstance()

        $NameSpaceInstance.name = $namespacename

        $NameSpaceInstance.put()

    }

 

     $Class = [System.Management.ManagementClass]::new($NameSpace)

    $Class.Name = $Name

 

    foreach($PropertyHash in $PropertyHashArray){

        if($PropertyHash.keys.count){

             $Class.Properties.Add($PropertyHash.Name, [System.Management.CimType]::($PropertyHash.Type), $PropertyHash.IsArray)

             if($PropertyHash.IsKey){

                $Class.Properties[$PropertyHash.Name].Qualifiers.Add('key', $PropertyHash.IsKey)

            }

             $Class.Properties[$PropertyHash.Name].Qualifiers.Add('read', [bool] $PropertyHash.Read)

            $Class.Properties[$PropertyHash.Name].Qualifiers.Add('write', [bool] $PropertyHash.write)

        }

    }

 

     $Class.Put()

}

A WMI osztály tulajdonságait a függvénybe egy hashtáblákból álló tömbbel lehet megadni. Példaként álljon itt a Root\Cimv2 alatt létrehozott Sajat névtérben definiált MyClass3 osztályt eredményező kifejezés:

New-STWMIClass -NameSpace root\cimv2\Sajat -Name MyClass3 -PropertyHash @{Name = "Prop1"; Type = "String"; IsKey = $true; Read = $true},

                                            @{Name = "Prop2"; Type = "UInt16"; Read = $true; Write = $true; IsArray = $true}

Ennek az osztálynak két tulajdonsága van, a Prop1, ami szöveges típusú és egyértelműen azonosítja majd az osztály objektumait (IsKey = $true) és csak olvasható. A másik tulajdonság a Prop2, ami 2 bájtos előjel nélküli egész, írható és olvasható is, valamint tömb típusú, azaz több számot is lehet tárolni ott.

Ezután már a „gyári” New-CimInstance  cmdlettel létre lehet hozni az új osztályunk egy elemét:

New-CimInstance -ClassName MyClass3 -Key Kakukk -Property @{Prop1 = "valami"; Prop2 = [uint16[]] (1,2,3)} -Namespace root\cimv2\Sajat

Természetesen ki is olvashatjuk ezt az objektumot:

PS C:\> Get-CimInstance -ClassName MyClass3 -Namespace root\cimv2\sajat

 

Prop1  Prop2     PSComputerName

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

valami {1, 2, 3}

És át is írhatjuk a tulajdonságot:

PS C:\> $y = Get-WmiObject -Class MyClass3 -Namespace root\cimv2\sajat

PS C:\> $y.Prop2 = @(4,5)

PS C:\> $y.Put()

 

 

Path          : \\localhost\root\cimv2\sajat:MyClass3.Prop1="valami"

RelativePath  : MyClass3.Prop1="valami"

Server        : localhost

NamespacePath : root\cimv2\sajat

ClassName     : MyClass3

IsClass       : False

IsInstance    : True

IsSingleton   : False

És újra kiolvasva (most a Get-WMIObject-el):

PS C:\> Get-WmiObject -Class MyClass3 -Namespace root\cimv2\sajat

 

 

__GENUS          : 2

__CLASS          : MyClass3

__SUPERCLASS     :

__DYNASTY        : MyClass3

__RELPATH        : MyClass3.Prop1="valami"

__PROPERTY_COUNT : 2

__DERIVATION     : {}

__SERVER         : STLENO

__NAMESPACE      : ROOT\cimv2\sajat

__PATH           : \\STLENO\ROOT\cimv2\sajat:MyClass3.Prop1="valami"

Prop1            : valami

Prop2            : {4, 5}

PSComputerName   : STLENO



Word To HTML Converter