lukas4580
Goto Top

Gruppenrichtlinien Item-Level targeting per Power Shell ändern

Hallo zusammen,

ich hab ein Problem und hoffe das mir hier jemand helfen kann. Wir haben in einer Domain ca. 150 GPO`s die einen Drucker mappen, fragt nicht wieso "ist halt historisch gewachsen.".
Also jeder Drucker hat eine Policy die einer AD Gruppe (auch für jeden Drucker eine) den Drucker mappt....

Jetzt haben wir eine neue XenApp Umgebung und die Drucker zusammen gefasst in Citrix Policys. Allerdings sitzen die in einer anderen Domain. Ich sollte / müsste jetzt zumindest für die Zeit der Test Phase, vermutlich noch länger. Die Policys auf der alten Domain für die neue Umgebung deaktivieren und zwar über Item-level targeting. Und zwar:
the Organizational Unit the computer blongs to is not OU=XDA, OU=W2k12R2, OU=Server, DC=Domain, DC=local or one of its descendants.

Sieht in den Settings dann so aus:

Item-level targeting: Organizational UnitAttribute Value
bool AND
not 1
name OU=XDA,OU=Win2k12R2,OU=Server,DC=Domain,DC=local
userContext 0
directMember 0


Wie bekomme ich das in ein Powershell Script das mir anhand einer csv Datei die Arbeit abnimmt mich durch jede Policy durch zu klicken?


Ich bin super Dankbar für Lösungen!

Viele Grüße
Lukas

Content-Key: 330646

Url: https://administrator.de/contentid/330646

Ausgedruckt am: 19.03.2024 um 06:03 Uhr

Mitglied: emeriks
emeriks 27.02.2017 aktualisiert um 13:45:20 Uhr
Goto Top
Hi,
"powershellen" kannst Du offenbar?
Die Einstellungen landen ganz einfach in XML-Files, welche im zur GPO gehörenden Ordner unter \\domain.local\Sysvol\domain.local\Policies gespeichert sind.

Du passt also eine GPO von Hand an. Dann schaust Du Dir die zugehörige XML-Datei an und schon weist Du, wie Du die Dateien der verbleibenden GPO's ändern musst.

E.

Edit:
\\domain.local\SysVol\domain.local\Policies\{GUID der GPO}\Machine\Preferences
\\domain.local\SysVol\domain.local\Policies\{GUID der GPO}\User\Preferences
Mitglied: Lukas4580
Lukas4580 27.02.2017 um 14:22:19 Uhr
Goto Top
Zitat von @emeriks:

Hi,
"powershellen" kannst Du offenbar?

Eher nicht so. So die Grundlagen sind geläufig mehr aber auch nicht.

Die Einstellungen landen ganz einfach in XML-Files, welche im zur GPO gehörenden Ordner unter \\domain.local\Sysvol\domain.local\Policies gespeichert sind.

Du passt also eine GPO von Hand an. Dann schaust Du Dir die zugehörige XML-Datei an und schon weist Du, wie Du die Dateien der verbleibenden GPO's ändern musst.

Okay. Hmm leider ist es nicht nur den Filter String hinzufügen. Die Action wird ja auch von Update auf Replace gesetzt. face-sad
Mitglied: emeriks
emeriks 27.02.2017 aktualisiert um 14:31:44 Uhr
Goto Top
Eher nicht so. So die Grundlagen sind geläufig mehr aber auch nicht.
Na dann wird es schwierig ...
Kannst Du VBscript oder VBA? C# oder VB.Net?

Okay. Hmm leider ist es nicht nur den Filter String hinzufügen. Die Action wird ja auch von Update auf Replace gesetzt. face-sad
Das steht auch in der XML.
Mitglied: colinardo
Lösung colinardo 27.02.2017 aktualisiert um 16:15:50 Uhr
Goto Top
Hallo Lukas,
hier auf die schnelle ein Skript, für den Fall das deine CSV so aussieht:
"Name"
"Name_der_GPO_1"
"Name_der_GPO_2"
"Name_der_GPO_3"
...
Sie kann auch anders aufgebaut sein, nur musst du den Namen der Spalte in der der Name der GPOs steht in der Variablen anpassen. Delimiter kannst du bei Bedarf auch in Zeile 6 anpassen.
# -----
$csvpath = 'C:\Pfad\data.csv'  
$csv_column_name = 'Name'  
# -----
Import-Module ActiveDirectory
$csv = Import-CSV $csvpath -Delimiter ';'  
$domaininfo = Get-ADDomain
$policies = "\\$($domaininfo.PDCEmulator)\sysvol\$($domaininfo.DNSRoot)\policies"  

foreach($gpo in $csv){
    $id = (Get-GPO -Name $gpo.$csv_column_name).Id
    $xmlpath = "$policies\{$id}\User\Preferences\Printers\Printers.xml"  
    if (Test-Path $xmlpath){
        $xml = [xml](gc $xmlpath)
        $xml.Printers.SharedPrinter | %{
            write-host "Adding Filter to GPO '$($gpo.$csv_column_name)'."  
            $filtersnode = $_.SelectSingleNode('Filters')  
            if(!$filtersnode){
                $filtersnode = $xml.CreateElement('Filters')  
                $_.AppendChild($filtersnode)| out-null
            }
            # create filter node
            $f = $xml.CreateDocumentFragment()
            $f.InnerXML = '<FilterOrgUnit bool="AND" not="1" name="OU=XDA, OU=W2k12R2, OU=Server, DC=Domain, DC=local" userContext="0" directMember="0" />'  
            $filtersnode.AppendChild($f) | out-null
            # change printer add method to replace
            $_.Properties.action = 'R'  
            # set changed date time of printer to now
            $_.changed = (get-date).toString('yyyy-MM-dd HH:mm:ss')  
            # remove if not applicable to 1
            $_.SetAttribute('removePolicy','1')  
        }
        $xml.Save($xmlpath)
    }
}
Grüße Uwe
Mitglied: Lukas4580
Lukas4580 27.02.2017 um 15:39:57 Uhr
Goto Top
Zitat von @emeriks:

Eher nicht so. So die Grundlagen sind geläufig mehr aber auch nicht.
Na dann wird es schwierig ...
Kannst Du VBscript oder VBA? C# oder VB.Net?

Auch eher weniger.

Okay. Hmm leider ist es nicht nur den Filter String hinzufügen. Die Action wird ja auch von Update auf Replace gesetzt. face-sad
Das steht auch in der XML.

Ja das hab ich gesehen. Ich kann XML Lesen aber nicht schreiben. Ähnlich wie Powershell und andere Script Sprachen. Ich versteh zwar was gemeint ist aber nicht wie man drauf kommt. So bisschen wie ne Fremdsprache ohne Grammatik.

Zitat von @colinardo:

Hallo Lukas,
hier auf die schnelle ein Skript, für den Fall das deine CSV so aussieht:
> "Name"
> "Name_der_GPO_1"
> "Name_der_GPO_1"
> "Name_der_GPO_1"
> ...
> 
Sie kann auch anders aufgebaut sein, nur musst du den Namen der Spalte in der der Name der GPOs steht in der Variablen anpassen. Delimiter kannst du bei Bedarf auch in Zeile 6 anpassen.
> # -----
> $csvpath = 'C:\Pfad\data.csv'  
> $csv_column_name = 'Name'  
> # -----
> Import-Module ActiveDirectory
> $csv = Import-CSV $csvpath -Delimiter ';'  
> $domaininfo = Get-ADDomain
> $policies = "\\$($domaininfo.PDCEmulator)\sysvol\$($domaininfo.DNSRoot)\policies"  
> 
> foreach($gpo in $csv){
>     $id = (Get-GPO -Name $gpo.$csv_column_name).Id
>     $xmlpath = "$policies\{$id}\Machine\Preferences\Printers\Printers.xml"  
>     if (Test-Path $xmlpath){
>         $xml = [xml](gc $xmlpath)
>         $xml.Printers.PortPrinter | %{
>             write-host "Adding Filter to GPO '$($gpo.$csv_column_name)'."  
>             $filtersnode = $_.SelectSingleNode('Filters')  
>             if(!$filtersnode){
>                 $filtersnode = $xml.CreateElement('Filters')  
>                 $_.AppendChild($filtersnode)| out-null
>             }
>             # create filter node
>             $f = $xml.CreateDocumentFragment() | out-null
>             $f.InnerXML = '<FilterOrgUnit bool="AND" not="1" name="OU=XDA, OU=W2k12R2, OU=Server, DC=Domain, DC=local" userContext="0" directMember="0" />'  
>             $filtersnode.AppendChild($f) | out-null
>             # change printer add method to replace
>             $_.Properties.action = 'R'  
>         }
>         $xml.Save($xmlpath)
>     }
> }
> 
Grüße Uwe

Das sieht doch schon mal gut aus! Wie gesagt ich bin eher Anfänger was Programmieren und Scripten angeht.

Weil
-<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}">-<SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" bypassErrors="1" userContext="1" uid="{0FC73B0D-E35E-4449-93C3-74EB072544FD}"   

Wird zu
-<Printers clsid="{1F577D12-3D1B-471e-A1B7-060317597B9C}">-<SharedPrinter clsid="{9A5E9697-9095-436d-A0EE-4D128FDFBCE5}" bypassErrors="1" removePolicy="1" uid="{0FC73B0D-E35E-4449-93C3-74EB072544FD}"   

Und dann halt der Filter der genauso aussieht wie du geschrieben hast.
Mitglied: colinardo
colinardo 27.02.2017 aktualisiert um 16:17:53 Uhr
Goto Top
Alles oben angepasst.
Wie gesagt ich bin eher Anfänger was Programmieren und Scripten angeht.
Kann ich auch nichts dran ändern, nur du face-wink.

Grüße Uwe

Noch mehr Wünsche? --> PM (kostenpflichtig)
Mitglied: Lukas4580
Lukas4580 27.02.2017 um 16:36:07 Uhr
Goto Top
Zitat von @colinardo:

Alles oben angepasst.
Wie gesagt ich bin eher Anfänger was Programmieren und Scripten angeht.
Kann ich auch nichts dran ändern, nur du face-wink.

Grüße Uwe

Stimmt! face-smile Trotzdem Danke für die Mühe!
Mitglied: Lukas4580
Lukas4580 28.02.2017 um 15:08:07 Uhr
Goto Top
Hat super Funktioniert! Vielen Dank nochmal!
Mitglied: colinardo
colinardo 28.02.2017 um 15:23:23 Uhr
Goto Top
Immer gerne.
Mitglied: Lukas4580
Lukas4580 26.09.2017 um 11:18:21 Uhr
Goto Top
Hallo nochmal,

weis auch jemand wie ich das rückgängig mach. Also alle Targetings löschen. Weil das Script hängt mir nur neue an und ersetzt nicht bestehende.
Hintergrund ist die OU hat sich geändert und das muss ich jetzt Anpassen. Ich kann die OU einfach ändern aber wie gesagt er hängt nur an und überschreibt nicht.

Vielen Dank!

Lukas