Rekurencyjne członkostwo w grupach

Poprzednio prezentowałem jak można wydobyć faktyczny stan członków danej grupy domenowej. Natomiast dziś chciałbym zaprezentować drobną modyfikację skryptu. Narzędzie to analogicznie pokazuje faktyczny stan (w rekurencyjny sposób) do jakich grupach należy nasz użytkownik.

Domyślnie moduł Active Directory do PowerShell’a pozwala na wydobycie informacji z atrybutu MemberOf, a te dane zawierając tylko bezpośrednie powiązania członkostwa użytkownika (lub grupy) w grupach.

Import-Module ActiveDirectory
Get-ADuser mgajda -Properties MemberOf | Select-Object -ExpandProperty MemberOf

Jak widzimy użytkownik jest członkiem tylko trzech grup. W dużym środowisku taki wynik może doprowadzić do sytuacji, iż poprzez pominięcie dalszej analizy poszczególnych podgrup, pominiemy np. fakt, iż jakaś z podgrup posiada zbyt duże uprawnienia.

Aby móc zabezpieczyć się przed takim faktem napisane zostało właśnie niniejsze narzędzie pozwalające rekurencyjnie zaglądać do każdej grupy, w której tak naprawdę jest umiejscowiony nasz użytkownik.

Kod:

Function Get-ADUserMemberOf
{
	param
	(
		[parameter(Mandatory=$true)]
		[string]$Name,
		[string]$MemberOfPath = "$Name`:/"
	)

	$GroupsList = @()
	$ADObjects = Get-ADObject -LDAPFilter "(sAMAccountName=$Name)" -Properties MemberOf | Select-Object -ExpandProperty MemberOf | Get-ADObject

	Foreach($ADObject in $ADObjects)
	{
		if($ADObject -ne $null)
		{
			if($MemberOfPath -notmatch "/$($ADObject.Name)/" -and $MemberOfPath -notmatch "$($ADObject.Name):/")
			{
				Add-Member -InputObject $ADObject -Name MemberOfPath -Value $($MemberOfPath+$ADObject.Name) -MemberType NoteProperty -Force
				$GroupsList += $ADObject
				$GroupsList += Get-ADUserMemberOf -Name "$($ADObject.Name)" -MemberOfPath $($MemberOfPath+$ADObject.Name+"/")
			}
		}
	}

 	$GroupsList
}

Jak widzimy na zrzucie ekranu mimo, iż nasz użytkownik był członkiem tylko 3, z pozoru nieszkodliwych grup, to dzięki dziedziczeniu uprawnień z kolejnych podgrup posiadał on również uprawnienia administratora całej domeny. Co przy wykorzystaniu samego cmdletu Get-ADuser, byłoby ciężkie do stwierdzenia.

PS. Zarówno w tej funkcji jak i w poprzedniej zostało dopisane zabezpieczenie odnośnie możliwości zapętlenia się członkostwa poszczególnych podgrup.

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