Domyślnie listy i ich elementy dziedziczą grupy i poziomy uprawnień od stron nad nimi w hierarchii — oznacza to, że witryny dziedziczy uprawnienia ze swojej witryny nadrzędnej, następnie lista dziedziczy uprawnienia z witryny, i wreszcie każdy element na liście dziedziczy te uprawnienia z listy. Jeśli wprowadzisz zmiany w witryny nadrzędnej, jej podwitryny, listy i ich elementów automatycznie uzyskują te same zmiany.

Dziedziczenie jest często zatrzymywane, ponieważ nie wszyscy użytkownicy witryny powinni mieć dostęp do wszystkich list i wszystkich dokumentów lub elementów na stronie. SharePoint Online pozwala ustanowić uprawnienia jeszcze bardziej szczegółowo - nie każdy, kto ma dostęp do listy, będzie miał dostęp do wszystkich jej elementów. Przykładowo użytkownicy mogą mieć uprawnienia do wyświetlania listy, a uprawnienia edycji tylko na wybrane pliki. 

Takie rozwiązania często są podyktowane ze względów bezpieczeństwa, np. element lub dokument zawierają poufne dane.

Strona rośnie, lista się rozwija, liczba elementów wzrasta, aż otrzymujemy setki elementów z unikatowymi uprawnieniami, które nie są już potrzebne.

Czas, aby zacząć na nowo?

W ten sam sposób, jak zostały zatrzymane dziedziczenia uprawnień dla każdego elementu, można usunąć jego uprawnienia unikatowe. Dla każdego jednego elementu oddzielnie. 

Uważaj - Jeśli chcesz wznowić dziedziczenie uprawnień, można stracić unikatowe ustawienia zawartości.2

Przejdźmy zatem do skryptów.

Tutaj stworzymy skrypt przy użyciu CSOM i Powershell. CSOM oznacza model obiektowy po stronie klienta, który umożliwia uwierzytelnianie usługi SharePoint Online i wykonywanie operacji na jego elementach. To nie jest ograniczone tylko do środowiska Powershell. W tym przykładzie jednak otwórzmy Powershell ISE, aby spojrzeć na to z perspektywy Powershella:

1. Zainstaluj program SharePoint Online SDK

2. Po zainstalowaniu zestawu SDK, należy umieścić odniesienie do niego w skrypcie: 

# Paths to SDK. Please verify location on your computer.
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

3. Tworzenie kontekstu dla operacji. Adres url odwołuje się do witryny, gdzie znajduje się lista. Może to być zbiór witryn lub jedna z podwitryn.

$ctx=New-Object Microsoft.SharePoint.Client.ClientContext($Url)

4. Dodaj poświadczenia administratora. Nie można wykonać operacji na stronie, do której nie masz uprawnień! 

Hasło musi być typu SecureString.

$password = ConvertTo-SecureString -string $AdminPassword -AsPlainText -Force
$ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Username$password)

5. Teraz zajmijmy się listą, gdzie znajdują się elementy, dla których chcesz zmienić ustawienia dziedziczenia uprawnień. Należy najpierw załadować elementy, na których chcesz wykonywać operacje.


$ll=$ctx.Web.Lists.GetByTitle($ListTitle)
  
  $ctx.Load($ll)
  
  $ctx.ExecuteQuery()

6. ExecuteQuery() wykonuje operacje, które podałeś w linii powyżej. Ta metoda wirtualna jest "synchroniczna", co oznacza, że wykonanie kodu jest zablokowane do momentu otrzymania odpowiedzi z serwera. Jeżeli obiekt wywołujący nie chce być zablokowany i obiekt wywołujący jest zarządzany, obiekt wywołujący powinien wywołać ExecuteQueryAsync().4

7. Teraz należy załadować elementy listy. Funkcja .GetItems() wymaga CamlQuery. Tworzymy zatem obiekt  Microsoft.SharePoint.Client.CamlQuery i przekazujemy go jako zmienną $ll.GetItems(), gdzie $ll oznacza listę, którą załadowaliśmy wcześniej.

$spQuery = New-Object Microsoft.SharePoint.Client.CamlQuery
   
  $itemki=$ll.GetItems($spQuery)
  $ctx.Load($itemki)
  $ctx.ExecuteQuery()

8. Teoretycznie można pozostać na tym, ale naszemu CamlQuery brakuje jednej rzeczy. Wyobraź sobie, że mamy do czynienia z plikami przechowywanymi w różnych folderach w bibliotece (biblioteka dokumentów jest rodzajem z listy) lub mamy listę kontaktów, którą podzieliliśmy na foldery, np. Dostawcy, Klienci, Wewnętrzne. Nasze obecne rozwiązanie zwróci tylko elementy widoczne w widoku pierwszego poziomu. Wszystkie elementy w folderach pozostaną ukryte. Dlatego musimy użyć "Recursive". Dzięki temu nasze zapytanie przejdzie przez wszystkie foldery i pobierze wszystkie elementy listy.

$spqQuery.ViewXml ="<View Scope='RecursiveAll' />";

9. Wstawione do skryptu:

$spQuery = New-Object Microsoft.SharePoint.Client.CamlQuery
 
$spqQuery.ViewXml ="<View Scope='RecursiveAll' />";
  $itemki=$ll.GetItems($spQuery)
  $ctx.Load($itemki)
  $ctx.ExecuteQuery()

10. Poniżej pętla, która przechodzi przez wszystkie elementy i usuwa jego unikatowe uprawnienia 

for($j=0;$j -lt $itemki.Count ;$j++)
  {
      $itemki[$j].ResetRoleInheritance()
  }

11. Gdzie należy umieścić $ctx.ExecuteQuery()? To jest ciekawe pytanie.

Teraz mam tylko 9 elementów w mojej liście i tak naprawdę nie ma znaczenia, jeśli .ExecuteQuery() umieścimy tutaj i będziemy czekać na odpowiedź serwera 9 razy, osobno na każdy z elementów:

for($j=0;$j -lt $itemki.Count ;$j++)
  {
      $itemki[$j].ResetRoleInheritance()
     $ctx.ExecuteQuery()
       
  }

12. Ale to nie jest bardzo wydajne. Wyobraźmy sobie, że lista programu SharePoint Online ma 5000 elementów i chcielibyśmy skontaktować się z serwerem 5000 razy - w pewnym momencie skrypt może nawet zostać zablokowany jako podejrzenie DDOS lub dla ochrony innych ogólnej wydajości SharePoint Online ( de facto nigdy nie nastąpi to przy 5000 elementach, serwery Microsoftu są o wiele bardziej wydajne :)). 

13. CSOM obsługuje żądania dozowania. Oznacza to, że w jednym wywołaniu metody ExecuteQuery szereg operacji można składać do serwera kilka żądań. Pozwala to zminimalizować liczbę zapytań, które są przekazywane między klientem a serwerem, Metoda ExecuteQuery() może zawierać jedną lub wiele operacji. Najlepszą praktyką jest zatem zminimalizowanie liczby połączeń przy użyciu $ctx.ExecuteQuery(). 

for($j=0;$j -lt $itemki.Count ;$j++)
  {
      $itemki[$j].ResetRoleInheritance()
  }
  
$ctx.ExecuteQuery()

14. W powyższym przykładzie wszystkie moje 9 elementów zostanie przetworzonych za jednym zamachem.

Pełen skrypt można znaleźć tutaj.

Inne języki

Ten artykuł jest dostępny również w innych językach:

SharePoint Online: Powershell to delete unique permissions in all list items

free web stats