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.
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 522727
Url: https://administrator.de/contentid/522727
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
15 Kommentare
Neuester Kommentar
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.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.
Dann wirst du wohl mit NotContains arbeiten müssen.
Ja, das kann so nicht Funktionieren. So versucht er innerhalb der Variable zu Pipen.
where-object akzeptiert mehrere Bedingungen, wenn man es so macht:
Lass die $Exclude_OUs wie sie am Anfang war und nimm den Befehl, den ich oben gepostet habe. Da habe ich ja extra
eingefügt, dass sollte so funktionieren.
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 '|')
Huch, da hat @141965 seine Kommentare schnell mal wieder gelöscht.
Trotzdem noch mal zur Aufklärung der Verwirrung:
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.
War im falschen Film, sorry.
Regex gilt übrigens sehr wohl auch innerhalb von single quotes, aber das hier ist ja nur ein simpler Join.
Wenn man das mit der Regex-Variante wasserdicht machen will also inkl. esccaping der Regex-Sonderzeichen dann so
Trotzdem noch mal zur Aufklärung der Verwirrung:
?? 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 nur bei Doublequote-Strings, da mit -join '|' aber ein Singlequote-String übergeben wird, ist Regex uninteressant
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
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.?? 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.
Wenn man das mit der Regex-Variante wasserdicht machen will also inkl. esccaping der Regex-Sonderzeichen dann so
Warum so kompliziert?"($(($exclude_OUs | %{[regex]::Escape($_)}) -join '|'))$"
([regex]::escape($Exclude_OUs) -join '|')
Zitat von @TK1987:
Warum so kompliziert?
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 ."($(($exclude_OUs | %{[regex]::Escape($_)}) -join '|'))$"
([regex]::escape($Exclude_OUs) -join '|')
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}
Was für ein Sprachmüll ...
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.