SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Benutzerberechtigung entfernen per PowerShell

Unbeantwortet Dieser Beitrag hat 11 Antworten

Ohne Rang
253 Beiträge
BBB erstellt 12 Nov. 2013 11:25
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen, ich habe (malwieder) ein (hoffentlich) kleines Problem.

In einer Websitesammlung sollen für eine Benutzergruppe die Berechtigungen in jeder Liste, jeder Unterwebsite usw. entfernt werden. Das Problem dabei ist, dass einige Listen und Unterwebsites eigene Berechtigungen haben.  Ich habe ein Skript gefunden das das auf Website-/Unterwebsite-Ebene macht, nur leider nicht auf Listen-Ebene/Element-Ebene. Da ich ein Anfänger hinsichtlich PowerShell bin, weiß ich nicht wie ich es anpassen kann, damit das Skript auch auf Listenebene/Element-Ebene funktioniert. Wie kann ich Listen und Elemente mit der PowerShell ansprechen?

viele Grüße

BBB

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Nov. 2013 12:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was macht denn das Script derzeit? Und willst Du das für fest definierte Listen oder soll das Script einfach alle Sites, alle Listen und alle Elemente durchgehen?

Im Prinzip kannst Du sowas machen:

$lists = $web.Lists
foreach ($list in $lists) {
  $items = $list.Items
  foreach ($item in $items) {

  }
}

Das eigentliche Bearbeiten der Berechtigungen geht auf jeder Ebene (Website, Liste, Element) identisch, weil alles von SPSecurableObject erbt. Wenn Du prüfen möchtest, ob ein Objekt eigene Berechtigungen hat (anstatt sie zu erben), dann prüfe dessen HasUniqueRoleAssignments-Eigenschaft.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
253 Beiträge
BBB Als Antwort am 12 Nov. 2013 13:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Momentan geht das Skript die Website und die Unterwebsites durch und überprüft ob geerbt wird oder nicht, wenn nicht geerbt wird dann wird die Berechtigung entfernt.   Das erfolgt innerhalb einer Funktion die zum Schluss aufgerufen wird. Das klappt auch sehr gut.

Ich möchte dass das Skript alle Sites, alle Listen und alle Elemente durchgeht,  wenn eigene Berechtigung dann soll die Berechtigung für den festen Benutzer entfernt werden.

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Nov. 2013 13:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das sollte sich dann ja sehr einfach entsprechend erweitern lassen. Die Funktion, die die Berechtigungen ändert, kannst Du ja für Webs, Listen und Listenelemente aufrufen (wie oben erwähnt).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
253 Beiträge
BBB Als Antwort am 12 Nov. 2013 14:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

das versuche ich, irgendwie funzt das einfach nicht. Aber vielleicht habe ich ja auch einen Denkfehler.

hier ein Code-Ausschnitt:

function RemoveAccountFromAllList ($URL, $ListName, $accountName)
{
    #Get Site Collection
    $web = Get-SPWeb $URL
    $list = $web.Lists
    
    #Step through each site in the site collection
    $list | ForEach-Object {
       
            #Check if the current site is inheriting permissions from its parent
            #If not, remove permissions on current site
            if ($_.HasUniqueRoleAssignments) {
                write-host "Removing account" $accountName "from site" $_.Url
                $_.RoleAssignments.Remove($account)
            }

Irgendwie steck ich fest.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Nov. 2013 14:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich bevorzuge ja die Syntax foreach ($list in $lists)...

Deine Schleife $list | ForEach-Object iteriert ja über die Listen des Webs. Über den $_ Shortcut greifst Du innerhalb der Schleife  auf das jeweils gültige Objekt zu. Und dabei ist beim Kopieren des Codes ein Fehler geblieben: $_.Url geht nur bei Webs, aber nicht bei Listen.

Also entweder (wenn die Url des Webs ausgegeben werden soll) dort ein $web.Url. Oder wenn die Url der Liste ausgegeben werden soll $_.DefaultViewUrl. Oder vielleicht noch besser der Name der Liste $_.Title

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
253 Beiträge
BBB Als Antwort am 13 Nov. 2013 09:07
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Hilfe, aber irgendwie funktioniert die "remove" nicht. Ich bekomme immer diese Fehlermeldung:

Ausnahme beim Aufrufen von "Remove" mit 1 Argument<en>: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

Bei Zeile=12 Zeichen=42

                            $_.RoleAssignments.Remoue «« <$account>

+ CategoryInfo : NotSpecified: <:> [], MethodlnvocationException

+ FullyQualifiedErrorld : DotNetMethodException

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 13 Nov. 2013 09:16
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da ist irgendeine Variable oder eine Eigenschaft null. Welche kann ich Dir nicht sagen, das mußt Du selbst beim Debuggen herausfinden. Hat denn $account einen Wert?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
253 Beiträge
BBB Als Antwort am 13 Nov. 2013 09:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deine Geduld und dafür das du mir das Brett entfernt hast ;-). Ich habe zu viel aus dem Ursprungscode gelöscht.

Nochmal Danke für die Hilfe.

Ohne Rang
253 Beiträge
BBB Als Antwort am 18 Nov. 2013 14:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe noch eine weitere Frage:

Wie kann ich zwei bestimmte Listen aus der Schleife herausnehmen? Denn mit einer -skip Anweisung weiß ich nicht genau, wie ich die genau einsetzen kann.

Hoffentlich kann mir einer weiterhelfen.

Viele Grüße

BBB

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Nov. 2013 14:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kommt drauf an, wie Du die beiden Listen erkennen kannst. In jedem Fall kannst Du alles innerhalb der Schleife in eine Bedingung packen und dabei prüfen, daß es sich nicht um diese Listen handelt. Beispiel:

if (-not $_.DefaultViewUrl.Contains("url1") -and -not $_.DefaultViewUrl.Conatins("url2")) {
  # hier die Schleife
}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
253 Beiträge
BBB Als Antwort am 20 Nov. 2013 14:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Antwort.

Aber irgendwie funktioniert das nicht. es wird immer ein fehler ausgespuckt.