Создание отчета о удержании в обнаружении электронных данных с помощью скрипта

Скрипт, приведенный в этой статье, позволяет администраторам обнаружения электронных данных и менеджерам по обнаружению электронных данных создавать отчет, содержащий сведения обо всех удержаниях, связанных с случаями обнаружения электронных данных на портале Microsoft Purview. Отчет содержит такие сведения, как имя дела, с которым связано удержание, расположение содержимого, которое помещается на удержание, а также о том, основано ли удержание на основе запроса. Если есть случаи, в которых нет удержаний, скрипт создает дополнительный отчет со списком случаев без удержания.

Совет

Приступая к работе с Microsoft Security Copilot изучить новые способы интеллектуальной и быстрой работы с использованием возможностей ИИ. Дополнительные сведения о Microsoft Security Copilot в Microsoft Purview.

Сведения об отчете

В случае содержится отчет, который создается скриптом в этой статье, содержит следующие сведения о каждом удержании:

  • Имя удержания и имя дела обнаружения электронных данных, с которым связано удержание.
  • Связано ли удержание с делом обнаружения электронных данных.
  • Является ли дело обнаружения электронных данных активным или закрытым.
  • Включено или отключено удержание.
  • Члены дела обнаружения электронных данных, с которым связано удержание. Участники дела могут просматривать дело или управлять им в зависимости от назначенных разрешений на обнаружение электронных данных.
  • Время и дата создания дела.
  • Если дело закрыто, лицо, закрывавшего его, а также время и дату его закрытия.
  • Расположения почтовых ящиков Exchange и сайтов SharePoint, которые находятся на удержании.
  • Если удержание основано на запросе, используется синтаксис запроса.
  • Время и дата создания удержания и лицо, создавшего его.
  • Время и дата последнего изменения удержания и лицо, изменив его.

требования к Администратор и сведения о скрипте

  • Чтобы создать отчет по всем случаям обнаружения электронных данных в организации, необходимо быть администратором обнаружения электронных данных в организации. Если вы являетесь диспетчером обнаружения электронных данных, отчет содержит только сведения о случаях, к которым вы можете получить доступ. Дополнительные сведения о разрешениях на обнаружение электронных данных см. в разделе Назначение разрешений на обнаружение электронных данных.
  • Скрипт, приведенный в этой статье, имеет минимальную обработку ошибок. Его основная цель — быстро создать отчет о удержаниях, связанных с случаями обнаружения электронных данных в вашей организации.

Важно!

Примеры сценариев, приведенные в данной статье, не поддерживаются ни одной из стандартных программ и служб технической поддержки Майкрософт. Примеры сценариев приводятся "как есть", без каких-либо гарантий. Кроме того, корпорация Майкрософт отказывается от всех подразумеваемых гарантий, включая, но не ограничиваясь указанным, все подразумеваемые гарантии пригодности для продажи или определенной цели. Все риски, возникающие в результате использования примеров сценариев и документации, берет на себя пользователь. Корпорация Майкрософт, ее штатные авторы и другие лица, принимающие участие в создании, подготовке и выпуске сценариев, ни при каких обстоятельствах не несут ответственность за какой-либо ущерб (в том числе, ущерб, вызванный потерей доходов предприятия, остановкой его работы, потерей бизнес-данных и другими материальными потерями), вызванный использованием или неспособностью использовать примеры сценариев и документацию, даже если корпорации Майкрософт известно о возможности нанесения такого ущерба.

Шаг 1. Подключение к PowerShell в Центре безопасности и соответствия требованиям

Сначала подключитесь к PowerShell для обеспечения безопасности & соответствия требованиям для вашей организации. Пошаговые инструкции см. в статье Подключение к PowerShell в Центре безопасности и соответствия требованиям.

Шаг 2. Запустите скрипт, чтобы сообщить о удержаниях, связанных с случаями обнаружения электронных данных

После подключения к PowerShell для обеспечения соответствия требованиям безопасности & создайте и запустите сценарий, который собирает сведения о случаях обнаружения электронных данных в вашей организации.

  1. Сохраните следующий текст в файл скрипта Windows PowerShell с помощью суффикса .ps1имени файла , например CaseHoldsReport.ps1.

     #script begin
     " "
     write-host "***********************************************"
     write-host "Security & Compliance Center   " -foregroundColor yellow -backgroundcolor darkgreen
     write-host "eDiscovery cases - Holds report         " -foregroundColor yellow -backgroundcolor darkgreen
     write-host "***********************************************"
     " "
    
     #prompt users to specify a path to store the output files
     $time = get-date -Format dd-MM-yyyy_hh.mm
     $Path = Read-Host 'Enter a folder path to save the report to a .csv file (filename is created automatically)'
     $outputpath = $Path + '\' + 'CaseHoldsReport' + ' ' + $time + '.csv'
     $noholdsfilepath = $Path + '\' + 'CaseswithNoHolds' + $time + '.csv'
    
     #add case details to the csv file
     function add-tocasereport {
         Param([string]$casename,
             [String]$casetype,
             [String]$casestatus,
             [datetime]$casecreatedtime,
             [string]$casemembers,
             [datetime]$caseClosedDateTime,
             [string]$caseclosedby,
             [string]$holdname,
             [String]$Holdenabled,
             [string]$holdcreatedby,
             [string]$holdlastmodifiedby,
             [string]$ExchangeLocation,
             [string]$sharePointlocation,
             [string]$ContentMatchQuery,
             [datetime]$holdcreatedtime,
             [datetime]$holdchangedtime,
             [string]$holdstatus,
             [string]$holderror
         )
    
         $addRow = New-Object PSObject
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case name" -Value $casename
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case type" -Value $casetype
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case status" -Value $casestatus
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case members" -Value $casemembers
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case created time" -Value $casecreatedtime
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case closed time" -Value $caseClosedDateTime
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Case closed by" -Value $caseclosedby
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold name" -Value $holdname
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold enabled" -Value $Holdenabled
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold created by" -Value $holdcreatedby
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold last changed by" -Value $holdlastmodifiedby
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Exchange locations" -Value  $ExchangeLocation
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "SharePoint locations" -Value $sharePointlocation
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold query" -Value $ContentMatchQuery
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold created time (UTC)" -Value $holdcreatedtime
         Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Hold changed time (UTC)" -Value $holdchangedtime
         Add-Member -InputObject $addrow -MemberType NoteProperty -Name "Hold Status" -Value $holdstatus
         Add-Member -InputObject $addrow -MemberType NoteProperty -Name "Hold Error" -Value $holderror
    
         $allholdreport = $addRow | Select-Object "Case name", "Case type", "Case status", "Hold name", "Hold enabled", "Case members", "Case created time", "Case closed time", "Case closed by", "Exchange locations", "SharePoint locations", "Hold query", "Hold created by", "Hold created time (UTC)", "Hold last changed by", "Hold changed time (UTC)", "Hold Status", "Hold Error"
         $allholdreport | export-csv -path $outputPath -notypeinfo -append -Encoding ascii
     }
    
     #get information on the cases and pass values to the case report function
     " "
     write-host "Gathering a list of eDiscovery cases and holds..."
     " "
     $edc = Get-ComplianceCase -ErrorAction SilentlyContinue
     foreach ($cc in $edc) {
         write-host "Working on case :" $cc.name
         if ($cc.status -eq 'Closed') {
             $cmembers = ((Get-ComplianceCaseMember -Case $cc.name).windowsLiveID) -join ';'
             add-tocasereport -casename $cc.name -casetype $cc.casetype -casestatus $cc.Status -caseclosedby $cc.closedby -caseClosedDateTime $cc.ClosedDateTime -casemembers $cmembers
         }
         else {
             $cmembers = ((Get-ComplianceCaseMember -Case $cc.name).windowsLiveID) -join ';'
             $policies = Get-CaseHoldPolicy -Case $cc.Name | % { Get-CaseHoldPolicy $_.Name -Case $_.CaseId -DistributionDetail }
             if ($policies -ne $NULL) {
                 foreach ($policy in $policies) {
                     $rule = Get-CaseHoldRule -Policy $policy.name
                     add-tocasereport -casename $cc.name -casetype $cc.casetype -casemembers $cmembers -casestatus $cc.Status -casecreatedtime $cc.CreatedDateTime -holdname $policy.name -holdenabled $policy.enabled -holdcreatedby $policy.CreatedBy -holdlastmodifiedby $policy.LastModifiedBy -ExchangeLocation (($policy.exchangelocation.name) -join ';') -SharePointLocation (($policy.sharePointlocation.name) -join ';') -ContentMatchQuery $rule.ContentMatchQuery -holdcreatedtime $policy.WhenCreatedUTC -holdchangedtime $policy.WhenChangedUTC -holdstatus $policy.DistributionStatus -holderror $policy.DistributionResults
                 }
             }
             else {
                 Write-Host "No hold policies found in case:" $cc.name -foregroundColor 'Yellow'
                 " "
                 [string]$cc.name | out-file -filepath $noholdsfilepath -append
             }
         }
     }
    
     #get information on the cases and pass values to the case report function
     " "
     write-host "Gathering a list of eDiscovery cases and holds..."
     " "
     $edc = Get-ComplianceCase -CaseType Advanced -ErrorAction SilentlyContinue
     foreach ($cc in $edc) {
         write-host "Working on case :" $cc.name
         if ($cc.status -eq 'Closed') {
             $cmembers = ((Get-ComplianceCaseMember -Case $cc.name).windowsLiveID) -join ';'
             add-tocasereport -casename $cc.name -casestatus $cc.Status -casetype $cc.casetype -caseclosedby $cc.closedby -caseClosedDateTime $cc.ClosedDateTime -casemembers $cmembers
         }
         else {
             $cmembers = ((Get-ComplianceCaseMember -Case $cc.name).windowsLiveID) -join ';'
             $policies = Get-CaseHoldPolicy -Case $cc.Name | % { Get-CaseHoldPolicy $_.Name -Case $_.CaseId -DistributionDetail }
             if ($policies -ne $NULL) {
                 foreach ($policy in $policies) {
                     $rule = Get-CaseHoldRule -Policy $policy.name
                     add-tocasereport -casename $cc.name -casetype $cc.casetype -casemembers $cmembers -casestatus $cc.Status -casecreatedtime $cc.CreatedDateTime -holdname $policy.name -holdenabled $policy.enabled -holdcreatedby $policy.CreatedBy -holdlastmodifiedby $policy.LastModifiedBy -ExchangeLocation (($policy.exchangelocation.name) -join ';') -SharePointLocation (($policy.sharePointlocation.name) -join ';') -ContentMatchQuery $rule.ContentMatchQuery -holdcreatedtime $policy.WhenCreatedUTC -holdchangedtime $policy.WhenChangedUTC -holdstatus $policy.DistributionStatus -holderror $policy.DistributionResults
    
                 }
             }
             else {
                 write-host "No hold policies found in case:" $cc.name -foregroundColor 'Yellow'
                 " "
                 [string]$cc.name | out-file -filepath $noholdsfilepath -append
             }
         }
     }
    
     " "
     Write-host "Script complete! Report files saved to this folder: '$Path'"
     " "
     #script end
    
  2. В сеансе Windows PowerShell, открывшемся на шаге 1, перейдите в папку, в которой вы сохранили скрипт.

  3. Запустите скрипт; Например:

    .\CaseHoldsReport.ps1
    

    Сценарий запрашивает целевую папку для сохранения отчета.

  4. Введите полный путь к папке для сохранения отчета, а затем нажмите клавишу ВВОД.

    Совет

    Чтобы сохранить отчет в той же папке, в которую находится скрипт, введите точку (".") при появлении запроса в целевой папке. Чтобы сохранить отчет во вложенной папке в папке, где находится скрипт, просто введите имя вложенной папки.

    Скрипт начинает собирать сведения обо всех случаях обнаружения электронных данных в вашей организации. Не обращаться к файлу отчета во время выполнения скрипта. После завершения скрипта в сеансе Windows PowerShell отображается сообщение с подтверждением. После отображения этого сообщения доступ к отчету можно получить в папке, указанной на шаге 4. Имя файла отчета — CaseHoldsReport<DateTimeStamp>.csv.

    Кроме того, скрипт создает отчет со списком случаев, в которых нет удержаний. Имя файла для этого отчета — CaseswithNoHolds<DateTimeStamp>.csv.

    Ниже приведен пример выполнения скрипта CaseHoldsReport.ps1 .

    Выходные данные после выполнения скрипта CaseHoldsReport.ps1.