다음을 통해 공유


여러 콘텐츠 검색 만들기, 보고하기 및 삭제

검색 검색을 빠르게 만들고 보고하는 것은 종종 기본 데이터와 검색의 풍부함과 품질에 대해 알아보려고 할 때 eDiscovery 및 조사에서 중요한 단계입니다. 이를 위해 보안 & 규정 준수 PowerShell은 시간이 많이 걸리는 콘텐츠 검색 작업을 자동화하는 cmdlet 집합을 제공합니다. 이러한 스크립트는 여러 검색을 만든 다음, 문제의 데이터 양을 결정하는 데 도움이 될 수 있는 예상 검색 결과의 보고서를 실행하는 빠르고 쉬운 방법을 제공합니다. 스크립트를 사용하여 서로 다른 버전의 검색을 만들어 각 검색이 생성하는 결과를 비교할 수도 있습니다. 이러한 스크립트는 데이터를 빠르고 효율적으로 식별하고 컬링하는 데 도움이 될 수 있습니다.

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

  • 이 항목에 설명된 스크립트를 실행하려면 Microsoft Purview 규정 준수 포털 eDiscovery Manager 역할 그룹의 구성원이어야 합니다.
  • 1단계에서 CSV 파일에 추가할 수 있는 organization 비즈니스용 OneDrive 사이트의 URL 목록을 수집하려면 organization 모든 OneDrive 위치 목록 만들기를 참조하세요.
  • 이 항목에서 만든 모든 파일을 동일한 폴더에 저장해야 합니다. 그러면 스크립트를 더 쉽게 실행할 수 있습니다.
  • 스크립트에는 최소한의 오류 처리가 포함됩니다. 주요 목적은 여러 콘텐츠 검색을 신속하게 만들고 보고하고 삭제하는 것입니다.
  • 이 항목에 제공된 샘플 스크립트는 Microsoft 표준 지원 프로그램 또는 서비스에서 지원되지 않습니다. 샘플 스크립트는 어떠한 보증도 없이 "있는 그대로" 제공됩니다. 또한 Microsoft는 묵시적인 모든 보증(상품성 또는 특정 목적에의 적합성에 대한 묵시적인 보증을 포함하되 이에 제한되지 않음)을 부인합니다. 샘플 스크립트 및 문서의 사용 또는 수행으로 인해 발생하는 모든 위험은 사용자의 책임입니다. 어떠한 경우에도 Microsoft, 스크립트 작성자 또는 그외 스크립트의 작성, 생산 또는 제공과 관련된 사람은 누구나 샘플 스크립트 또는 문서의 사용 또는 사용할 수 없음으로 인해 발생하는 모든 손해(수익 손실, 비즈니스 중단, 비즈니스 정보 손실 또는 기타 금전상의 손실을 포함하되 이에 제한되지 않음)에 대해 책임지지 않습니다. 이는 Microsoft가 이러한 손해가 발생할 가능성에 대해 알았더라도 마찬가지입니다.

1단계: 실행하려는 검색에 대한 정보가 포함된 CSV 파일 만들기

이 단계에서 만드는 CSV(쉼표로 구분된 값) 파일에는 검색하려는 각 사용자에 대한 행이 포함됩니다. 사용자의 Exchange Online 사서함(사용 가능한 경우 보관 사서함 포함) 및 해당 비즈니스용 OneDrive 사이트를 검색할 수 있습니다. 또는 사서함 또는 비즈니스용 OneDrive 사이트만 검색할 수 있습니다. SharePoint Online organization 모든 사이트를 검색할 수도 있습니다. 3단계에서 실행하는 스크립트는 CSV 파일의 각 행에 대해 별도의 검색을 만듭니다.

  1. 다음 텍스트를 복사하여 메모장을 사용하여 .txt 파일에 붙여넣습니다. 이 파일을 로컬 컴퓨터의 폴더에 저장합니다. 다른 스크립트도 이 폴더에 저장합니다.

    ExchangeLocation,SharePointLocation,ContentMatchQuery,StartDate,EndDate
    sarad@contoso.onmicrosoft.com,https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com,(lawsuit OR legal),1/1/2000,12/31/2005
    sarad@contoso.onmicrosoft.com,https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com,(lawsuit OR legal),1/1/2006,12/31/2010
    sarad@contoso.onmicrosoft.com,https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com,(lawsuit OR legal),1/1/2011,3/21/2016
    ,https://contoso.sharepoint.com/sites/contoso,,,3/21/2016
    ,https://contoso-my.sharepoint.com/personal/davidl_contoso_onmicrosoft_com,,1/1/2015,
    ,https://contoso-my.sharepoint.com/personal/janets_contoso_onmicrosoft_com,,1/1/2015,
    

    파일의 첫 번째 행 또는 헤더 행에는 New-ComplianceSearch cmdlet(3단계의 스크립트)에서 새 콘텐츠 검색을 만드는 데 사용할 매개 변수가 나열됩니다. 각 매개 변수 이름은 쉼표로 구분됩니다. 머리글 행에 공백이 없는지 확인합니다. 머리글 행 아래의 각 행은 각 검색에 대한 매개 변수 값을 나타냅니다. CSV 파일의 자리 표시자 데이터를 실제 데이터로 바꿔야 합니다.

  2. Excel에서 .txt 파일을 연 다음 다음 표의 정보를 사용하여 각 검색에 대한 정보를 사용하여 파일을 편집합니다.


매개 변수 설명
ExchangeLocation 사용자 사서함의 SMTP 주소입니다.
SharePointLocation 사용자의 비즈니스용 OneDrive 사이트에 대한 URL 또는 organization 모든 사이트의 URL입니다. 비즈니스용 OneDrive 사이트에 대한 URL의 경우 형식https://<your organization>-my.sharepoint.com/personal/<user alias>_<your organization>_onmicrosoft_com을 사용합니다. 예를 들면 https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com와 같습니다.
ContentMatchQuery 검색에 대한 검색 쿼리입니다. 검색 쿼리를 만드는 방법에 대한 자세한 내용은 콘텐츠 검색에 대한 키워드 쿼리 및 검색 조건을 참조하세요.
StartDate 전자 메일의 경우 받는 사람이 메시지를 받거나 보낸 날짜 또는 그 이후의 날짜입니다. SharePoint 또는 비즈니스용 OneDrive 사이트의 문서의 경우 문서가 마지막으로 수정된 날짜 또는 이후의 날짜입니다.
EndDate 전자 메일의 경우 사용자가 보낸 메시지를 보낸 날짜 또는 이전 날짜입니다. SharePoint 또는 비즈니스용 OneDrive 사이트의 문서의 경우 문서가 마지막으로 수정된 날짜 또는 이전 날짜입니다.
  1. Excel 파일을 CSV 파일로 로컬 컴퓨터의 폴더에 저장합니다. 3단계에서 만든 스크립트는 이 CSV 파일의 정보를 사용하여 검색을 만듭니다.

2단계: 보안 & 준수 PowerShell에 연결

다음 단계는 organization 보안 & 규정 준수 PowerShell에 연결하는 것입니다. 단계별 지침은 Security & Compliance PowerShell에 연결을 참조하세요.

3단계: 스크립트를 실행하여 검색 만들기 및 시작

이 단계의 스크립트는 1단계에서 만든 CSV 파일의 각 행에 대해 별도의 콘텐츠 검색을 만듭니다. 이 스크립트를 실행하면 다음 두 가지 값이 표시됩니다.

  • 검색 그룹 ID - 이 이름은 CSV 파일에서 만든 검색을 쉽게 구성할 수 있는 방법을 제공합니다. 생성된 각 검색의 이름은 검색 그룹 ID로 지정되고 검색 이름에 숫자가 추가됩니다. 예를 들어 검색 그룹 ID에 ContosoCase 를 입력하면 검색 이름은 ContosoCase_1, ContosoCase_2, ContosoCase_3 등으로 지정됩니다. 입력한 이름은 대/소문자를 구분합니다. 4단계 및 5단계에서 검색 그룹 ID를 사용하는 경우 만들 때와 동일한 사례를 사용해야 합니다.

  • CSV 파일 - 1단계에서 만든 CSV 파일의 이름입니다. 전체 파일 이름 사용을 포함해야 하며, .csv 파일 확장자를 포함해야 합니다. 예를 들면 입니다 ContosoCase.csv.

스크립트를 실행하려면

  1. .ps1 파일 이름 접미사를 사용하여 다음 텍스트를 Windows PowerShell 스크립트 파일에 저장합니다(예: CreateSearches.ps1). 파일을 다른 파일을 저장한 동일한 폴더에 저장합니다.

    # Get the Search Group ID and the location of the CSV input file
    $searchGroup = Read-Host 'Search Group ID'
    $csvFile = Read-Host 'Source CSV file'
    
    # Do a quick check to make sure our group name will not collide with other searches
    $searchCounter = 1
    import-csv $csvFile |
      ForEach-Object{
    
     $searchName = $searchGroup +'_' + $searchCounter
     $search = Get-ComplianceSearch $searchName -EA SilentlyContinue
     if ($search)
     {
        Write-Error "The Search Group ID conflicts with existing searches.  Please choose a search group name and restart the script."
        return
     }
     $searchCounter++
    }
    
    $searchCounter = 1
    import-csv $csvFile |
      ForEach-Object{
    
     # Create the query
     $query = $_.ContentMatchQuery
     if(($_.StartDate -or $_.EndDate))
     {
           # Add the appropriate date restrictions.  NOTE: Using the Date condition property here because it works across Exchange, SharePoint, and OneDrive for Business.
           # For Exchange, the Date condition property maps to the Sent and Received dates; for SharePoint and OneDrive for Business, it maps to Created and Modified dates.
           if($query)
           {
               $query += " AND"
           }
           $query += " ("
           if($_.StartDate)
           {
               $query += "Date >= " + $_.StartDate
           }
           if($_.EndDate)
           {
               if($_.StartDate)
               {
                   $query += " AND "
               }
               $query += "Date <= " + $_.EndDate
           }
           $query += ")"
     }
    
      # -ExchangeLocation can't be set to an empty string, set to null if there's no location.
      $exchangeLocation = $null
      if ( $_.ExchangeLocation)
      {
            $exchangeLocation = $_.ExchangeLocation
      }
    
     # Create and run the search
     $searchName = $searchGroup +'_' + $searchCounter
     Write-Host "Creating and running search: " $searchName -NoNewline
     $search = New-ComplianceSearch -Name $searchName -ExchangeLocation $exchangeLocation -SharePointLocation $_.SharePointLocation -ContentMatchQuery $query
    
     # Start and wait for each search to complete
     Start-ComplianceSearch $search.Name
     while ((Get-ComplianceSearch $search.Name).Status -ne "Completed")
     {
        Write-Host " ." -NoNewline
        Start-Sleep -s 3
     }
     Write-Host ""
    
     $searchCounter++
    }
    
  2. Windows PowerShell 이전 단계에서 스크립트를 저장한 폴더로 이동한 다음 스크립트를 실행합니다. 예를 들면 다음과 같습니다.

    .\CreateSearches.ps1
    
  3. 검색 그룹 ID 프롬프트에서 검색 그룹 이름을 입력한 다음 Enter 키를 누릅니다. 예를 들면 입니다ContosoCase. 이 이름은 대/소문자를 구분하므로 후속 단계에서 동일한 방식으로 입력해야 합니다.

  4. 원본 CSV 파일 프롬프트에서 .csv 파일 확장자를 포함하여 CSV 파일의 이름을 입력합니다. 예를 들면 입니다ContosoCase.csv.

  5. Enter 키를 눌러 스크립트를 계속 실행합니다.

    스크립트는 검색을 만들고 실행하는 진행률을 표시합니다. 스크립트가 완료되면 프롬프트로 돌아갑니다.

    스크립트를 실행하여 여러 준수 검색을 만드는 샘플 출력입니다.

4단계: 스크립트를 실행하여 검색 예상 결과 보고

검색을 만든 후 다음 단계는 3단계에서 만든 각 검색에 대한 검색 적중 횟수에 대한 간단한 보고서를 표시하는 스크립트를 실행하는 것입니다. 보고서에는 각 검색에 대한 결과 크기 및 모든 검색의 총 적중 횟수 및 총 크기도 포함됩니다. 보고 스크립트를 실행하면 검색 그룹 ID와 CSV 파일에 보고서를 저장하려는 경우 CSV 파일 이름을 묻는 메시지가 표시됩니다.

  1. .ps1 파일 이름 접미사를 사용하여 다음 텍스트를 Windows PowerShell 스크립트 파일에 저장합니다(예: SearchReport.ps1). 파일을 다른 파일을 저장한 동일한 폴더에 저장합니다.

    $searchGroup = Read-Host 'Search Group ID'
    $outputFile = Read-Host 'Enter a file name or file path to save the report to a .csv file. Leave blank to only display the report'
    $searches = Get-ComplianceSearch | ?{$_.Name -clike $searchGroup + "_*"}
    $allSearchStats = @()
    foreach ($partialObj in $searches)
    {
       $search = Get-ComplianceSearch $partialObj.Name
       $sizeMB = [System.Math]::Round($search.Size / 1MB, 2)
       $searchStatus = $search.Status
       if($search.Errors)
       {
           $searchStatus = "Failed"
       }elseif($search.NumFailedSources -gt 0)
       {
           $searchStatus = "Failed Sources"
       }
       $searchStats = New-Object PSObject
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name Name -Value $search.Name
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name ContentMatchQuery -Value $search.ContentMatchQuery
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name Status -Value $searchStatus
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name Items -Value $search.Items
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name "Size" -Value $search.Size
       Add-Member -InputObject $searchStats -MemberType NoteProperty -Name "Size(MB)" -Value $sizeMB
       $allSearchStats += $searchStats
    }
    # Calculate the totals
    $allItems = ($allSearchStats | Measure-Object Items -Sum).Sum
    # Convert the total size to MB and round to the nearst 100th
    $allSize = ($allSearchStats | Measure-Object 'Size' -Sum).Sum
    $allSizeMB = [System.Math]::Round($allSize  / 1MB, 2)
    # Get the total successful searches and total of all searches
    $allSuccessCount = ($allSearchStats |?{$_.Status -eq "Completed"}).Count
    $allCount = $allSearchStats.Count
    $allStatus = [string]$allSuccessCount + " of " + [string]$allCount
    # Totals Row
    $totalSearchStats = New-Object PSObject
    Add-Member -InputObject $totalSearchStats -MemberType NoteProperty -Name Name -Value "Total"
    Add-Member -InputObject $totalSearchStats -MemberType NoteProperty -Name Status -Value $allStatus
    Add-Member -InputObject $totalSearchStats -MemberType NoteProperty -Name Items -Value $allItems
    Add-Member -InputObject $totalSearchStats -MemberType NoteProperty -Name "Size(MB)" -Value $allSizeMB
    $allSearchStats += $totalSearchStats
    # Just get the columns we're interested in showing
    $allSearchStatsPrime = $allSearchStats | Select-Object Name, Status, Items, "Size(MB)", ContentMatchQuery
    # Print the results to the screen
    $allSearchStatsPrime |ft -AutoSize -Wrap
    # Save the results to a CSV file
    if ($outputFile)
    {
       $allSearchStatsPrime | Export-Csv -Path $outputFile -NoTypeInformation
    }
    
  2. Windows PowerShell 이전 단계에서 스크립트를 저장한 폴더로 이동한 다음 스크립트를 실행합니다. 예를 들면 다음과 같습니다.

    .\SearchReport.ps1
    
  3. 검색 그룹 ID 프롬프트에서 검색 그룹 이름을 입력한 다음 Enter 키를 누릅니다. 예를 들면 ContosoCase입니다. 이 이름은 대/소문자를 구분하므로 3단계에서 스크립트를 실행할 때와 동일한 방식으로 입력해야 합니다.

  4. 보고서를 CSV 파일에 저장하기 위한 파일 경로(보고서를 표시하기 위해 비워 두기) 프롬프트에서 CSV 파일에 보고서를 저장하려면 전체 파일 이름 경로(.csv 파일 확장명 포함)의 파일 이름을 입력합니다. .csv 파일 확장자를 포함한 CSV 파일의 이름입니다. 예를 들어 를 입력 ContosoCaseReport.csv 하여 현재 디렉터리에 저장하거나 를 입력 C:\Users\admin\OneDrive for Business\ContosoCase\ContosoCaseReport.csv 하여 다른 폴더에 저장할 수 있습니다. 프롬프트를 비워 두어 보고서를 표시하지만 파일에 저장할 수도 없습니다.

  5. Enter 키를 누릅니다.

    스크립트는 검색을 만들고 실행하는 진행률을 표시합니다. 스크립트가 완료되면 보고서가 표시됩니다.

    검색 보고서를 실행하여 검색 그룹에 대한 추정치를 표시합니다.

참고

동일한 사서함 또는 사이트가 검색 그룹에서 둘 이상의 검색에서 콘텐츠 위치로 지정된 경우 보고서의 총 결과 추정치(항목 수와 총 크기 모두)에 동일한 항목에 대한 결과가 포함될 수 있습니다. 검색 그룹의 다른 검색에 대한 쿼리와 일치하는 경우 동일한 전자 메일 메시지 또는 문서가 두 번 이상 계산되기 때문입니다.

5단계: 스크립트를 실행하여 검색 삭제

많은 검색을 만들 수 있으므로 이 마지막 스크립트를 사용하면 3단계에서 만든 검색을 쉽게 삭제할 수 있습니다. 다른 스크립트와 마찬가지로 이 스크립트도 검색 그룹 ID를 묻는 메시지를 표시합니다. 이 스크립트를 실행하면 검색 이름에 검색 그룹 ID가 있는 모든 검색이 삭제됩니다.

  1. .ps1 파일 이름 접미사를 사용하여 다음 텍스트를 Windows PowerShell 스크립트 파일에 저장합니다(예: DeleteSearches.ps1). 파일을 다른 파일을 저장한 동일한 폴더에 저장합니다.

    # Delete all searches in a search group
    $searchGroup = Read-Host 'Search Group ID'
    Get-ComplianceSearch |
       ForEach-Object{
       # If the name matches the search group name pattern (case sensitive), delete the search
       if ($_.Name -cmatch $searchGroup + "_\d+")
       {
           Write-Host "Deleting search: " $_.Name
           Remove-ComplianceSearch $_.Name -Confirm:$false
       }
    }
    
  2. Windows PowerShell 이전 단계에서 스크립트를 저장한 폴더로 이동한 다음 스크립트를 실행합니다. 예를 들면 다음과 같습니다.

    .\DeleteSearches.ps1
    
  3. 검색 그룹 ID 프롬프트에서 삭제하려는 검색에 대한 검색 그룹 이름을 입력한 다음 Enter 키를 누릅니다. 예를 들면 입니다ContosoCase. 이 이름은 대/소문자를 구분하므로 3단계에서 스크립트를 실행할 때와 동일한 방식으로 입력해야 합니다.

    스크립트는 삭제된 각 검색의 이름을 표시합니다.

    스크립트를 실행하여 검색 그룹에서 검색을 삭제합니다.