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.




PowerShell: Übersicht aller Site Collections mit Berechtigungen generieren

Geprüfte Antwort Dieser Beitrag hat 8 Antworten

Ohne Rang
19 Beiträge
Danielx90 erstellt 24 Feb. 2015 14:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich hoffe hier kann mir jemand weiterhelfen. Ich bin gerade dabei ein PowerShell-Skript zu erstellen, welches mir alle SiteCollections der Farm ausließt und später über eine Liste von Hyperlinks in SharePoint ausgibt. Dazu soll die Rechtevererbung auf Item-Ebene unterbrochen werden, damit jeder nur die Einträge sieht, für die er berechtigt ist. Leider werden anschließend aber die Berechtigungen auf Item-Ebene falsch gesetzt und ich habe keine Ahnung woher so mancher Eintrag kommt. Es handelt sich um AD-Gruppen und -Benutzer.

Ich habe folgendes Vorgehen:

$SiteForEntries = Get-SPWeb -Identity "XXX"
$ListForEntries = $SiteForEntries.Lists.TryGetList("SharePoint-Sites")
$PermissionLevel = "Read"

$sites = Get-SPSite -Limit ALL
foreach($site in $sites)
{
    $site = new-object Microsoft.SharePoint.SPSite($site.Url)
    $web = $site.openweb()
    $siteUsers = $web.SiteUsers

    $newItem = $ListForEntries.Items.Add()
    $newItem["Title"] = $web.Title
    $newItem["Site-URL"] = $web.URL
    $newItem.Update()
    $newItem.BreakRoleInheritance($False)
   
    foreach($user in $siteUsers)
    {       
        $group = $web.SiteUsers[$user]
        $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($group)
        $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
        $roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
        $newItem.RoleAssignments.Add($roleAssignment)
    }    
    $web.Dispose()
    $site.Dispose()
}

Es kann sein, dass bei manchen Links die Leute gar keine Berechtigung auf die Seite haben und manche, die eigentlich die Berechtigung haben, sehen den Link in der Liste aber nicht. Kann das überhaupt so funktionieren?

Viele Grüße Daniel

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Feb. 2015 15:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du gehst ja alle SiteUsers durch, aber diese Liste ist unvollständig. Sie enthält alle User, die der Site irgendwie bekannt sind (unabhängig der Berechtigungen). Das sind User, die sich schonmal in der Site angemeldet haben oder die von einem anderen User z.B. explizit in ein Personenfeld eingetragen wurden. Es enthält aber nicht die Benutzer, die aufgrund einer Gruppenmitgliedschaft die Berechtigung hätten, die Site aber noch nie besucht haben.

Wenn Du das richtig machen möchtest, müßtest Du tatsächlich nicht die User, sondern die Berechtigungen der Site durchgehen und dann jedem Berechtigten Leserecht auf Dein ListItem geben. Wenn Du dabei auf eine AD-Gruppe stößt, nimmst Du sie einfach mit. Wenn Du auf eine SharePoint-Gruppe stößt, nimmst Du ihre Mitglieder mit.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19 Beiträge
Danielx90 Als Antwort am 25 Feb. 2015 10:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Okay, dann war ich da natürlich vollkommen auf dem falschen Weg. Wieso speichert SharePoint solche Informationen denn ab? Gibt es dafür einen Grund?

Ich habe mein Skript dahingehend schon umgeschrieben, dass ich alle AD-User und Gruppen ausgelesen bekomme. Eine komplette Liste bekomme ich also erzeugt. Leider werden die Berechtigungen auf Item-Ebene aber trotzdem nicht richtig gesetzt.

Aktueller Stand:

$SiteForEntries = Get-SPWeb -Identity "XXX"
$ListForEntries = $SiteForEntries.Lists.TryGetList("SharePointSites")
$PermissionLevel = "Read"

#Create new entries for all sites within the SharePoint farm
$sites = Get-SPSite -Limit ALL
foreach($site in $sites) {

    $site = new-object Microsoft.SharePoint.SPSite($site.Url)
    $web = $site.openweb()
    $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
    
    $newItem = $ListForEntries.Items.Add()
    $newItem["Title"] = $web.Title
    $newItem["Site-URL"] = $web.URL
    $newItem.Update()
    $newItem.BreakRoleInheritance($False)
    $newItem.Update()

    $Permissions = $web.Permissions
    foreach($Permission in $Permissions)
    {
        if($Permission.Member -Match "DOMAIN\\")
        {
            $Permission.Member.LoginName
            $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($Permission.Member)
            $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
            $roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
            $newItem.RoleAssignments.Add($roleAssignment)
            $newItem.Update()
        }
    }
   
    $Groups = $site.RootWeb.SiteGroups
    foreach ($Group in $Groups)
    {
        foreach ($User in $Group.Users)
        {
            $User.LoginName
            $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($User)
            $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
            $roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
            $newItem.RoleAssignments.Add($roleAssignment)
            $newItem.Update()
        }
    }
      
    $web.Dispose()
    $site.Dispose()
   
}

An einer Stelle weiß ich leider auch nicht, ob das so Tip Top gelöst ist, indem ich das Member-Attribut mit der Domäne vergleiche: if($Permission.Member -Match "DOMAIN\\") - Da gibt es doch sicherlich auch einen besseren Weg für? Vor allem wenn es mehrere Domänen geben sollte. Am schönsten wäre es natürlich, wenn ich alle SharePoint internen Gruppen/User ausschließen könnte.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Feb. 2015 11:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was möchtest Du denn mit dem Domänen-Vergleich erreichen? SharePoint-Gruppen werden als SPGroup zur Verfügung gestellt. Alles aus dem AD als SPUser (mit der Eigenschaft IsDomainGroup zur Unterscheidung, ist aber hier egal).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19 Beiträge
Danielx90 Als Antwort am 25 Feb. 2015 11:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Am Anfang wollte ich die SharePoint internen Gruppen so ausschließen, aber da habe ich jetzt schon was schönes für gefunden.

if($Permission.Member -is [Microsoft.SharePoint.SPUser])
{
            $Permission.Member.LoginName
            #$group = $web.SiteUsers[$Permission.Member]
            $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($Permission.Member)
            $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
            $roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
            $newItem.RoleAssignments.Add($roleAssignment)
            $newItem.Update()
        }
        elseif ($Permission.Member -is [Microsoft.SharePoint.SPGroup])
        {
            $Permission.Member.LoginName
            foreach($User in $Permission.Member.Users)
            {
                "- " + $User.LoginName
                $roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($User)
                $roleDefinition = $web.RoleDefinitions[$PermissionLevel]
                $roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
                $newItem.RoleAssignments.Add($roleAssignment)
                $newItem.Update()
            }
}

Bleibt leider nur die Frage, wieso manche User nicht berechtigt werden oder das List-Item sehen, obwohl kein Zugriff auf die Seite möglich ist.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Feb. 2015 14:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Code setzt im Grunde das um, was ich oben geschrieben hatte ;-)

Nur zur Info: wenn man etwas an den Berechtigungen ändert, muß man hinterher kein Update() aufrufen. Das ist eine der wenigen Stellen, wo das implizit geschieht.

Die Lösung Deines Problems wirst Du allerdings selbst debuggen müssen...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Feb. 2015 08:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das hier ist ganz frisch auf Codeplex und könnte helfen. Ich habe es allerdings nicht getestet. http://spuniquepermissions.codeplex.com/

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19 Beiträge
Danielx90 Als Antwort am 26 Feb. 2015 09:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sehr gut, das mit den SiteUsern war natürlich doof, aber aus Fehlern lernt man ja bekannter Weise.

Ich bin jetzt schon so weit gegangen, dass ich mir alles ausgegeben lassen habe:

$Permission.Member.LoginName
$roleAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($Permission.Member)
$roleDefinition = $web.RoleDefinitions[$PermissionLevel]
$roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
$roleAssignment
$newItem.RoleAssignments.Add($roleAssignment)
"#"
foreach($assignment in $newItem.RoleAssignments)
{
        $assignment
}
"#"

Ergebnis:

DOMAIN\MeinUser
DOMAIN\MeinUser         {Read}
#
DOMAIN\MeinUser         {Full Control, R... Microsoft.ShareP... Microsoft.ShareP...
#

SHAREPOINT\system
SHAREPOINT\system   {Read}                                                    
#
DOMAIN\User         {Full Control, R... Microsoft.ShareP... Microsoft.ShareP...
SHAREPOINT\system         {Read}              Microsoft.ShareP... Microsoft.ShareP...
#

DOMAIN\User2
DOMAIN\User2         {Read}
#
DOMAIN\MeinUser         {Full Control, R... Microsoft.ShareP... Microsoft.ShareP...
SHAREPOINT\system         {Read}              Microsoft.ShareP... Microsoft.ShareP...
#

Mit meinem User habe ich immer die Berechtigung, weil ich ja die Vererbung unterbreche und diese dann zumindest für meinen User übernommen werden. Das Role Assignment scheint auch zu stimmen, aber an der Stelle, wo die Rolle dem List Item hinzugefügt wird scheint es einen Fehler zu geben. Nur ohne Fehlermeldung ist das irgendwie sehr schwer rauszubekommen, woran es jetzt genau liegt. Ich forsche trotzdem mal weiter. Das auf Codeplex hilft leider nicht wirklich weiter, trotzdem Danke!

Ohne Rang
19 Beiträge
Danielx90 Als Antwort am 26 Feb. 2015 10:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, es lag an zwei kleinen Sachen:

"UserName: " + $Permission.Member.LoginName
$siteUser = $SiteForEntries.EnsureUser($Permission.Member.LoginName)
$roleDefinition = $SiteForEntries.RoleDefinitions[$PermissionLevel]
$roleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment($siteUser)
$roleAssignment.RoleDefinitionBindings.Add($roleDefinition)
$roleAssignment
$newItem.RoleAssignments.Add($roleAssignment);

Falsches Web-Objekt benutzt und der User muss der Website bekannt gemacht werden.. Hätte ich auch vorher drauf kommen können. Naja, jedenfalls funktioniert es jetzt!

Andi, vielen Dank für Deine Hilfe!