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

Caution

Microsoft 已于 2025 年 8 月 31 日弃用所有经典电子数据展示功能。 此次停用包括经典内容搜索和经典电子数据发现(Standard)

本文中的指南仅适用于托管在中国由世纪互联运营的 Microsoft 365 () 的组织。

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

  • 你必须是 Microsoft Purview 门户中电子数据展示管理器角色组的成员,才能运行本文中所述的脚本。
  • 请务必将在本文中创建的所有文件保存到同一文件夹。 这样可以更轻松地运行脚本。
  • 脚本包含最少的错误处理。 它们的主要用途是快速创建、报告和删除多个内容搜索。
  • 本文中提供的示例脚本在任意 Microsoft 标准支持程序或服务下都不受支持。 这些示例脚本按原样提供,不作任何保证。 Microsoft 进一步声明不提供任何默示担保,这包括但不限于适销性或对特定用途的适用性的默示担保。 因使用或执行示例脚本和文档而产生的全部风险均由你承担。 在任何情况下,对于由于使用或者无法使用示例脚本或文档所引起的任何损失(包括但不限于商业利润损失、业务中断、商业信息丢失或者其他经济损失),Microsoft、其作者或者参与创建、制作或交付脚本的任何人概不负责,即使 Microsoft 已被告知可能会出现此类损失。

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

您在此步骤中创建的 CSV(逗号分隔值)文件中,为您要搜索的每个用户各包含一行。 你可以搜索用户的 Exchange Online 邮箱(其中包括存档邮箱(如果已启用))及其 OneDrive 站点。 或者,可以只搜索邮箱或 OneDrive 网站。 还可以在 SharePoint Online 组织中搜索任何网站。 在步骤 3 中运行的脚本将为 CSV 文件中的每一行创建单独的搜索。

  1. 使用记事本将以下文本复制并粘贴到.txt文件中。 将此文件保存到本地计算机上的文件夹。 还可以将其他脚本保存到此文件夹。

    ExchangeLocation,SharePointLocation,ContentMatchQuery,StartDate,EndDate
    sarad@contoso.partner.onmschina.cn,https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com,(lawsuit OR legal),1/1/2000,12/31/2005
    sarad@contoso.partner.onmschina.cn,https://contoso-my.sharepoint.com/personal/sarad_contoso_onmicrosoft_com,(lawsuit OR legal),1/1/2006,12/31/2010
    sarad@contoso.partner.onmschina.cn,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,
    

    文件的第一行(即标题行)列出了步骤 3 中脚本里的 New-ComplianceSearch cmdlet 将用于创建新的内容搜索的参数。 每个参数名称都用逗号分隔开。 请确保标题行中没有任何空格。 标题行下的每一行表示每个搜索的参数值。 请务必将 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 中创建的每个搜索的搜索命中次数的简单报表。 报表还包含每个搜索的结果大小、命中总数和所有搜索的总大小。 运行报告脚本时,系统会提示输入搜索组 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 中运行脚本时一样键入它。

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

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