[PowerShell] Weitere Statements zu einem bereits definierten ScripBlock hinzufügen?

DPXone

Lieutenant
Registriert
Mai 2009
Beiträge
552
Hi,

mich würde mal interessieren, wie man weitere Bedingungen zu einem bereits (initial) definierten ScriptBlock hinzufügen kann.

Beispiel aus einem AD-Query (GlobalCatalog) für mein Modul, um im kompletten AD-Forest nach Usern zu suchen:
Code:
If ($EnabledUserOnly) { 
	$Filter = {((DistinguishedName -eq $N) -or (ObjectGUID -eq $N) -or (UserPrincipalName -like $N) -or (sAMAccountName -like $N) -or (mail -like $N) -or (givenname -like $N) -or (sn -like $N) -or (Displayname -like $N) -or (cn -like $N)) -and (Enabled -eq $True) } 
} Else { 
	$Filter = {((DistinguishedName -eq $N) -or (ObjectGUID -eq $N) -or (UserPrincipalName -like $N) -or (sAMAccountName -like $N) -or (mail -like $N) -or (givenname -like $N) -or (sn -like $N) -or (Displayname -like $N) -or (cn -like $N)) } 
}

Die beiden Bedingungen im Script-Blöcke unterscheiden sich ja nur durch (...)-and (Enabled -eq $true)
Finde das unschön, zweimal die fast exakt gleichen ScripttBlöcke auf Baisis der If-Bedingungen zurückzugeben.

Hat hierzu zufällig jemand eine Lösung?
 
Zuletzt bearbeitet:
Filter dir doch die Daten initial raus und filter dann nochmal auf entsprechende Kriterien?!
Code:
$allItems = Get-ChildItem
$allFiles = $allItems | ? { !$_.PsIsContainer }
$allFolders = $allItems | ? { $_.PsIsContainer }
$foldersStartingWithD = $allFolders | ? { $_.Name -like "d*" }
 
Yuuri schrieb:
Filter dir doch die Daten initial raus und filter dann nochmal auf entsprechende Kriterien?!
Code:
$allItems = Get-ChildItem
$allFiles = $allItems | ? { !$_.PsIsContainer }
$allFolders = $allItems | ? { $_.PsIsContainer }
$foldersStartingWithD = $allFolders | ? { $_.Name -like "d*" }

Also entweder kann ich dir gerade nicht ganz folgen oder du hast mein gedachtes Ziel nicht ganz verstanden.

Ich will per PowerShell, durch Eingabe von Find-AdUser blabla (Find-AdUser ist ein Teil meines AD-"Find"-Moduls), im AD nach Usern suche.
Ich kann durch "Find-AdUser BlaBl" User-Objekte im ganzen Forest nach diesem Begriff durchsuchen.
Das gleiche gilt für Gruppen, ist aber hier gerade irrelevant
Aus Nutzer-Sicht, ist es ja egal was dahinter passiert, jedoch aus meiner Sicht, würde ich die beiden Ergebnisse der If-Bedingung einschränken.

Mal Pseudo-mässig:
Code:
$InitialFilter = {(DistinguishedName -eq $N) -or (ObjectGUID -eq $N) -or (UserPrincipalName -like $N) -or (sAMAccountName -like $N) -or (mail -like $N) -or (givenname -like $N) -or (sn -like $N) -or (Displayname -like $N) -or (cn -like $N)) } 

If ($EnabledUserOnly) { 
		$Filter = $InitialFilter + "and (Enabled -eq $True")
} Else { 
		$Filter = $InitialFiler
}
Ergänzung ()

Nachtrag:
Hier kommt das Ganze in Einsatz:
Code:
		$QueryParameter = @{ 
			Filter = $Filter 
			Server = "$ServerName`:$port" 
		} 
		
		$SelectDomain = @{ n = 'Domain' ; e = {($_.CanonicalName -split '/')[0] } } 
		$SelectDC = @{ n = 'DomainController' ; e = { $dcs[$_.Domain].Hostname } } 
	} 
	
	Process { 
		Foreach ($N In $Name) { 
			$user = Get-ADUser @QueryParameter -Properties $Properties 
			$user = $user | select * , $SelectDomain 
			
			If ($ShowDC -or $QueryCorrespondingDC) { 
				$dcs = $user | group Domain | % { Get-ADDomainController -domain $_.Name -Discover } | Group-Object Domain -AsHashTable 
				$user = $user | select * , $SelectDC 
				
				If ($QueryCorrespondingDC) { 
					$user = $User | % { Get-ADUser $_.DistinguishedName -Server $_.DomainController -Properties $Properties } | select * , $SelectDomain | Select * , $SelectDC 
				} 
			} 
			$userArray+= $user 
		} 
	}
 
Zuletzt bearbeitet:
Code:
$user = Get-ADUser @QueryParameter -Properties $Properties 
if( $EnabledUserOnly )
{
	$user = $user | ? { $_.Enabled }
}
$user = $user | select * , $SelectDomain
 
Dass das so geht, ist mir klar.
Das zieht die Performance aber runter.
Würde deshalb gerne das ganze bereits im AD Query als Filter haben.
Man kann ja schließlich auch Wildcards nutzen.
Nur als Beispiel, wenn man alle AD User im gesamten Forest, die aktiviert sind, suchen will:

Find-ADUser * -EnabeldUserOnly

Mit deiner Variante würde ich dann erstmal alle User bekommen, was ziemlich lange dauert, und im Anschluss danach filtern, was nochmal Zeit in Anspruch nimmt.
Ergänzung ()

Ok habs gerade selbst rausbekommen:

Code:
$Filter = {((DistinguishedName -eq $N) -or (ObjectGUID -eq $N) -or (UserPrincipalName -like $N) -or (sAMAccountName -like $N) -or (mail -like $N) -or (givenname -like $N) -or (sn -like $N) -or (Displayname -like $N) -or (cn -like $N)) } 


[scriptblock]::Create($Filter.ToString() + "-and (Enabled -eq $true)")
 
Zuletzt bearbeitet:
Zurück
Oben