创建、报告和删除多个内容搜索

提示

电子数据展示 (预览) 现已在新的 Microsoft Purview 门户中提供。 若要详细了解如何使用新的电子数据展示体验,请参阅 了解电子数据展示 (预览版)

当你尝试了解基础数据以及搜索的丰富性和质量时,快速创建和报告发现搜索通常是电子数据展示和调查的重要步骤。 为了帮助你执行此操作,安全 & 合规性 PowerShell 提供了一组 cmdlet 来自动执行耗时的内容搜索任务。 这些脚本提供了一种快速且简单的方法来创建多个搜索,然后运行估算的搜索结果报表,从而帮助你确定相关数据的数量。 还可以使用脚本创建不同版本的搜索,以比较每个搜索生成的结果。 这些脚本可帮助你快速高效地识别和剔除数据。

提示

如果你不是 E5 客户,请使用 90 天Microsoft Purview 解决方案试用版来探索其他 Purview 功能如何帮助组织管理数据安全性和合规性需求。 立即从 Microsoft Purview 合规性门户试用中心开始。 了解有关 注册和试用条款的详细信息。

  • 你必须是 Microsoft Purview 合规性门户中电子数据展示管理器角色组的成员,才能运行本主题中所述的脚本。
  • 若要收集组织中可添加到 CSV 文件的 OneDrive for Business 网站的 URL 列表,请参阅 创建组织中所有 OneDrive 位置的列表
  • 请务必将本主题中创建的所有文件保存到同一文件夹中。 这样,便能更轻松地运行脚本。
  • 脚本包含最少的错误处理。 它们的主要用途是快速创建、报告和删除多个内容搜索。
  • 任何Microsoft标准支持计划或服务都不支持本主题中提供的示例脚本。 示例脚本“原样”提供,不提供任何形式的保证。 Microsoft 进一步拒绝所有默示保证,包括但不限于针对特定用途的适销性或适用性的任何默示保证。 由于示例脚本及文档的使用或性能所引起的全部风险均由您承担。 在任何情况下,对于由于使用或者无法使用示例脚本或文档所引起的任何损失(包括但不限于商业利润损失、业务中断、商业信息丢失或者其他经济损失),Microsoft、其作者或者参与创建、制作或交付脚本的任何人概不负责,即使 Microsoft 已被告知可能会出现此类损失。

步骤 1:创建一个 CSV 文件,其中包含有关要运行的搜索的信息

在此步骤中创建的 CSV) 文件中 (逗号分隔值包含要搜索的每个用户的行。 如果已) 及其 OneDrive for Business 网站启用,则可以搜索用户的 Exchange Online 邮箱 (其中包括存档邮箱。 也可以仅搜索邮箱或 OneDrive for Business 网站。 还可以在 SharePoint Online 组织中搜索任何网站。 在步骤 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 for Business 网站的 URL 或组织中任何网站的 URL。 对于 OneDrive for Business 网站的 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 for Business 网站上的文档,上次修改文档的日期或之后的日期。
EndDate 对于电子邮件,消息发送日期或之前的日期由用户发送的 。 对于 SharePoint 或 OneDrive for Business 网站上的文档,上次修改文档的日期或之前的日期。
  1. 将 Excel 文件作为 CSV 文件保存到本地计算机上的文件夹中。 在步骤 3 中创建的脚本将使用此 CSV 文件中的信息来创建搜索。

步骤 2:连接到安全性 & 合规性 PowerShell

下一步是连接到组织的安全 & 合规性 PowerShell。 有关分步说明,请参阅连接到安全与合规 PowerShell

步骤 3:运行脚本以创建和启动搜索

此步骤中的脚本将为在步骤 1 中创建的 CSV 文件中的每一行创建单独的内容搜索。 运行此脚本时,系统会提示输入两个值:

  • 搜索组 ID - 此名称提供了一种简单的方法来组织从 CSV 文件创建的搜索。 创建的每个搜索都使用搜索组 ID 命名,然后在搜索名称后面追加一个数字。 例如,如果为搜索组 ID 输入 ContosoCase ,则搜索将 ContosoCase_1ContosoCase_2ContosoCase_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 中创建的每个搜索的搜索命中次数的简单报表。 报表还包含每个搜索的结果大小、命中总数和所有搜索的总大小。 运行报告脚本时,如果想要将报表保存到 CSV 文件,系统会提示你输入搜索组 ID 和 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 中运行脚本时一样键入它。

    该脚本显示删除的每个搜索的名称。

    运行脚本以删除搜索组中的搜索。