SharePoint Benutzer und deren Berechtigungen mit PowerShell auslesen

2. Juli 2012

Dieser Artikel beschreibt, wie mittels einfacher PowerShell-Kommandos die Benutzer und Berechtigungen von einer Site Collection eines SharePoint Servers ausgelesen werden können.

Durch das PowerShell SharePoint-AddIn werden eine Fülle von Befehlen bereitgestellt, mit denen man Informationen aus dem SharePoint 2010 auslesen, anlegen oder aber auch den SharePoint konfigurieren kann.

Das folgende PowerShell-Commandlet ist folgendermaßen aufgebaut:

  1. Hinzufügen des SharePoint Powershell-AddIn
  2. Abfrage aller Benutzer und deren Berechtigungen über den Befehl Get-SPUser
  3. Speichern der Informationen in einem Objekt für eine spätere Ausgabe

In diesem Fall möchten wir die folgenden Benutzer und deren Berechtigungsinformationen ausgeben:

  • Loginname
  • Benutzername
  • explizite Benutzerrolle
  • Benutzerrolle innerhalb der Gruppe
  • Gruppe(n)
param($Site = "<Name der Site Collection>")

if((Get-PSSnapin -Name "Microsoft.SharePoint.PowerShell" -EA 0) -eq $null)
{
  Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}


#Auslesen aller Benutzer mit Detailinformationen wie Gruppen, Rollen, etc. innerhalb der aktuellen Site Collection Url.
$users = Get-SPUser -Web $Site -ErrorAction Stop | select UserLogin, DisplayName, @{Label="ExplicitGivenRoles";expression={$_.Roles}}, @{Label="RolesGivenViaGroups";expression={$_.Groups | %{$_.Roles}}}, Groups

$users | foreach{
    $strGroups = ""
    $strGroupWithoutPraefix = ""
    $_.Groups | foreach{$strGroups += "$_, "}
    if($strGroups -ne "")
    {$strGroupWithoutPraefix = $strGroups.Substring(0,$strGroups.Length-2)}
    $object = New-Object PSObject
        $object | add-member noteproperty -name "UserLogin" -value $_.UserLogin
        $object | add-member noteproperty -name "DisplayName" -value $_.DisplayName
        $object | add-member noteproperty -name "ExplicitRoles" -value $_.ExplicitGivenRoles
        $object | add-member noteproperty -name "GroupRoles" -value $_.RolesGivenViaGroups
        $object | add-member noteproperty -name "SPGroup" -value $strGroupWithoutPraefix
        $object
}

Fazit

Das innerhalb dieses Artikels beschriebene Powershell-Commandlet ermöglicht es, mit wenigen Zeilen Code die Benutzer und Berechtigungen einer Site Collection im SharePoint Server auszulesen.
 
Zusätzlich zum aktuell verwendeten Commandlet Get-SPUser, existieren innerhalb des SharePoint SnapIns noch weitere Commandlets, welche Sie auf den Microsoft Technet noch näher erläutert finden.

  • Hallo Anonym.

    Das Skript liefert auch die AD-Gruppen zurück, die Zugriff auf die SiteCollection haben.
    Wenn man das Skript ein wenig erweitert, kann man mit Hilfe der Windows Claims diese identifizieren und Sortieren.
    Eine Übersicht über die ClaimTypes findest du unter
    http://www.wictorwilen.se/Media/Default/Windows-Live-Writer/How-Claims-encoding-works-in-SharePoint-_14813/image_10.png

    Ersetzte den Teil ab "$users | foreach{…" mit dem folgenden
    $userList = @()
    $users | foreach{
    $claimType = ""
    if($_.UserLogin.Split("|")[0].substring(3,1) -eq "#") { $claimType = "User"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "+") { $claimType = "Gruppe"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq ".") { $claimType = "Anonym"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "S") { $claimType = "Emailadresse"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "!") { $claimType = "Identity Provider"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "-") { $claimType = "Rolle"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "%") { $claimType = "Farm"}
    elseif($_.UserLogin.Split("|")[0].substring(3,1) -eq "?") { $claimType = "Namensidentifizierer"}
    else { $claimType = "Andere"}

    $strGroups = ""
    $strGroupWithoutPraefix = ""
    $_.Groups | foreach{$strGroups += "$_, "}
    if($strGroups -ne "")
    {$strGroupWithoutPraefix = $strGroups.Substring(0,$strGroups.Length-2)}
    $object = New-Object PSObject
    $object | add-member noteproperty -name "ClaimType" -value $claimType
    $object | add-member noteproperty -name "UserLogin" -value $_.UserLogin
    $object | add-member noteproperty -name "DisplayName" -value $_.DisplayName
    $object | add-member noteproperty -name "ExplicitRoles" -value $_.ExplicitGivenRoles
    $object | add-member noteproperty -name "GroupRoles" -value $_.RolesGivenViaGroups
    $object | add-member noteproperty -name "SPGroup" -value $strGroupWithoutPraefix
    $userList += $object
    }
    $userList | Sort-Object ClaimType

    Jetzt sollte deine Ausgabe nach den ClaimTypes sortiert sein.

    VG
    Thomas

  • Hallo,
    ist es möglich auch eine Ausgabe mit hineinzubringen, auf welche Website die User berechtigt sind?
    Sprich eine Auflistung wie bei den Gruppen, nur das hier die ganzen Website aufgelistet sind wo der User hinzugefügt wurden ist?

  • Hallo Anonym.
    Ja, das ist möglich. Jedoch macht es aus meiner Sicht keinen Sinn, da die Berechtigungen des Benutzers auf den Websites unterschiedlich sein kann/wird.

    Lösung: Du müsstest mit dem Benutzer über alle Websites/Subsites iterieren.

  • Hallo, habe den Track verfolgt. Letzeres wäre genau das, was ich bräuchte eine Iteration über alle Subsites. Gibt es den Code dafür schon irgendwo ?

Dein Kommentar wartet auf Freischaltung.

Artikel kommentieren