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

Printed on: April 26, 2024 at 04:04 o'clock

Member: emeriks
emeriks Feb 27, 2017 updated at 12:45:20 (UTC)
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
Member: Lukas4580
Lukas4580 Feb 27, 2017 at 13:22:19 (UTC)
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
Member: emeriks
emeriks Feb 27, 2017 updated at 13:31:44 (UTC)
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.
Member: colinardo
Solution colinardo Feb 27, 2017 updated at 15:15:50 (UTC)
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
Member: Lukas4580
Lukas4580 Feb 27, 2017 at 14:39:57 (UTC)
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.
Member: colinardo
colinardo Feb 27, 2017 updated at 15:17:53 (UTC)
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)
Member: Lukas4580
Lukas4580 Feb 27, 2017 at 15:36:07 (UTC)
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!
Member: Lukas4580
Lukas4580 Feb 28, 2017 at 14:08:07 (UTC)
Goto Top
Hat super Funktioniert! Vielen Dank nochmal!
Member: colinardo
colinardo Feb 28, 2017 at 14:23:23 (UTC)
Goto Top
Immer gerne.
Member: Lukas4580
Lukas4580 Sep 26, 2017 at 09:18:21 (UTC)
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