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:

  1. Ograniczenia wyników tylko do katalogów
  2. 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.


Podobne Tematy:

  • haryrob

    Witam, klikając na link „Odczyt uprawnień GUI” w przeglądarce pokazuje się tylko strona z jakimiś krzaczkami ;)

    • goo.gl/Ghvrek

    • Łukasz Skalikow

      @haryrob:
      To jest link do archiwum 7z…
      PPM -> zapisz jako ;))))

  • haryrob

    No tak…, jak to dzieci moje mówią Pan Gapa ze mnie ;)