다음을 통해 공유


스크립트를 사용하여 eDiscovery 사례의 보류에 대한 보고서 만들기

중요

이 문서는 클래식 eDiscovery 환경에만 적용됩니다. 클래식 eDiscovery 환경은 2025년 8월에 사용 중지되며 사용 중지 후 Microsoft Purview 포털에서 환경 옵션으로 사용할 수 없습니다.

이 전환에 대한 계획을 일찍 시작하고 Microsoft Purview 포털에서 새 eDiscovery 환경을 사용하는 것이 좋습니다. 최신 eDiscovery 기능 및 기능을 사용하는 방법에 대한 자세한 내용은 eDiscovery에 대해 알아보기를 참조하세요.

이 문서의 스크립트를 통해 eDiscovery 관리자와 eDiscovery 관리자는 Microsoft Purview 포털에서 eDiscovery(Standard) 및 eDiscovery(프리미엄) 사례와 연결된 모든 보류에 대한 정보가 포함된 보고서를 생성할 수 있습니다. 보고서에는 보류가 연결된 사례의 이름, 보류 중인 콘텐츠 위치 및 보류가 쿼리 기반인지 여부와 같은 정보가 포함됩니다. 보류가 없는 경우 스크립트는 보류가 없는 사례 목록을 사용하여 추가 보고서를 만듭니다.

보고서에 포함된 정보에 대한 자세한 설명은 추가 정보 섹션을 참조하세요.

E5 고객이 아닌 경우 90일 Microsoft Purview 솔루션 평가판을 사용하여 조직이 데이터 보안 및 규정 준수 요구 사항을 관리하는 데 도움이 되는 추가 Purview 기능을 살펴보세요. Microsoft Purview 평가판 허브에서 지금 시작합니다. 등록 및 평가판 조건에 대한 세부 정보를 알아봅니다.

관리 요구 사항 및 스크립트 정보

  • organization 모든 eDiscovery 사례에 대한 보고서를 생성하려면 organization eDiscovery 관리자여야 합니다. eDiscovery 관리자인 경우 보고서에는 액세스할 수 있는 사례에 대한 정보만 포함됩니다. eDiscovery 권한에 대한 자세한 내용은 eDiscovery 권한 할당을 참조하세요.
  • 이 문서의 스크립트에는 최소한의 오류 처리가 있습니다. 주요 목적은 organization eDiscovery 사례와 연결된 보류에 대한 보고서를 신속하게 만드는 것입니다.
  • 이 문서에 제공된 샘플 스크립트는 Microsoft 표준 지원 프로그램 또는 서비스에서 지원되지 않습니다. 샘플 스크립트는 어떠한 보증도 없이 "있는 그대로" 제공됩니다. 또한 Microsoft는 묵시적인 모든 보증(상품성 또는 특정 목적에의 적합성에 대한 묵시적인 보증을 포함하되 이에 제한되지 않음)을 부인합니다. 샘플 스크립트 및 문서의 사용 또는 수행으로 인해 발생하는 모든 위험은 사용자의 책임입니다. 어떠한 경우에도 Microsoft, 스크립트 작성자 또는 그외 스크립트의 작성, 생산 또는 제공과 관련된 사람은 누구나 샘플 스크립트 또는 문서의 사용 또는 사용할 수 없음으로 인해 발생하는 모든 손해(수익 손실, 비즈니스 중단, 비즈니스 정보 손실 또는 기타 금전상의 손실을 포함하되 이에 제한되지 않음)에 대해 책임지지 않습니다. 이는 Microsoft가 이러한 손해가 발생할 가능성에 대해 알았더라도 마찬가지입니다.

1단계: Security & Compliance PowerShell에 연결

첫 번째 단계는 조직의 Security & Compliance PowerShell에 연결하는 것입니다. 단계별 지침은 Security & Compliance PowerShell에 연결을 참조하세요.

2단계: eDiscovery 사례와 연결된 보류를 보고하는 스크립트 실행

보안 & 준수 PowerShell에 연결한 후 다음 단계는 organization eDiscovery 사례에 대한 정보를 수집하는 스크립트를 만들고 실행하는 것입니다.

  1. .ps1 파일 이름 접미사를 사용하여 다음 텍스트를 Windows PowerShell 스크립트 파일에 저장합니다(예: 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 (Standard) 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 (Premium) 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. 1단계에서 열린 Windows PowerShell 세션에서 스크립트를 저장한 폴더로 이동합니다.

  3. 스크립트를 실행합니다. 예를 들어:

    .\CaseHoldsReport.ps1
    

    스크립트는 보고서를 저장할 대상 폴더를 묻는 메시지를 표시합니다.

  4. 폴더의 전체 경로 이름을 입력하여 보고서를 저장한 다음 Enter 키를 누릅니 .

    스크립트가 있는 동일한 폴더에 보고서를 저장하려면 대상 폴더를 묻는 메시지가 표시되면 마침표(".")를 입력합니다. 스크립트가 있는 폴더의 하위 폴더에 보고서를 저장하려면 하위 폴더의 이름을 입력하기만 하면 됩니다.

    스크립트는 organization 모든 eDiscovery 사례에 대한 정보를 수집하기 시작합니다. 스크립트가 실행되는 동안에는 보고서 파일에 액세스하지 마세요. 스크립트가 완료되면 Windows PowerShell 세션에 확인 메시지가 표시됩니다. 이 메시지가 표시되면 4단계에서 지정한 폴더의 보고서에 액세스할 수 있습니다. 보고서의 파일 이름은 입니다 CaseHoldsReport<DateTimeStamp>.csv.

    또한 스크립트는 보류가 없는 사례 목록이 포함된 보고서를 만듭니다. 이 보고서의 파일 이름은 입니다 CaseswithNoHolds<DateTimeStamp>.csv.

    다음은 CaseHoldsReport.ps1 스크립트를 실행하는 예제입니다.

    CaseHoldsReport.ps1 스크립트를 실행한 후의 출력입니다.

추가 정보

이 문서에서 스크립트를 실행할 때 생성된 사례에는 각 보류에 대한 다음 정보가 포함되어 있습니다. 앞에서 설명한 대로 organization 모든 보류에 대한 정보를 반환하려면 eDiscovery 관리자여야 합니다. 사례 보류에 대한 자세한 내용은 eDiscovery 사례를 참조하세요.

  • 보류의 이름 및 보류가 연결된 eDiscovery 사례의 이름입니다.
  • 보류가 eDiscovery(Standard) 또는 eDiscovery(프리미엄) 사례와 연결되어 있는지 여부입니다.
  • eDiscovery 사례가 활성 상태인지 닫혔는지 여부입니다.
  • 보류를 사용할지 여부를 나타냅니다.
  • 보류가 연결된 eDiscovery 사례의 멤버입니다. 사례 멤버는 할당된 eDiscovery 권한에 따라 사례를 보거나 관리할 수 있습니다.
  • 케이스를 만든 시간과 날짜입니다.
  • 케이스가 닫힌 경우, 케이스를 닫은 사람과 닫힌 시간과 날짜입니다.
  • 보류 중인 Exchange 사서함 및 SharePoint 사이트 위치입니다.
  • 보류가 쿼리 기반이면 쿼리 구문입니다.
  • 보류가 만들어진 시간과 날짜 및 보존을 만든 사람입니다.
  • 보류가 마지막으로 변경된 시간과 날짜와 변경한 사람입니다.