ค้นหาเว็บไซต์

SharePoint 2013/2016: รายงานการวิเคราะห์สิทธิ์ผู้ใช้เฉพาะโดยใช้ PowerShell


การวิเคราะห์สิทธิ์ของ SharePoint สำหรับผู้ใช้รายใดรายหนึ่งมักเป็นงานทั่วไปในการดูแลระบบของ SharePoint โดยทั่วไป เราจะตรวจสอบสิทธิ์ที่ผู้ใช้มีในเนื้อหา SharePoint ได้อย่างไร โดยเข้าไปที่หน้าการตั้งค่าเว็บไซต์หรือรายการและตรวจสอบสิทธิ์ของผู้ใช้เฉพาะรายใช่หรือไม่? คุณอาจต้องการวิเคราะห์สิทธิ์ของผู้ใช้เฉพาะสำหรับสภาพแวดล้อม SharePoint ทั้งหมดของคุณ แล้วเรื่องนั้นล่ะ? แต่ละไซต์ SharePoint รายการ ไลบรารี โฟลเดอร์ และรายการอาจมีสิทธิ์ที่ไม่ซ้ำกัน อาจมีความท้าทายมากขึ้นเมื่อคุณมีฟาร์ม SharePoint หลายแห่ง

PowerShell เป็นผู้ช่วยชีวิต! โซลูชันการรายงานสิทธิ์ของฉันคือการสแกนและจัดทำรายงานเพื่อดูสิทธิ์ของผู้ใช้บนเว็บแอปพลิเคชัน SharePoint ด้วยสคริปต์นี้ คุณสามารถวิเคราะห์และติดตามความปลอดภัยได้อย่างมีประสิทธิภาพ! ตรวจสอบสิทธิ์ในบัญชีที่ได้รับในทุกที่ใน SharePoint สคริปต์ PowerShell นี้จะสแกนพื้นที่ด้านล่างเพื่อดึงสิทธิ์การเข้าถึงของผู้ใช้เฉพาะ:

  • กลุ่มผู้บริหารฟาร์ม
  • นโยบายเว็บแอปพลิเคชันการดูแลระบบจากส่วนกลาง
  • ผู้ดูแลไซต์คอลเลกชัน
  • สแกนไซต์คอลเลกชันและไซต์ย่อยทั้งหมดด้วยสิทธิ์เฉพาะที่ผู้ใช้สามารถเข้าถึงได้
  • สแกนรายการและไลบรารีทั้งหมดด้วยสิทธิ์เฉพาะที่ผู้ใช้สามารถเข้าถึงได้
  • สแกนโฟลเดอร์และรายการทั้งหมดที่มีสิทธิ์ในไซต์ที่ผู้ใช้สามารถเข้าถึงได้

เพียงเปลี่ยนส่วนตัวแปรอินพุต ระบุพารามิเตอร์สำหรับ ID ผู้ใช้ แอปพลิเคชันเว็บ และตัวแปรเส้นทางรายงาน และเรียกใช้สคริปต์ใน PowerShell

หลังจากสร้างรายงานสิทธิ์ของ SharePoint แล้ว สคริปต์นี้จะสร้างไฟล์ CSV ซึ่งสามารถส่งออกเป็นไฟล์ Excel เพื่อการวิจัยและวิเคราะห์เพิ่มเติมภายนอกสภาพแวดล้อมของ SharePoint ได้รับข้อมูลเช่น: Object, Title, URL, Permission Type, Permissions ดังในภาพหน้าจอด้านล่าง

สคริปต์ PowerShell เพื่อสร้างรายงานสิทธิ์ของผู้ใช้ใน SharePoint 2013/2016


Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Function to retrieve Permission data
Function Get-PermissionInfo([String]$UserID, [Microsoft.SharePoint.SPSecurableObject]$Object)
{
    #Object Array to hold Permission data
    $PermissionDataCollection = @()
    if($Object)
    {
       #Determine the given Object type and Get URL of it
       switch($Object.GetType().FullName)
       {
           "Microsoft.SharePoint.SPWeb"  { $ObjectType = "Site" ; $ObjectURL = $Object.URL }
           "Microsoft.SharePoint.SPListItem" 
           { 
           if($Object.Folder -ne $null)
           {
               $ObjectType = "Folder" ; $ObjectURL = "$($Object.Web.Url)/$($Object.Url)" 
           }
           else
           {
               $ObjectType = "List Item"; $ObjectURL = "$($Object.Web.Url)/$($Object.Url)" 
           }
       }
       #Microsoft.SharePoint.SPList, Microsoft.SharePoint.SPDocumentLibrary, "Microsoft.SharePoint.SPPictureLibrary",etc
       default { $ObjectType = "List/Library"; $ObjectURL = "$($Object.ParentWeb.Url)/$($Object.RootFolder.URL)" }
    }
 
   #Get Permissions of the user on given object - Such as: Web, List, Folder, ListItem
   $UserPermissionInfo = $Object.GetUserEffectivePermissionInfo($UserID)

   #Iterate through each permission and get the details
   foreach($UserRoleAssignment in $UserPermissionInfo.RoleAssignments)
   {
        #Get all permission levels assigned to User account directly or via SharePOint Group
        $UserPermissions=@()
        foreach ($UserRoleDefinition in $UserRoleAssignment.RoleDefinitionBindings)
        {
            #Exclude "Limited Accesses"
            if($UserRoleDefinition.Name -ne "Limited Access")
            {
                 $UserPermissions += $UserRoleDefinition.Name
            }
        }
 
      #Determine Permissions granted directly or through SharePoint Group
      if($UserPermissions)
      {
          if($UserRoleAssignment.Member -is [Microsoft.SharePoint.SPGroup])   
          {
              $PermissionType = "Member of SharePoint Group: " + $UserRoleAssignment.Member.Name     
          }
      else
      {
            $PermissionType = "Direct Permission"
      }
        $UserPermissions = $UserPermissions -join ";"  
 
         #Create an object to hold storage data
         $PermissionData = New-Object PSObject
         $PermissionData | Add-Member -type NoteProperty -name "Object" -value $ObjectType
         $PermissionData | Add-Member -type NoteProperty -name "Title" -value $Object.Title
         $PermissionData | Add-Member -type NoteProperty -name "URL" -value $ObjectURL  
         $PermissionData | Add-Member -type NoteProperty -name "Permission Type" -value $PermissionType
         $PermissionData | Add-Member -type NoteProperty -name "Permissions" -value $UserPermissions
         $PermissionDataCollection += $PermissionData
       }    
    }  
    Return $PermissionDataCollection
  }
}

#Function to Generate Permission Report
Function Generate-PermissionReport($UserID, $WebAppURL, $ReportPath)
{
    #Output Report location, delete the file, If already exist!
    if (Test-Path $ReportPath)
     {
        Remove-Item $ReportPath
     }
  
    #Write Output Report CSV File Headers
    "Object, Title, URL, Permission Type, Permissions" | out-file $ReportPath

    ###Check Whether the Search Users is a Farm Administrator ###
    Write-host "Scanning Farm Administrators..." 
    #Get the SharePoint Central Administration site
    $AdminWebApp = Get-SPwebapplication -includecentraladministration | where {$_.IsAdministrationWebApplication}
    $AdminSite = Get-SPWeb $AdminWebApp.Url
    $AdminGroupName = $AdminSite.AssociatedOwnerGroup
    $FarmAdminGroup = $AdminSite.SiteGroups[$AdminGroupName]
 
    #enumerate in farm adminidtrators groups
    foreach ($user in $FarmAdminGroup.users)
    {
      if($user.LoginName.Endswith($UserID,1)) #1 to Ignore Case
      {
       "Farm, $($AdminSite.Title), $($AdminWebApp.URL), Farm Administrators Group, Farm Administrator" | Out-File $ReportPath -Append
     }     
    }
 
   ### Check Web Application User Policies ###
  Write-host "Scanning Web Application Policies..." 
  $WebApp = Get-SPWebApplication $WebAppURL
 
  foreach ($Policy in $WebApp.Policies)
  {
      #Check if the search users is member of the group
      if($Policy.UserName.EndsWith($UserID,1))
      {
         #Write-Host $Policy.UserName
         $PolicyRoles=@()
         foreach($Role in $Policy.PolicyRoleBindings)
         {
            $PolicyRoles+= $Role.Name +";"
         }
          #Send Data to CSV File
          "Web Application, $($WebApp.Name), $($WebApp.URL), Web Application Policy, $($PolicyRoles)" | Out-File $ReportPath -Append
      }
  }

    #Convert UserID Into Claims format - If WebApp is claims based! Domain\User to i:0#.w|Domain\User
    if($WebApp.UseClaimsAuthentication)
    {
        $ClaimsUserID = (New-SPClaimsPrincipal -identity $UserID -identitytype 1).ToEncodedString()
    }
     else
    {
        $ClaimsUserID = $UserID
    }
 #Get all Site collections of given web app
 $SiteCollections = Get-SPSite -WebApplication $WebAppURL -Limit All

    #Loop through all site collections 
    foreach($Site in $SiteCollections)
    {
       Write-host "Scanning Site Collection:" $site.Url
       ###Check Whether the User is a Site Collection Administrator
       foreach($SiteCollAdmin in $Site.RootWeb.SiteAdministrators)
       {
          if($SiteCollAdmin.LoginName.EndsWith($ClaimsUserID,1))
          {
            "Site Collection, $($Site.RootWeb.Title), $($Site.RootWeb.Url), Site Collection Administrators Group, Site Collection Administrator" | Out-File $ReportPath -Append
          }     
      }
  
  #Get all webs
  $WebsCollection = $Site.AllWebs
  #Loop throuh each Site (web)
  foreach($Web in $WebsCollection)
  {
       if($Web.HasUniqueRoleAssignments -eq $True)
       {
          Write-host "Scanning Site:" $Web.Url
    
          #Get Permissions of the user on Web
          $WebPermissions = Get-PermissionInfo $ClaimsUserID $Web
     
          #Export Web permission data to CSV file - Append
          $WebPermissions |  Export-csv $ReportPath  -notypeinformation -Append 
       } 
    
    #Check Lists with Unique Permissions
    Write-host "Scanning Lists on $($web.url)..."
    foreach($List in $web.Lists)
    {
        if($List.HasUniqueRoleAssignments -eq $True -and ($List.Hidden -eq $false))
        {
             #Get Permissions of the user on list
             $ListPermissions = Get-PermissionInfo $ClaimsUserID $List
      
            #Export Web permission data to CSV file - Append
            $ListPermissions |  Export-csv $ReportPath -notypeinformation -Append       
        }
    
     #Check Folders with Unique Permissions
     $UniqueFolders = $List.Folders | where { $_.HasUniqueRoleAssignments -eq $True }                    
     #Get Folder permissions
     foreach($folder in $UniqueFolders)
     {
         $FolderPermissions = Get-PermissionInfo $ClaimsUserID $folder
    
         #Export Folder permission data to CSV file - Append
         $FolderPermissions |  Export-csv $ReportPath -notypeinformation -Append    
      }
    
     #Check List Items with Unique Permissions
     $UniqueItems = $List.Items | where { $_.HasUniqueRoleAssignments -eq $True }
     #Get Item level permissions
     foreach($item in $UniqueItems)
     {
         $ItemPermissions = Get-PermissionInfo $ClaimsUserID $Item
      
         #Export List Items permission data to CSV file - Append
         $ItemPermissions |  Export-csv $ReportPath -notypeinformation -Append    
     }
    }
  }
 }
 Write-Host Permission Report Generated successfully!
}

#Input Variables
$WebAppURL = "https://intranet.crescent.com"
$Userid ="Crescent\Salaudeen" 
$ReportPath = "D:\Reports\PermissionRpt.csv"

#Call the function to generate user access report
Generate-PermissionReport $Userid $WebAppURL $ReportPath

คุณยังสามารถดาวน์โหลดสคริปต์ได้จากแกลเลอรี TechNet: รายงานสิทธิ์ของ SharePoint: ตรวจสอบสิทธิ์การเข้าถึงสำหรับผู้ใช้ที่ระบุ

สคริปต์นี้แบ่งออกเป็นสองฟังก์ชัน เพื่อให้คุณสามารถใช้ฟังก์ชันแรก: รับ-PermissionInfo เพื่อรับข้อมูลสิทธิ์ที่กำหนดขอบเขตไปยังรายงานสิทธิ์ของไซต์คอลเลกชัน/ไซต์ สคริปต์ด้านบนมีการกำหนดขอบเขตไว้ที่เว็บแอปพลิเคชันเฉพาะ และคุณสามารถเรียกใช้ฟังก์ชันเดียวกันบนเว็บแอปพลิเคชันทั้งหมดของคุณเพื่อรับรายงานสิทธิ์ของ SharePoint ทั้งหมดได้

สคริปต์ PowerShell เพื่อสร้างรายงานสิทธิ์ของ SharePoint:

นี่คือรายการสคริปต์ PowerShell ของฉันเพื่อสร้างรายงานต่างๆ สำหรับการตรวจสอบสิทธิ์ของ SharePoint

  • รายงานสิทธิ์ของ SharePoint 2010: ตรวจสอบสิทธิ์การเข้าถึงสำหรับผู้ใช้ที่ระบุ
  • รายงานสิทธิ์ผู้ใช้และกลุ่ม SharePoint
  • รายงานสิทธิ์ที่ไม่ซ้ำใน SharePoint
  • รายงานเจ้าของไซต์คอลเลกชัน SharePoint
  • รายงานผู้ดูแลไซต์คอลเลกชันสำหรับไซต์ SharePoint ทั้งหมด
  • ส่งออกผู้ใช้และกลุ่ม SharePoint ไปยัง Excel โดยใช้ PowerShell
  • รายงานระดับสิทธิ์ของ SharePoint

เครื่องมือของบุคคลที่สาม:
มีเครื่องมือมากมายในการวิเคราะห์และตรวจสอบสิทธิ์ของผู้ใช้ SharePoint (และคุณลักษณะอื่นๆ ตามธรรมชาติ!) นี่คือบางส่วน:

  • ชุดเครื่องมือเอกสารสำหรับ SharePoint - SPDocKit
  • เครื่องมือการจัดการ SharePoint จาก Sharegate
  • รายงานสิทธิ์ของ SharePoint จาก BoostSolutions
  • การจัดการสิทธิ์ของ SharePoint
  • ControlPoint จาก Metalogix

บทความที่เกี่ยวข้อง