Jump to content

WMI Filter per GPO / msWMI-Parm2


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hi,

 

ich bin grade dabei WMI Filter per GPO zu erstellen. Dabei nutze ich größtenteils dieses Script bzw. die relevanten Parts daraus: http://www.jhouseconsulting.com/2014/06/09/script-to-create-import-and-export-group-policy-wmi-filters-1354

Nachdem ich die CSV und den Import angepasst habe funktioniert das Script auch bis auf das der Namespace sowie die Abfrage im WMI Filter erstellt wurden. Daraufhin habe ich einen WMI Filter von Hand angelegt und mir die relevanten Parts im ADSI Editor angesehen. Dabei sieht der msWMI-Parm2 folgendermaßen aus <Zahl1>;<Zahl2>;<Zahl3>;<Zahl4>;WQL;<Namespace>;<Query>. Das Script importiert nach meinen Anpassungen lediglich <Namespace>;<Query>.

 

Jetzt die Frage: Gibt es eine Info, wie sich die vorausstehenden Zahlen generieren bzw. was die tun? Erste Tests von mir haben ergeben, dass Zahl1 eigentlich immer 1, Zahl2 immer 3 und Zahl3 immer 10 ist. Die vierte Zahl ändert sich je nach Filter:

  • Win32_ComputerSystem -> Zahl4 53
  • Win32_OperatingSystem -> Zahl4 57
  • Win32_OperatingSystemSKU -> Zahl4 244

 

Der Vollständigkeithalber hier noch der Code mit meinen Anpassungen und eine Beispiel CSV (Wobei mir hier jetzt auffällt ich habe eher die CSV wie den Code angepasst):

# http://www.jhouseconsulting.com/2014/06/09/script-to-create-import-and-export-group-policy-wmi-filters-1354
$key = Get-Item HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -ErrorAction SilentlyContinue
if (!$key) {
	New-Item HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -ItemType RegistryKey | Out-Null
}
$kval = Get-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -ErrorAction SilentlyContinue
if (!$kval) {
	New-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -Value "1" -PropertyType DWORD | Out-Null
} else {
	Set-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -Value "1" | Out-Null
}

$WMIFilters = Import-Csv "C:\install\GPO\DefaultWMIFilters.csv" -Delimiter ","
$msWMIAuthor = $($env:USERDOMAIN + "\" + $env:USERNAME)

foreach ($WMIFilter in $WMIFilters) {

  	$WMIGUID = [string]"{"+([System.Guid]::NewGuid())+"}"
  	$WMIDN = "CN=" + $WMIGUID + ",CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN
  	$WMICN = $WMIGUID
 	$WMIdistinguishedname = $WMIDN
  	$WMIID = $WMIGUID

	$now = (Get-Date).ToUniversalTime()
	$msWMICreationDate = ($now.Year).ToString("0000") + ($now.Month).ToString("00") + ($now.Day).ToString("00") + ($now.Hour).ToString("00") + ($now.Minute).ToString("00") + ($now.Second).ToString("00") + "." + ($now.Millisecond * 1000).ToString("000000") + "-000"
	$msWMIName = $WMIFilter.Name
	$msWMIParm1 = $WMIFilter.Description + " "
	$msWMIParm2 = $WMIFilter.Filter

  	$array = @()
  	$SearchRoot = [adsi]("LDAP://CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN)
  	$search = New-Object System.DirectoryServices.DirectorySearcher($SearchRoot)
  	$search.Filter = "(objectclass=msWMI-Som)"
  	$results = $search.FindAll()
	ForEach ($result in $results) {
	$array += $result.properties["mswmi-name"].item(0)
}

if ($array -notcontains $msWMIName) {

    $SOMContainer = [adsi]("LDAP://CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN)
    $NewWMIFilter = $SOMContainer.create('msWMI-Som',"CN="+$WMIGUID)
    $NewWMIFilter.put("msWMI-Name",$msWMIName)
    $NewWMIFilter.put("msWMI-Parm1",$msWMIParm1)
    $NewWMIFilter.put("msWMI-Parm2",$msWMIParm2)
    $NewWMIFilter.put("msWMI-Author",$msWMIAuthor)
    $NewWMIFilter.put("msWMI-ID",$WMIID)
    $NewWMIFilter.put("instanceType",4)
    $NewWMIFilter.put("showInAdvancedViewOnly","TRUE")
    $NewWMIFilter.put("distinguishedname",$WMIdistinguishedname)
    $NewWMIFilter.put("msWMI-ChangeDate",$msWMICreationDate)
    $NewWMIFilter.put("msWMI-CreationDate",$msWMICreationDate)
    $NewWMIFilter.setinfo()

	}
}

###### CSV ######
Name,Description,Filter
PDC Domain Controller,PDC Rolleninhaber,1;3;10;53;WQL;root\CIMv2;Select * from Win32_ComputerSystem where DomainRole=5;
Restliche Domain Contrller,Alle anderen Domain Controller,1;3;10;53;WQL;root\CIMv2;Select * from Win32_ComputerSystem where DomainRole=4;
Alle Domain Controller,Alle Domain Controller,1;3;10;57;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="2";
Alle Mitgliedsserver,Alle Mitgliedsserver,1;3;10;57;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="3";
Alle Clients,Alle Client PCs,1;3;10;57;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="1";

 

Edit: Grade ein anderes Script gefunden (https://gallery.technet.microsoft.com/scriptcenter/f1491111-9f5d-4c83-b436-537eca9e8d94), wo die ersten 3 Zahlen immer fix "1;3;10" sind und die vierte Zahl nur die Länge der Abfrage ist.

Das wäre ja zu einfach...

 

Gruß

Jan

 

Hier noch das "Teilergebnis" inkl. verknüpfen der GPO mit dem WMI Filter:

$DomainDN = (Get-ADDomain).DistinguishedName

# http://www.jhouseconsulting.com/2014/06/09/script-to-create-import-and-export-group-policy-wmi-filters-1354
$key = Get-Item HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -ErrorAction SilentlyContinue
if (!$key) {
    New-Item HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -ItemType RegistryKey | Out-Null
}
$kval = Get-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -ErrorAction SilentlyContinue
if (!$kval) {
    New-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -Value "1" -PropertyType DWORD | Out-Null
} else {
    Set-ItemProperty HKLM:\System\CurrentControlSet\Services\NTDS\Parameters -Name "Allow System Only Change" -Value "1" | Out-Null
}

$WMIFilters = Import-Csv "C:\install\GPO\DefaultWMIFilters.csv" -Delimiter ","
$msWMIAuthor = $($env:USERDOMAIN + "\" + $env:USERNAME)
$WMIObjects = @()

foreach ($WMIFilter in $WMIFilters) {
        
    $tempWMIObject = New-Object PSObject

    $WMIGUID = [string]"{"+([System.Guid]::NewGuid())+"}"
    $WMIDN = "CN=" + $WMIGUID + ",CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN
    $WMICN = $WMIGUID
    $WMIdistinguishedname = $WMIDN
    $WMIID = $WMIGUID

    $now = (Get-Date).ToUniversalTime()
    $msWMICreationDate = ($now.Year).ToString("0000") + ($now.Month).ToString("00") + ($now.Day).ToString("00") + ($now.Hour).ToString("00") + ($now.Minute).ToString("00") + ($now.Second).ToString("00") + "." + ($now.Millisecond * 1000).ToString("000000") + "-000"
    $msWMIName = $WMIFilter.Name
    $msWMIParm1 = $WMIFilter.Description + " "
    $msWMIParm2 = $($WMIFilter.Filter1 + $WMIFilter.Filter2.Split(";")[3].Length + $WMIFilter.Filter2)
        
        

    $array = @()
    $SearchRoot = [adsi]("LDAP://CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN)
    $search = New-Object System.DirectoryServices.DirectorySearcher($SearchRoot)
    $search.Filter = "(objectclass=msWMI-Som)"
    $results = $search.FindAll()
    ForEach ($result in $results) {
        $array += $result.properties["mswmi-name"].item(0)
    }
        
    if ($array -notcontains $msWMIName) {
            
        $SOMContainer = [adsi]("LDAP://CN=SOM,CN=WMIPolicy,CN=System," + $DomainDN)
        $NewWMIFilter = $SOMContainer.create('msWMI-Som',"CN=" + $WMIGUID)
        $NewWMIFilter.put("msWMI-Name",$msWMIName)
        $NewWMIFilter.put("msWMI-Parm1",$msWMIParm1)
        $NewWMIFilter.put("msWMI-Parm2",$msWMIParm2)
        $NewWMIFilter.put("msWMI-Author",$msWMIAuthor)
        $NewWMIFilter.put("msWMI-ID",$WMIID)
        $NewWMIFilter.put("instanceType",4)
        $NewWMIFilter.put("showInAdvancedViewOnly","TRUE")
        $NewWMIFilter.put("distinguishedname",$WMIdistinguishedname)
        $NewWMIFilter.put("msWMI-ChangeDate",$msWMICreationDate)
        $NewWMIFilter.put("msWMI-CreationDate",$msWMICreationDate)
        $NewWMIFilter.setinfo()

        $tempWMIObject | Add-Member -MemberType NoteProperty -Name Name -Value $msWMIName
        $tempWMIObject | Add-Member -MemberType NoteProperty -Name CN -Value $WMIGUID
    }
    $WMIObjects += $tempWMIObject
}

Get-ADObject -Identity $(Get-GPO -Name "C_PDC_Zeitserver").Path | Set-ADObject -Add @{gPCWQLFilter=$("[" + $env:USERDNSDOMAIN + ";" + $(($WMIObjects | ? Name -eq "PDC Domain Controller").CN) + ";0]")}

Und die CSV:

Name,Description,Filter1,Filter2
PDC Domain Controller,PDC Rolleninhaber,1;3;10;,;WQL;root\CIMv2;Select * from Win32_ComputerSystem where DomainRole=5;
Restliche Domain Contrller,Alle anderen Domain Controller,1;3;10;,;WQL;root\CIMv2;Select * from Win32_ComputerSystem where DomainRole=4;
Alle Domain Controller,Alle Domain Controller,1;3;10;,;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="2";
Alle Mitgliedsserver,Alle Mitgliedsserver,1;3;10;,;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="3";
Alle Clients,Alle Client PCs,1;3;10;,;WQL;root\CIMv2;Select * from Win32_OperatingSystem where ProductType="1";

 

bearbeitet von testperson
Link zu diesem Kommentar

Ich kruschtel das morgen mal raus - direkte Erinnerung: Die Zahlen sind die Längen der Felder dahinter. Aber warum so kompliziert? Das einfachste ist eigentlich, nur ein MOF zu erstellen und das dann per mofcomp.exe zu importieren :-) Vielleicht kannst ja mal konkret schildern, was Du erreichen willst.

 

BTW: Ja, ich kenn mich mit dem Scheiß gut aus. Ich hab WMI-Filter schon per MOF, per VBS direkt im AD und auch noch anders erstellt/kopiert/modifiziert...

 

Edit: Ein Sample-MOF kriegt man am einfachsten, indem man einen bestehenden Filter exportiert. Da muß man dann halt die Filter-GUID und die komische Query-Section anpassen...

bearbeitet von daabm
.....
Link zu diesem Kommentar

Hi,

vor 8 Stunden schrieb daabm:

Ich kruschtel das morgen mal raus - direkte Erinnerung: Die Zahlen sind die Längen der Felder dahinter. Aber warum so kompliziert? Das einfachste ist eigentlich, nur ein MOF zu erstellen und das dann per mofcomp.exe zu importieren :-) Vielleicht kannst ja mal konkret schildern, was Du erreichen willst.

Das wäre nett. Ja die "Exportieren" Auswahl und Export in ein MOF ist mir kurz Fertigstellung auch begegnet und wäre sicherlich die kürzere und sinnvollere Variante. Mein Vorhaben ist einfach nur den ein und anderen WMI Filter vorrätig zu haben. Auch wenn wir derzeit tatsächlich nur den PDC-Filter bräuchten. Das tatsächliche, nahezu abgeschlossene, Vorhaben ist ein Rollout Script (Bereitstellung Server-VMs, Grundkonfig, Installation und Konfiguration AD, Installation und Konfiguration Exchange, Vorbereitung DATEV (und ggfs. Teil-Installation), Installation und Konfiugration Citrix Virtaul Apps & Desktops) bzw. die erweiterte V2 unseres derzeitigen Rollout für neue Kundenumbegunben.

 

Gruß

Jan

 

Link zu diesem Kommentar

Mist, vergessen :-( Und bevor ich kruschtel: Grad fällt mir das hier wieder ein, auf das ich auch schon mal zurückgegriffen habe, man muß ja nicht immer das GANZE Rad neu erfinden :-)

https://gallery.technet.microsoft.com/scriptcenter/Group-Policy-WMI-filter-38a188f3#content

Und aus dem Kopf wegen 1;3;10;xx: 3 ist die Länge von "WQL", 10 die Länge von root\CIMv2, XX die Länge des Query-Strings. Die 1 weiß ich nicht mehr sicher. Kann sein, daß das für die Anzahl der Queries im Filter steht, das können ja mehrere sein. Dann würde 3;10;xx mehrfach vorkommen.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...