informatikkfm
Goto Top

Powershell-Skript und Organisationseinheiten auskludieren

Hallo,

ich habe ein Powershell-Skript, ähnlich wie das folgende.
Ich möchte dabei, dass alle Benutzer unterhalb der OUs in $Exclude_OUs nicht beachtet werden.
Das funktioniert leider so nicht, nur wenn im Array ein einzelner Wert steht. Sobald zwei oder mehr eingetragen sind,
greift der Filter nicht.

Habt ihr eine Idee, was ich hier falsch mache? Es steht leider nur PS 2.0 zur Verfügung.

$BaseDN = 'OU=Berlin,DC=tolledomaene,DC=de'  

$Exclude_OUs = @(
    'OU=West,OU=Berlin,DC=tolledomaene,DC=de'  
    'OU=Ost,OU=Berlin,DC=tolledomaene,DC=de'  
	)
	
(Get-Mailbox -OrganizationalUnit $BaseDN | Where-Object {$_.DistinguishedName -Notmatch $Exclude_OUs}).Count

Content-ID: 522727

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

Ausgedruckt am: 13.11.2024 um 08:11 Uhr

Kraemer
Kraemer 06.12.2019 um 11:21:02 Uhr
Goto Top
Moin,

-notin statt -notmatch sollte helfen.

Gruß
informatikkfm
informatikkfm 06.12.2019 um 11:25:05 Uhr
Goto Top
Korrekt,
geht aber leider nicht unter PS 2.0, daher ja auch der direkte Hinweis in der Frage,
dass nur PS 2.0 zur Verfügung steht.
Kraemer
Kraemer 06.12.2019 um 11:28:19 Uhr
Goto Top
Zitat von @informatikkfm:

Korrekt,
geht aber leider nicht unter PS 2.0, daher ja auch der direkte Hinweis in der Frage,
dass nur PS 2.0 zur Verfügung steht.
ich kenne die 2er nicht mehr. Ein simpler Hinweis wäre höflich gewesen.
Dann wirst du wohl mit NotContains arbeiten müssen.
TK1987
TK1987 06.12.2019 um 11:31:00 Uhr
Goto Top
Die Excludes müssen nur mit einer Pipe von einander getrennt sein.

So sollte es eigentlich funktionieren:
(Get-Mailbox -OrganizationalUnit $BaseDN | Where-Object {$_.DistinguishedName -Notmatch ($Exclude_OUs -join '|')}).Count  
informatikkfm
informatikkfm 06.12.2019 um 11:44:16 Uhr
Goto Top
In meinem Eingangspost hatte ich erwähnt, dass nur PS 2.0 zur Verfügung steht.
informatikkfm
informatikkfm 06.12.2019 um 11:46:57 Uhr
Goto Top
Zitat von @TK1987:

Die Excludes müssen nur mit einer Pipe von einander getrennt sein.

So sollte es eigentlich funktionieren:
(Get-Mailbox -OrganizationalUnit $BaseDN | Where-Object {$_.DistinguishedName -Notmatch ($Exclude_OUs -join '|')}).Count  

Ich bekomme leider einen Pipe-Fehler,
ich habe Exclude_OUs wie folgt jetzt gesetzt.

$Exclude_OUs = @(
    'OU=West,OU=Berlin,DC=tolledomaene,DC=de'|  
    'OU=Ost,OU=Berlin,DC=tolledomaene,DC=de'  
	)

Fehler?
TK1987
Lösung TK1987 06.12.2019 aktualisiert um 12:01:23 Uhr
Goto Top
Ja, das kann so nicht Funktionieren. So versucht er innerhalb der Variable zu Pipen.

where-object akzeptiert mehrere Bedingungen, wenn man es so macht:
where-object { $_ -notmatch 'Bedingung1|Bedingung2|Bedingung3' }  

Lass die $Exclude_OUs wie sie am Anfang war und nimm den Befehl, den ich oben gepostet habe. Da habe ich ja extra
($Exclude_OUs -join '|')  
eingefügt, dass sollte so funktionieren.
informatikkfm
informatikkfm 06.12.2019 um 12:04:36 Uhr
Goto Top
Zitat von @TK1987:

Ja, das kann so nicht Funktionieren. So versucht er innerhalb der Variable zu Pipen.

where-object akzeptiert mehrere Bedingungen, wenn man es so macht:
where-object { $_ -notmatch 'Bedingung1|Bedingung2|Bedingung3' }  

Lass die $Exclude_OUs wie sie am Anfang war und nimm den Befehl, den ich oben gepostet habe. Da habe ich ja extra
($Exclude_OUs -join '|')  
eingefügt, dass sollte so funktionieren.

Perfekt, das funktioniert.

Danke.
TK1987
TK1987 06.12.2019 aktualisiert um 13:01:49 Uhr
Goto Top
Huch, da hat @141965 seine Kommentare schnell mal wieder gelöscht.

Trotzdem noch mal zur Aufklärung der Verwirrung:
  • Regex gilt nur bei Doublequote-Strings, da mit -join '|' aber ein Singlequote-String übergeben wird, ist Regex uninteressant
  • Die Option -contains bzw. -notcontains kann man nur nutzen, wenn eine vollständige Übereinstimmung der beiden Vergleichsobjekte vorliegt, während -match bzw. -notmatch eben auch gilt, wenn die Zeichenkette nur innerhalb des Vergleichsobjekts vorkommt.
141965
141965 06.12.2019 aktualisiert um 13:30:38 Uhr
Goto Top
Zitat von @TK1987:

Huch, da hat @141965 seine Kommentare schnell mal wieder gelöscht.
War im falschen Film, sorry.
Trotzdem noch mal zur Aufklärung der Verwirrung:
  • Regex gilt nur bei Doublequote-Strings, da mit -join '|' aber ein Singlequote-String übergeben wird, ist Regex uninteressant
?? Nein das ist falsch, wenn in den Array-Einträgen ein Sonderzeichen vorkommen würde, welches ein Regex-Sonderzeichen ist würde das zu falschen Ergebnissen führen weil du sie nicht maskierst.
Regex gilt übrigens sehr wohl auch innerhalb von single quotes, aber das hier ist ja nur ein simpler Join.

* Die Option -contains bzw. -notcontains kann man nur nutzen, wenn eine vollständige Übereinstimmung der beiden Vergleichsobjekte vorliegt, während -match bzw. -notmatch eben auch gilt, wenn die Zeichenkette nur innerhalb des Vergleichsobjekts vorkommt.
Richtig, da war ich im anderen Kommentar in einem anderen Film (hier gerade ähnliches gemacht).

Wenn man das mit der Regex-Variante wasserdicht machen will also inkl. esccaping der Regex-Sonderzeichen dann so
$BaseDN = 'OU=Berlin,DC=tolledomaene,DC=de'  
$Exclude_OUs = @('OU=West,OU=Berlin,DC=tolledomaene,DC=de','OU=Ost,OU=Berlin,DC=tolledomaene,DC=de')  
(Get-Mailbox -OrganizationalUnit $BaseDN | ?{$_.DistinguishedName -notmatch "($(($exclude_OUs | %{[regex]::Escape($_)}) -join '|'))$"}).Count  
TK1987
TK1987 06.12.2019 aktualisiert um 13:35:24 Uhr
Goto Top
Zitat von @141965:
?? Nein das ist falsch, wenn in den Array-Einträgen ein Sonderzeichen vorkommen würde, welches ein Regex-Sonderzeichen ist würde das zu falschen Ergebnissen führen weil du sie nicht maskierst.
Stimmt, mein Fehler.
Wenn man das mit der Regex-Variante wasserdicht machen will also inkl. esccaping der Regex-Sonderzeichen dann so
"($(($exclude_OUs | %{[regex]::Escape($_)}) -join '|'))$"  
Warum so kompliziert?
([regex]::escape($Exclude_OUs) -join '|')  
Macht genau das Selbe.
141965
141965 06.12.2019 aktualisiert um 13:44:16 Uhr
Goto Top
Zitat von @TK1987:
"($(($exclude_OUs | %{[regex]::Escape($_)}) -join '|'))$"  
Warum so kompliziert?
([regex]::escape($Exclude_OUs) -join '|')  
Macht genau das Selbe.
Nein macht es nicht. Du kannst der [regex]::escape Funktion kein Array als Parameter übergeben, außer dem beachte noch das Dollarzeichen .
https://docs.microsoft.com/de-de/dotnet/api/system.text.regularexpressio ...

So geht es übrigens als abgewandelte Variante auch noch:
Get-Mailbox -OrganizationalUnit $BaseDN | ?{$Exclude_OUs -notcontains [regex]::match($_,'(?i)(?<=^CN=.*?)(OU|CN|DC)=.*').Value}  
emeriks
emeriks 06.12.2019 um 17:30:01 Uhr
Goto Top
Zitat von @informatikkfm:
auskludieren
Was für ein Sprachmüll ...
informatikkfm
informatikkfm 09.12.2019 um 08:09:59 Uhr
Goto Top
Zitat von @emeriks:

Zitat von @informatikkfm:
auskludieren
Was für ein Sprachmüll ...

Wusste nicht, dass die Rechtschreibung und Grammatik hier ausschlaggebend für Unterstützung ist. face-smile
Dann bleiben wir halt bei exkludieren.

Gruß
141965
141965 09.12.2019 aktualisiert um 09:59:51 Uhr
Goto Top
Man könnte ja auch das schon jahrhunderte alte Deutsch verwenden und "ausschließen" schreiben, aber das wäre ja nicht hip genug ne ... :-P
Wusste nicht, dass die Rechtschreibung und Grammatik hier ausschlaggebend für Unterstützung ist
Es steht nicht umsonst in jeder Kommentarbox, "Bitte achte auf die Rechtschreibung!". Zumindest erhöhst du deine Chancen das dich jemand ernst nimmt.