PowerShell, a prawa dostępu do katalogów
W codziennej pracy administratorskiej jedną z czynności jaką wykonujemy jest nadawanie uprawnień do katalogów/zasobów sieciowych. Jest to żmudna i nudna robota, pół biedy kiedy zarządzamy małą liczbą katalogów, a w naszym AD jest mało użytkowników i grup. Schody zaczynają się gdy zarządzamy bardzo rozległymi strukturami, a uprawnienia do katalogów stają się naszą zmorą. Z pomocą w takiej sytuacji przychodzi oczywiście PowerShell, który w rękach sprytnego administratora wydaje się być idealnym panaceum na ten problem a tym samym prawa dostępu do katalogów nie powinny być czymś tajemniczym i strasznym 😉
Niniejszym polecam 3 skrypty, które ułatwiają pracę przy obsłudze i zarządzaniu prawami dostępu do katalogów w bardzo rozległych strukturach domeny Active Directory.
Powershell – prawa dostępu do katalogów na żądanie
Jeśli potrzebny jest skrypt do odczytania uprawnień do danego katalogu „na szybko” wystarczy krótki skrypt w PowerShellu:
$permissions = Get-Acl $args[0] $lista = $permissions.AccessToString.Split("`r`n")| where {$_ -notlike 'CREATOR OWNER*'}| where {$_ -notlike 'BUILTIN*'} foreach ($line in $lista) { $line }
To jednak pomogło mi tylko na chwilę, jednak wywoływanie prostego skryptu w PowerShellu szybko męczy wobec tego postanowiłem użyć możliwości stworzenia prostych GUI (za pomocą narzędzia PrimalForms w wersji Community od firmy Sapien), niestety cały kod jest dość długi, ale można go pobrać z naszego bloga. W kodzie formularza jest pusty element z paskiem postępu, który chciałem początkowo użyć, ale po kliku próbach poddałem się (nagroda – uścisk dłoni jednego z ojców założycieli bloga, dla osoby która podpowie jak tego używać w PowerShellu).
Powershell – uprawnienia do katalogów odczytane rekurencyjnie
Powyższy skrypt spełniał swoje zadanie. Do czasu. Nie od dziś wiadomo, że apetyt rośnie w miarę jedzenia, więc miałem ochotę ugryźć temat bardziej „proceduralnie” i odczytać uprawnienia wszystkich interesujących mnie katalogów udostępnionych przez jakiś zasób sieciowy. Niby nic trudnego, wystarczy dodać jedną opcję do odczytania rekursywnego:
Get-ChildItem –Path ‘ścieżka_do_folderu’ –Recurse
Jednak nie rozwiązuje to dwóch problemów:
- Ograniczenia wyników tylko do katalogów
- Ograniczenia „głębokości” poszukiwań.
Znalazłem jednak pomocne rozwiązanie na stronie http://www.indented.co.uk/index.php/2010/01/22/limit-recursion-depth-with-get-childitem/
Dzięki temu mogłem przystąpić do działania i zaadoptowania powyższego rozwiązania na swoje cele. Finalny skrypt działający w konsoli wyglądał tak:
$ErrorActionPreference= 'silentlycontinue' $intRow=1 Function Get-ChildItemToDepth { Param( [String]$Path = $PWD, [String]$Filter = "*", [Byte]$ToDepth = 255, [Byte]$CurrentDepth = 0, [Switch]$DebugMode ) $CurrentDepth++ If ($DebugMode) { $DebugPreference = "Continue" } Get-ChildItem $Path | %{ $_ | ?{ $_.Name -Like $Filter } | Where-Object {$_.PSIsContainer} If ($_.PsIsContainer) { If ($CurrentDepth -le $ToDepth) { Get-ChildItemToDepth -Path $_.FullName -Filter $Filter -ToDepth $ToDepth -CurrentDepth $CurrentDepth } Else { Write-Debug $("Skipping GCI for Folder: $($_.FullName) " + "(Why: Current depth $CurrentDepth vs limit depth $ToDepth)") } } } } $CI = New-Object System.Globalization.CultureInfo "en-US" $Excel = New-Object -Com Excel.Application $Excel.visible = $True $Excel.UserControl = $true $Books = $Excel.Workbooks $Books.PSBase.GetType().InvokeMember("Add",[system.reflection.bindingflags]::InvokeMethod,$null, $books, $null, $ci) $ExcelSheet = $Excel.ActiveSheet $Cells = $ExcelSheet.Cells $Cells.item(1,1).FormulaLocal = "Ścieżka:" $Cells.item(1,2).FormulaLocal = "Użytkownicy/Grupy:" $Items = Get-ChildItemToDepth -Path ścieżka_do_folderu -ToDepth 1 foreach ($Item in $Items){ $permissions = Get-ACL -Path $Item.FullName $lista = $permissions.AccessToString.Split("`r`n")| where {$_ -notlike 'CREATOR OWNER*'}| where {$_ -notlike 'BUILTIN*'} | where {$_ -notlike 'NT AUTH*'} | where {$_ -notlike '*NT SERV*'} foreach ($acl in $lista) { $intRow++ $Cells.Item($intRow,1).FormulaLocal = $Item.FullName $Cells.Item($intRow,2).FormulaLocal = $acl } }
Skrypt odczytuje uprawnienia z zadanym limitem głębokości (linia 46), i eksportuje uprawnienia wraz z ścieżką do pliku w Excelu.
Oczywiście tak samo jak w przypadku pierwszego skryptu stworzyłem także wersję z GUI, również do pobrania z naszego bloga: Odczyt uprawnień GUI
Ufam, że te narzędzia okażą się pomocne w codziennej pracy i pomogą Wam efektywnie zarządzać uprawnieniami w waszych firmach.
Witam, klikając na link „Odczyt uprawnień GUI” w przeglądarce pokazuje się tylko strona z jakimiś krzaczkami 😉
goo.gl/Ghvrek
@haryrob:
To jest link do archiwum 7z…
PPM -> zapisz jako ;))))
No tak…, jak to dzieci moje mówią Pan Gapa ze mnie 😉
Prośba taka o reupload archiwum z „Odczyt uprawnień GUI” po pobraniu nie mogę go rozpakować.