複数のコンテンツ検索の作成、報告、削除

検出検索をすばやく作成してレポートすることは、多くの場合、基になるデータと検索の豊富さと品質について学習しようとしている場合の電子情報開示と調査の重要なステップです。 これを行うために、Security & Compliance PowerShell には、時間のかかるコンテンツ検索タスクを自動化するための一連のコマンドレットが用意されています。 これらのスクリプトを使用すると、多数の検索をすばやく簡単に作成し、推定検索結果のレポートを実行して、問題のデータの量を決定するのに役立ちます。 スクリプトを使用して、異なるバージョンの検索を作成して、それぞれが生成する結果を比較することもできます。 これらのスクリプトは、データをすばやく効率的に識別してカリングするのに役立ちます。

ヒント

E5 のお客様でない場合は、90 日間の Microsoft Purview ソリューション試用版を使用して、Purview の追加機能が組織のデータ セキュリティとコンプライアンスのニーズの管理にどのように役立つかを確認してください。 Microsoft Purview コンプライアンス ポータルのトライアル ハブで今すぐ開始してください。 サインアップと試用期間の詳細については、こちらをご覧ください。

  • このトピックで説明するスクリプトを実行するには、Microsoft Purview コンプライアンス ポータルの電子情報開示マネージャー役割グループのメンバーである必要があります。
  • 手順 1 で CSV ファイルに追加できるorganization内のOneDrive for Business サイトの URL の一覧を収集するには、「organization内のすべての OneDrive の場所の一覧を作成する」を参照してください。
  • このトピックで作成したすべてのファイルを必ず同じフォルダーに保存してください。 そのため、スクリプトの実行が容易になります。
  • スクリプトには、最小限のエラー処理が含まれます。 主な目的は、複数のコンテンツ検索をすばやく作成、レポート、削除することです。
  • このトピックで提供されるサンプル スクリプトは、Microsoft 標準サポート プログラムまたはサービスではサポートされていません。 サンプル スクリプトは現状のまま提供され、いかなる保証も伴いません。 さらに、Microsoft は、商品性、特定目的への適合性を含む一切の黙示の保証をいたしかねます。 本サンプル スクリプトおよびドキュメントの使用または性能に起因するすべてのリスクは、お客様が負うものとします。 サンプル スクリプトおよびドキュメントを使用したこと、または使用できなかったことに伴って生じるいかなる損害 (業務利益の損失、業務の中断、業務情報の損失、金銭上の損失、その他一切の損害) についても、Microsoft、Microsoft に帰属する作者、スクリプトの作成、製造、または納入に関与したその他のすべての人員は、いかなる場合も責めを負わないものとします。

手順 1: 実行する検索に関する情報を含む CSV ファイルを作成する

この手順で作成するコンマ区切り値 (CSV) ファイルには、検索する各ユーザーの行が含まれています。 ユーザーのExchange Online メールボックス (アーカイブ メールボックスが含まれている場合は有効な場合) とそのOneDrive for Business サイトを検索できます。 または、メールボックスまたはOneDrive for Business サイトだけを検索することもできます。 SharePoint Online organization内の任意のサイトを検索することもできます。 手順 3 で実行したスクリプトは、CSV ファイル内の各行に対して個別の検索を作成します。

  1. NotePad を使用して、次のテキストをコピーして .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 コマンドレット (手順 3 のスクリプト内) で新しいコンテンツ検索を作成するために使用されるパラメーターが一覧表示されます。 各パラメーター名はコンマで区切られています。 ヘッダー行にスペースがないことを確認します。 ヘッダー行の下の各行は、各検索のパラメーター値を表します。 CSV ファイル内のプレースホルダー データを実際のデータに置き換えてください。

  2. Excel で .txt ファイルを開き、次の表の情報を使用して、検索ごとに情報を含むファイルを編集します。


パラメーター 説明
ExchangeLocation ユーザーのメールボックスの SMTP アドレス。
SharePointLocation ユーザーのOneDrive for Businessサイトの URL、またはorganization内の任意のサイトの 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 に接続する

次の手順では、organizationのセキュリティ & コンプライアンス PowerShell に接続します。 詳細な手順については、「セキュリティ/コンプライアンス PowerShell への接続」を参照してください。

手順 3: スクリプトを実行して検索を作成して開始する

この手順のスクリプトでは、手順 1 で作成した CSV ファイル内の各行に個別のコンテンツ検索を作成します。 このスクリプトを実行すると、次の 2 つの値の入力を求められます。

  • 検索グループ ID - この名前を使用すると、CSV ファイルから作成された検索を簡単に整理できます。 作成された各検索には、検索グループ ID を使用して名前が付けられ、検索名に番号が追加されます。 たとえば、検索グループ ID に ContosoCase と入力すると、検索には ContosoCase_1、ContosoCase_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 でスクリプトを実行したときと同じように入力する必要があります。

    スクリプトには、削除された各検索の名前が表示されます。

    スクリプトを実行して、検索グループ内の検索を削除します。