trochę zabawa żeby udowodnić co może PS, bo można łatwiej, ale na pewno w większej ilości kroqw.

scenariusz: wyświetlić wszystkich adminów i ich role w AAD. niby proste, mamy do dyspozycji get-AzureADDirectoryRole i get-AzureADDirectoryRoleMember. a więc we w miarę prostej postaci można to zrobić tak:

Get-AzureADDirectoryRole|%{$rn=$_.displayname;Get-AzureADDirectoryRoleMember -ObjectId $_.objectid|? objectType -eq 'user'|select displayname,userprincipalname,@{N='role';E={$rn}}}

już tutaj zapytanie jest dość złożone. z ciekawych elementów, które warto wyjaśnić:

  • $rn=$_.displayname jest ściśle powiązane z faktem, żeby potem wykorzystać je w selekcie. bez tego utracona by została informacja dotycząca roli – a więc byłaby lista użytkowników, bez informacji o tym, o którą rolę chodzi.
  • ..i tak w selekcie następuje 'wstrzyknięcie’ tej informacji poprzez @{N=’role’;E={$rn}} – utworzona zostaje dodatkowa kolumna o nazwie 'role’.

niemniej to nie koniec 'zabawy’ bo otrzymamy płaską listę, na której jeden login może występować wiele razy – dla każdej roli w której się pojawia. mamy oczywiście 'group-object’ które pozwoli połączyć to w jedną całość… tylko co ukaże się naszym oczom nie będzie przyjemne.

problem, który się pojawia – jak sformatować to, co wypluwa 'group-object’? w dużym skrócie – należy się przyjrzeć temu, co ten zwraca, i potraktować go… jak każdy inny obiekt. przyjmując, że wyniki poprzedniego polecenia mam w zmiennej '$admins’, przyjrzyjmy się co będzie po zgrupowaniu:

$admins|group userprincipalname|select -ExpandProperty group -first 1

DisplayName UserPrincipalName role
----------- ----------------- ----
Administrator nexor@w-files.pl Power BI Service Administrator
Administrator nexor@w-files.pl Service Support Administrator
Administrator nexor@w-files.pl Exchange Service Administrator
Administrator nexor@w-files.pl SharePoint Service Administrator

a więc 'grupa’, trzyma dla każdego wpisu, wszystkie informacje o zgrupowanych obiektach (jako kolekcja obiektów) – ze względu na to zagnieżdżenie, nie jest to zbyt proste do pracy. do tego trzeba będzie pracować na kolekcji – bo jeśli ktoś występuje w kilq rolach, to mamy liczbę mnogą. finalnie odpowiedź jest taka:

Get-AzureADDirectoryRole|%{$rn=$_.displayname;Get-AzureADDirectoryRoleMember -ObjectId $_.objectid|? objectType -eq 'user'|select displayname,userprincipalname,@{N='role';E={$rn}}}|Group-Object userprincipalname |select name,@{N='displayname';E={$_.group.displayname|select -unique}},@{N='roles';E={($_.group.role|sort) -join ','}}

można teraz całość wypluć do CSV [ |export-csv c:\temp\admins.csv -nti -deli ’;’ ] i zrobić raport w Excelu (:

eN.

-o((:: sprEad the l0ve ::))o-

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload CAPTCHA.