testperson 1.680 Geschrieben 2. Mai 2019 Melden Teilen Geschrieben 2. Mai 2019 (bearbeitet) 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 2. Mai 2019 von testperson Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 6. Mai 2019 Melden Teilen Geschrieben 6. Mai 2019 (bearbeitet) 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 6. Mai 2019 von daabm ..... Zitieren Link zu diesem Kommentar
testperson 1.680 Geschrieben 7. Mai 2019 Autor Melden Teilen Geschrieben 7. Mai 2019 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 Zitieren Link zu diesem Kommentar
daabm 1.355 Geschrieben 7. Mai 2019 Melden Teilen Geschrieben 7. Mai 2019 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. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.