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

รายงานป้ายกำกับความไวที่กำหนดให้กับเอกสาร SharePoint Online


ดึงข้อมูลป้ายกำกับระดับความลับสำหรับเอกสาร SharePoint Online

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

สิ่งหนึ่งที่ฉันไม่สามารถรายงานได้คือไฟล์ที่รายงานมีป้ายกำกับความลับหรือไม่ ฉันเคยสร้างสคริปต์ในอดีตเพื่อเรียกค้นไฟล์ที่มีป้ายกำกับความลับ (ตัวอย่างนี้ให้โอกาสในการถอดรหัสไฟล์ที่มีป้ายกำกับความลับโดยใช้ Unlock-SPOSensitivityLabelEncryptedFile cmdlet) โดยที่คำขอเหมือนกับที่แสดงด้านล่างนี้ดึงข้อมูล ข้อมูลที่จำเป็น:

$Uri = "https://graph.microsoft.com/v1.0/sites/$($Siteid)/lists/Documents/Drive/Items/$($DriveId)/children?`$select=sensitivitylabel,weburl,name"} 
[array]$Files = (Invoke-RestMethod -Uri $URI -Headers $Headers -Method Get -ContentType "application/json")

ฉันสามารถดำเนินการตามเส้นทางนั้นต่อไปเพื่อดึงข้อมูลป้ายกำกับความลับได้ แต่ฉันตัดสินใจใช้ extractSensitivityLabels API ใหม่ ความแตกต่างที่สำคัญของ API นี้คือเมื่อคุณใช้งาน API จะอัปเดต “ข้อมูลเมตาของรายการไดรฟ์ด้วยรายละเอียดล่าสุดของป้ายกำกับที่กำหนด” ดังที่เราจะเห็นว่า API ในด้านนี้อาจมีผลข้างเคียงที่ไม่คาดคิดได้

นอกจากนี้ API ยังจัดการการแยก “ป้ายกำกับความลับตั้งแต่หนึ่งรายการขึ้นไปที่กำหนดให้กับรายการไดรฟ์” ฉันไม่ทราบว่าเอกสาร SharePoint Online สามารถมีป้ายความลับได้มากกว่าหนึ่งป้าย แต่เห็นได้ชัดว่าสามารถทำได้หากเอกสารส่งผ่านจากผู้เช่ารายหนึ่งไปยังอีกรายหนึ่งและสะสมป้ายชื่อจากผู้เช่าแต่ละราย อย่างไรก็ตาม เมื่อผู้ใช้ติดป้ายกำกับที่มีการเข้ารหัส เอกสารจะสามารถจัดเก็บเฉพาะป้ายกำกับนั้นได้

การวางแผนและการรวมแพลตฟอร์มการโยกย้าย Microsoft ของ Quest

การเปลี่ยนแปลงที่ทำเพื่อดึงข้อมูลป้ายกำกับความไว

เพื่อทดสอบ API ฉันได้เพิ่มโค้ดบางส่วนลงในฟังก์ชัน UnpackFilesRecursively ในสคริปต์ต้นฉบับ (มีให้จาก GitHub) หากคุณต้องการลองใช้สคริปต์ ให้ดาวน์โหลดสคริปต์และแทรกโค้ดต่อไปนี้เพื่อแทนที่ฟังก์ชัน UnpackFilesRecursively ดั้งเดิม:

Function UnpackFilesRecursively {
# Unpack set of items (files and folders)
param (
        [parameter(Mandatory = $true)]
        $Items, # Items to unpack
	
		[parameter(Mandatory = $true)]
        $SiteUri, # Base site URI
		
		[parameter(Mandatory = $true)]
        $FolderPath, # Folder path
		
        [parameter(Mandatory = $true)]
        $SiteFiles,
		
		[parameter(Mandatory = $false)]
		[bool]$IsNextLink
    )

  # Sensitivity label document types
  [array]$ValidDocumentTypes = "docx", "pptx", "xlsx", "pdf"
  # Find sub-folders that we need to check for files
  [array]$Folders = $Items.Value | Where-Object {$_.Folder.ChildCount -gt 0 }
  # And any files in the folder
  [array]$Files = $Items.Value | Where-Object {$_.Folder.ChildCount -eq $Null}
  
  $before = $SiteFiles.count
  
  # Report the files
  ForEach ($D in $Files) {
    $LabelName = $Null
    $FileSize = FormatFileSize $D.Size
    # Check Sensitivity label
    $Type = $D.Name.Split(".")[1]
    If ($Type -in $ValidDocumentTypes) { 
     # Write-Host "Processing filename:" $D.Name
      $Uri = ("https://graph.microsoft.com/beta/sites/{0}/drive/items/{1}/extractSensitivityLabels" -f $Site.Id, $D.id)
      Try {
         $LabelsInfo = Invoke-MgGraphRequest -Uri $Uri -Method POST }
      Catch {
         Write-Host ("Failure reading data from file {0}" -f $D.Name) 
         $LabelsInfo = $Null
      }
      # Resolve sensitivity label identifier if one is found to find label name
      If ($LabelsInfo.labels.sensitivityLabelId) { 
      #  Write-Host "Label Id" $LabelsInfo.labels.sensitivityLabelId 
        $LabelName = $LabelsHash[$LabelsInfo.labels.sensitivityLabelId ]
     } # End if Label data
    } # End if type
    $ReportLine  = [PSCustomObject] @{   
        FileName            = $D.Name
        Folder              = $FolderPath
        Author              = $D.createdby.user.displayname
        Created             = $D.createdDateTime
        Modified            = $D.lastModifiedDateTime
        Size                = $FileSize
        'Sensitivity Label' = $LabelName
        Uri                 = $D.WebUrl 
        Id                  = $D.Id}
     $SiteFiles.Add($ReportLine) 
  } # End If

  $NextLink = $Items."@odata.nextLink"
  $Uri = $Items."@odata.nextLink"
  While ($NextLink) { 
    $MoreData = Invoke-MgGraphRequest -Uri $Uri -Method Get
    UnpackFilesRecursively -Items $MoreData -SiteUri $SiteUri -FolderPath $FolderPath -SiteFiles $SiteFiles -IsNextLink $true
  
    $NextLink = $MoreData."@odata.nextLink"
    $Uri = $MoreData."@odata.nextLink" 
  } # End While
  
  $count = $SiteFiles.count - $before
  if (-Not $IsNextLink) {
    Write-Host "  $FolderPath ($count)"
  }
  
  # Report the files in each sub-folder
  ForEach ($Folder in $Folders) {
	$NewFolderPath = $FolderPath + "/" + $Folder.Name
	$Uri = $SiteUri + "/" + $Folder.parentReference.path + "/" + $Folder.Name + ":/children"
	$SubFolderData = Invoke-MgGraphRequest -Uri $Uri -Method Get
    UnpackFilesRecursively -Items $SubFolderData -SiteUri $SiteUri -FolderPath $NewFolderPath -SiteFiles $SiteFiles -IsNextLink $IsNextLink
  } # End Foreach Folders
}

คุณจะเห็นว่าสคริปต์ประกาศชุดนามสกุลไฟล์ และจะตรวจสอบป้ายกำกับความลับ ฉันได้เพิ่มส่วนขยายสำหรับ Word, PowerPoint, Excel และ PDF ลงในอาร์เรย์แล้ว เมื่อเวลาผ่านไป เนื่องจาก Microsoft Information Protection รองรับประเภทไฟล์เพิ่มเติม จึงสามารถเพิ่มนามสกุลของไฟล์เหล่านั้นได้

การตีความข้อมูลฉลากความไว

ข้อมูลที่ส่งคืนสำหรับไฟล์มีลักษณะดังนี้:

Name                           Value
----                           -----
tenantId                       a662313f-14fc-43a2-9a7a-d2e27f4f3478
assignmentMethod               standard
sensitivityLabelId             1b070e6f-4b3c-4534-95c4-08335a5ca610

ไม่ใช่ทุกคนที่พูด GUID ได้อย่างคล่องแคล่ว ดังนั้นเพื่อตีความตัวระบุป้ายกำกับความลับเป็นชื่อป้ายกำกับ เราจึงสร้างตารางแฮชเพื่อเก็บตัวระบุป้ายกำกับและชื่อที่สคริปต์สามารถค้นหาได้ รหัสนี้จะต้องทำงานเมื่อเริ่มต้นสคริปต์:

Connect-IPPSSession
[Array]$LabelData = Get-Label | Select-Object ImmutableId, DisplayName
$Global:LabelsHash = @{}
ForEach ($L in $LabelData) {$LabelsHash.Add([string]$L.ImmutableId,[string]$L.DisplayName) }

ทุกอย่างทำงานได้ดีมาก (รูปที่ 1) โดยมีข้อแม้ที่ตอนนี้สคริปต์สร้างคำขอกราฟเพิ่มเติมสำหรับเอกสารทุกฉบับที่มีประเภทไฟล์ที่รองรับ ซึ่งจะทำให้การประมวลผลช้าลงอย่างหลีกเลี่ยงไม่ได้ ฉันรันสคริปต์กับไลบรารีเอกสารที่เก็บไฟล์ไว้หลายพันไฟล์ และประสิทธิภาพการทำงานก็ไม่เป็นที่ยอมรับ อาจใช้เวลาประมาณวินาทีในการดึงข้อมูลฉลากสำหรับเอกสารที่มีขนาดใหญ่มาก (เช่น เอกสาร Word ขนาด 1,400 หน้า 38 MB) แต่ไฟล์ที่มีขนาดเล็กกว่าจะไม่ทำให้เกิดความล่าช้ามากนัก

เอกสารไม่ตรงกัน

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

รายงานการกำกับดูแลข้อมูล

ข้อดีประการหนึ่งของสิทธิ์การใช้งาน Microsoft Syntex-SharePoint Advanced Management คือผู้ดูแลระบบสามารถเข้าถึงรายงานการกำกับดูแลข้อมูลผ่านทางศูนย์การจัดการ SharePoint Online (รูปที่ 2)

รายงานการกำกับดูแลข้อมูลไม่ได้มีอะไรพิเศษและไม่ใช่เหตุผลที่ดีในการซื้อใบอนุญาตการจัดการขั้นสูงอย่างแน่นอน คุณสามารถทำงานให้ดีขึ้นได้ด้วยตัวเองด้วย PowerShell รวมถึงเอาต์พุตไปยัง (ด้วยโมดูล PSWriteHTML) หรือ Excel (ด้วยโมดูล ImportExcel) หากคุณสนใจสิทธิ์การใช้งาน Microsoft Syntex-SharePoint Advanced Management ให้เน้นไปที่ฟีเจอร์ต่างๆ เช่น การบล็อกการดาวน์โหลดสำหรับการบันทึก Teams Meeting คุณจะมีความสุขมากขึ้น

จุดต่อไป การกำหนดป้ายกำกับความไวด้วยกราฟ API

นอกจาก API เพื่อดึงข้อมูลป้ายกำกับความลับสำหรับเอกสาร SharePoint Online แล้ว assignSensitivityLabel Graph API ยังพร้อมใช้งานในการกำหนดป้ายกำกับความลับให้กับเอกสาร ปัญหาคือ API นี้มีการตรวจวัดและป้องกัน แบบคิดค่าบริการตามปริมาณข้อมูลหมายความว่าคุณชำระเงินเพื่อใช้ผ่านการสมัครใช้งาน Azure ได้รับการป้องกันหมายความว่า Microsoft ต้องให้ความยินยอมแก่แอปเพื่อใช้ API ฉันได้ยื่นขออนุญาตและเตรียม Azure เพื่อรับการเรียกเก็บเงิน เมื่อ Microsoft ตกลง ฉันจะรายงานกลับเกี่ยวกับการใช้ API เพื่อกำหนดป้ายกำกับความลับ

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