创建、报告和删除多个内容搜索
提示
电子数据展示 (预览) 现已在新的 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 文件中的每一行创建单独的搜索。
使用记事本将以下文本复制并粘贴到 .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 文件中的占位符数据替换为实际数据。
在 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 网站上的文档,上次修改文档的日期或之前的日期。 |
- 将 Excel 文件作为 CSV 文件保存到本地计算机上的文件夹中。 在步骤 3 中创建的脚本将使用此 CSV 文件中的信息来创建搜索。
步骤 2:连接到安全性 & 合规性 PowerShell
下一步是连接到组织的安全 & 合规性 PowerShell。 有关分步说明,请参阅连接到安全与合规 PowerShell。
步骤 3:运行脚本以创建和启动搜索
此步骤中的脚本将为在步骤 1 中创建的 CSV 文件中的每一行创建单独的内容搜索。 运行此脚本时,系统会提示输入两个值:
搜索组 ID - 此名称提供了一种简单的方法来组织从 CSV 文件创建的搜索。 创建的每个搜索都使用搜索组 ID 命名,然后在搜索名称后面追加一个数字。 例如,如果为搜索组 ID 输入 ContosoCase ,则搜索将 ContosoCase_1、 ContosoCase_2、 ContosoCase_3等命名。 请注意,键入的名称区分大小写。 在步骤 4 和步骤 5 中使用搜索组 ID 时,必须使用与创建时相同的大小写。
CSV 文件 - 在步骤 1 中创建的 CSV 文件的名称。 请确保包含 使用完整文件名,包括 .csv 文件扩展名;例如 。
ContosoCase.csv
若要运行该脚本,请执行下列操作:
使用文件名后缀 .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++ }
在 Windows PowerShell 中,转到在上一步中保存脚本的文件夹,然后运行脚本;例如:
.\CreateSearches.ps1
在“搜索组 ID”提示符处,键入搜索组名称,然后按 Enter;例如 。
ContosoCase
请记住,此名称区分大小写,因此必须在后续步骤中以相同的方式键入它。在源 CSV 文件提示符处,键入 CSV 文件的名称,包括 .csv 文件扩展名;例如 。
ContosoCase.csv
按 Enter 继续运行脚本。
该脚本显示创建和运行搜索的进度。 脚本完成后,它将返回到提示符。
步骤 4:运行脚本以报告搜索估计值
创建搜索后,下一步是运行一个脚本,该脚本显示步骤 3 中创建的每个搜索的搜索命中次数的简单报表。 报表还包含每个搜索的结果大小、命中总数和所有搜索的总大小。 运行报告脚本时,如果想要将报表保存到 CSV 文件,系统会提示你输入搜索组 ID 和 CSV 文件名。
使用文件名后缀 .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 }
在 Windows PowerShell 中,转到在上一步中保存脚本的文件夹,然后运行脚本;例如:
.\SearchReport.ps1
在 “搜索组 ID ”提示符处,键入搜索组名称,然后按 Enter;例如
ContosoCase
。 请记住,此名称区分大小写,因此必须像在步骤 3 中运行脚本时一样键入它。在“ 文件路径”中,将报表保存到 CSV 文件 (留空以仅显示报告) 提示,键入完整文件名路径的文件名 (包括 .csv 文件扩展名) (如果要将报表保存到 CSV 文件)。 CSV 文件的名称,包括 .csv 文件扩展名。 例如,可以键入
ContosoCaseReport.csv
以将其保存到当前目录,也可以键入C:\Users\admin\OneDrive for Business\ContosoCase\ContosoCaseReport.csv
以将其保存到其他文件夹。 还可以将提示保留为空以显示报表,但不能将其保存到文件。按 Enter 键。
该脚本显示创建和运行搜索的进度。 脚本完成后,将显示报表。
注意
如果在搜索组中的多个搜索中将同一邮箱或网站指定为内容位置,则报告中的总结果估计值 (项数和总大小) 可能包括相同项目的结果。 这是因为,如果同一电子邮件或文档与搜索组中不同搜索的查询匹配,则会多次对同一电子邮件或文档进行计数。
步骤 5:运行脚本以删除搜索
由于你可能正在创建大量搜索,因此,最后一个脚本可让你轻松快速删除在步骤 3 中创建的搜索。 与其他脚本一样,此脚本还会提示输入搜索组 ID。 运行此脚本时,将删除搜索名称中具有搜索组 ID 的所有搜索。
使用文件名后缀 .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 } }
在 Windows PowerShell 中,转到在上一步中保存脚本的文件夹,然后运行脚本;例如:
.\DeleteSearches.ps1
在“搜索组 ID”提示符下,键入要删除的搜索的搜索组名称,然后按 Enter;例如 。
ContosoCase
请记住,此名称区分大小写,因此必须像在步骤 3 中运行脚本时一样键入它。该脚本显示删除的每个搜索的名称。