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