Rekurencja dla Get-ADGroup

Chciałbym zaprezentować dość przydatne narzędzie (przynajmniej dla mnie) tak by inni również mogli z niego skorzystać. Narzędzie to jest przydatne gdy posiadamy rozbudowane środowisko IT w oparciu o Active Directory, a dostęp do poszczególnych zasobów odbywa się poprzez uprawnienia nadawane na poszczególne grupy użytkowników AD.

OK, ale cóż tak naprawdę robi ten skrypt? Po prostu pozwala na wyciągnięcie z grupy Active Directory listę użytkowników. Nic rewelacyjnego można by powiedzieć, gdyż da się to wykonać przy użyciu standardowego moduły AD dla Powershella, choćby np. tak:

Get-ADGroup Group1 -Properties Members | Select-Object -ExpandProperty Members

Jak widzimy w naszej grupie jest czterech użytkowników i kolejne dwie grupy, co na pierwszy rzut oka nie wiele mówi nam o faktycznych członkach tej grupy. Aby więc uzyskać pełną listę użytkowników grupy należało by się zagłębiać w każdą kolejną podgrupę jaką napotkamy na swojej drodze. Przy ręcznym podejściu do takiej sytuacji z doświadczenia wiem, iż doprowadza to do sytuacji gdy łatwo o kimś zapomnieć.

Niestety minusem cmdletu Get-ADGroup jest brak możliwości rekurencyjnego wglądu do podgrup. Do tego celu właśnie stworzyłem skrypt pozwalający na wykonywanie tego typu zapytań w sposób rekurencyjny. Pozwala on nie tylko wyodrębnić użytkowników ze wszystkich podgrup, ale również stworzyć mapę podgrup w jakich dany użytkownik występował. Dlatego w przypadku gdy dany użytkownik występuje w kilku grupach naraz można to łatwo wydobyć.

Kod:

Function Get-ADGroupMembers
{
	param
	(
		[parameter(Mandatory=$true)]
		[string]$GroupName,
		[string]$MembersPath = "$GroupName`:/"
	)

	$MembersList = @()
	$ADObjects = Get-ADGroup $GroupName -Properties Members | Select-Object -ExpandProperty Members | Get-ADObject
	Foreach($ADObject in $ADObjects)
	{
		if($MembersPath -notmatch "/$($ADObject.Name)/" -and $MembersPath -notmatch "$($ADObject.Name):/")
		{
			if($ADObject.ObjectClass -eq "user" -or $ADObject.ObjectClass -eq "computer")
			{
				Add-Member -InputObject $ADObject -Name MembersPath -Value $($MembersPath+$ADObject.Name) -MemberType NoteProperty -Force
				$MembersList += $ADObject
			}
			else
			{
				$MembersList += Get-ADGroupMembers -GroupName $ADObject.Name -MembersPath $($MembersPath+$ADObject.Name+"/")
			}
		}
	}

	$MembersList
}

Edit. Wprowadziłem drobne zabezpieczenie przed zapętlaniem się grup domenowych.

Advertisements

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s