検索を使用して電子情報開示でターゲット検索を作成する (プレビュー)
電子情報開示での検索 (プレビュー) では、Exchange メールボックスまたは SharePoint および OneDrive サイト内の特定のフォルダーを直接検索することはできません。 ただし、実際の検索クエリ構文でサイトの電子メールまたはパス (DocumentLink) プロパティのフォルダー ID プロパティを指定することで、特定のフォルダー ( ターゲット検索と呼ばれます) を検索できます。 検索を使用してターゲット検索を実行すると、ケースまたは特権アイテムに対して応答性の高いアイテムが特定のメールボックスまたはサイト フォルダーに配置されていると確信できる場合に便利です。
この記事のスクリプトを使用して、メールボックス フォルダーのフォルダー ID、または SharePoint とサイト上のフォルダーのパス (DocumentLink) を取得できます。 その後、検索クエリのフォルダー ID またはパスを使用して、フォルダー内にある項目を返すことができます。
注:
SharePoint または OneDrive サイト内のフォルダーにあるコンテンツを返すために、このトピックのスクリプトでは、Path プロパティではなく DocumentLink 管理プロパティを使用します。 DocumentLink プロパティは、フォルダー内のすべてのコンテンツを返すのに対し、Path プロパティは一部のメディア ファイルを返さないため、Path プロパティよりも堅牢です。
ヒント
E5 のお客様でない場合は、90 日間の Microsoft Purview ソリューション試用版を使用して、Purview の追加機能が組織のデータ セキュリティとコンプライアンスのニーズの管理にどのように役立つかを確認してください。 Microsoft Purview コンプライアンス ポータルのトライアル ハブで今すぐ開始してください。 サインアップと試用期間の詳細については、こちらをご覧ください。
対象検索を実行する前に
手順 1 でスクリプトを実行するには、Microsoft Purview ポータルの電子情報開示マネージャー役割グループのメンバーである必要があります。 詳細については、「電子情報開示のアクセス許可を割り当てる」を参照してください。電子情報開示のアクセス許可を割り当てる」を参照してください。
また、Exchange Online 組織でメール受信者ロールを割り当てる必要もあります。 これは、スクリプトに含まれる Get-MailboxFolderStatistics コマンドレットを実行するために必要です。 既定では、メール受信者ロールは、Exchange Online の組織の管理役割グループと受信者管理役割グループに割り当てられます。 Exchange Online でのアクセス許可の割り当ての詳細については、「 役割グループ メンバーの管理」を参照してください。 カスタム ロール グループを作成し、メール受信者ロールを割り当ててから、手順 1 でスクリプトを実行する必要があるメンバーを追加することもできます。 詳細については、「 役割グループの管理」を参照してください。
この記事のスクリプトでは、先進認証がサポートされています。 Microsoft 365 または Microsoft 365 GCC 組織の場合は、スクリプトをそのまま使用できます。 Office 365 Germany 組織、Microsoft 365 GCC High 組織、または Microsoft 365 DoD 組織の場合は、スクリプトを編集して正常に実行する必要があります。 具体的には、
Connect-ExchangeOnline
行を編集し、 ExchangeEnvironmentName パラメーター (および組織の種類に適した値) を使用して Exchange Online PowerShell に接続する必要があります。 また、行Connect-IPPSSession
を編集し、 ConnectionUri パラメーターと AzureADAuthorizationEndpointUri パラメーター (および組織の種類に適した値) を使用して、Security & Compliance PowerShell に接続する必要があります。 詳細については、「 Exchange Online PowerShell に接続する 」および「 セキュリティへの接続 & コンプライアンス PowerShell」の例を参照してください。スクリプト内のフォルダー ID は、16 進 (HEX) 値の形式である必要があります。
スクリプトを実行するたびに、新しいリモート PowerShell セッションが作成されます。 つまり、使用可能なすべてのリモート PowerShell セッションを使用できます。 これを回避するには、次のコマンドを実行して、アクティブなリモート PowerShell セッションを切断します。
Get-PSSession | Remove-PSSession; Disconnect-ExchangeOnline
詳細については、「Exchange Online PowerShell への接続」を参照してください。
スクリプトには、最小限のエラー処理が含まれています。 スクリプトの主な目的は、検索の検索クエリ構文で使用できるメールボックス フォルダー ID またはサイト パスの一覧をすばやく表示して、ターゲット検索を実行することです。
この記事で提供されるサンプル スクリプトは、Microsoft のいかなる標準サポート プログラムまたはサービスの下でもサポートされません。 サンプル スクリプトは現状のまま提供され、いかなる保証も伴いません。 さらに、Microsoft は、商品性、特定目的への適合性の黙示の保証を含む、一切の黙示の保証をいたしかねます。 本サンプル スクリプトおよびドキュメントの使用または性能に起因するすべてのリスクは、お客様が負うものとします。 サンプル スクリプトおよびドキュメントを使用したこと、または使用できなかったことに伴って生じるいかなる損害 (業務利益の損失、業務の中断、業務情報の損失、金銭上の損失、その他一切の損害) についても、Microsoft、Microsoft に帰属する作者、スクリプトの作成、製造、または納入に関与したその他のすべての人員は、いかなる場合も責めを負わないものとします。
手順 1: スクリプトを実行して、メールボックスまたはサイトのフォルダーの一覧を取得する
この最初の手順で実行するスクリプトは、メールボックス フォルダーまたは SharePoint フォルダーと OneDrive for Business フォルダーの一覧と、各フォルダーの対応するフォルダー ID またはパスを返します。 このスクリプトを実行すると、次の情報の入力を求められます。
[メール アドレスまたはサイト URL]: カストディアンのメール アドレスを入力して、Exchange メールボックス フォルダーとフォルダー ID の一覧を返します。 または、SharePoint サイトまたは OneDrive for Business サイトの URL を入力して、指定したサイトのパスの一覧を返します。 次に、いくつかの例を示します:
-
Exchange:
stacig@contoso.onmicrosoft.com
-
SharePoint:
https://contoso.sharepoint.com/sites/marketing
-
OneDrive:
https://contoso-my.sharepoint.com/personal/stacig_contoso_onmicrosoft_com
-
Exchange:
ユーザー資格情報: スクリプトでは、資格情報を使用して、先進認証を使用して Exchange Online PowerShell またはセキュリティ & コンプライアンス PowerShell に接続します。 前に説明したように、このスクリプトを正常に実行するには、適切なアクセス許可を割り当てる必要があります。
メールボックス フォルダーまたはサイト ドキュメントリンク (パス) 名の一覧を表示するには:
.ps1 のファイル名サフィックスを使用して、次のテキストを Windows PowerShell スクリプト ファイルに保存します。たとえば、
GetFolderSearchParameters.ps1
。######################################################################################################### # This PowerShell script will prompt you for: # # * Admin credentials for a user who can run the Get-MailboxFolderStatistics cmdlet in Exchange # # Online and who is an eDiscovery Manager in the Microsoft Purview portal. # # The script will then: # # * If an email address is supplied: list the folders for the target mailbox. # # * If a SharePoint or OneDrive for Business site is supplied: list the documentlinks (folder paths) # # * for the site. # # * In both cases, the script supplies the correct search properties (folderid: or documentlink:) # # appended to the folder ID or documentlink to use in a Content Search. # # Notes: # # * For SharePoint and OneDrive for Business, the paths are searched recursively; this means the # # the current folder and all sub-folders are searched. # # * For Exchange, only the specified folder will be searched; this means sub-folders in the folder # # will not be searched. To search sub-folders, you need to use the specify the folder ID for # # each sub-folder that you want to search. # # * For Exchange, only folders in the user's primary mailbox are returned by the script. # ######################################################################################################### # Collect the target email address or SharePoint Url $addressOrSite = Read-Host "Enter an email address or a URL for a SharePoint or OneDrive for Business site" # Authenticate with Exchange Online and the Microsoft Purview portal (Exchange Online Protection - EOP) if ($addressOrSite.IndexOf("@") -ige 0) { # List the folder Ids for the target mailbox $emailAddress = $addressOrSite # Connect to Exchange Online PowerShell if (!$ExoSession) { Import-Module ExchangeOnlineManagement Connect-ExchangeOnline -ShowBanner:$false -CommandName Get-MailboxFolderStatistics } $folderQueries = @() $folderStatistics = Get-MailboxFolderStatistics $emailAddress foreach ($folderStatistic in $folderStatistics) { $folderId = $folderStatistic.FolderId; $folderPath = $folderStatistic.FolderPath; $encoding= [System.Text.Encoding]::GetEncoding("us-ascii") $nibbler= $encoding.GetBytes("0123456789ABCDEF"); $folderIdBytes = [Convert]::FromBase64String($folderId); $indexIdBytes = New-Object byte[] 48; $indexIdIdx=0; $folderIdBytes | select -skip 23 -First 24 | %{$indexIdBytes[$indexIdIdx++]=$nibbler[$_ -shr 4];$indexIdBytes[$indexIdIdx++]=$nibbler[$_ -band 0xF]} $folderQuery = "folderid:$($encoding.GetString($indexIdBytes))"; $folderStat = New-Object PSObject Add-Member -InputObject $folderStat -MemberType NoteProperty -Name FolderPath -Value $folderPath Add-Member -InputObject $folderStat -MemberType NoteProperty -Name FolderQuery -Value $folderQuery $folderQueries += $folderStat } Write-Host "-----Exchange Folders-----" $folderQueries |ft } elseif ($addressOrSite.IndexOf("http") -ige 0) { $searchName = "SPFoldersSearch" $searchActionName = "SPFoldersSearch_Preview" $rawUrls = @() # List the folders for the SharePoint or OneDrive for Business Site $siteUrl = $addressOrSite # Connect to Security & Compliance PowerShell if (!$SccSession) { Import-Module ExchangeOnlineManagement Connect-IPPSSession } # Clean-up, if the script was aborted, the search we created might not have been deleted. Try to do so now. Remove-ComplianceSearch $searchName -Confirm:$false -ErrorAction 'SilentlyContinue' # Create a Content Search against the SharePoint Site or OneDrive for Business site and only search for folders; wait for the search to complete $complianceSearch = New-ComplianceSearch -Name $searchName -ContentMatchQuery "contenttype:folder OR contentclass:STS_Web" -SharePointLocation $siteUrl Start-ComplianceSearch $searchName do{ Write-host "Waiting for search to complete..." Start-Sleep -s 5 $complianceSearch = Get-ComplianceSearch $searchName }while ($complianceSearch.Status -ne 'Completed') if ($complianceSearch.Items -gt 0) { # Create a Compliance Search Action and wait for it to complete. The folders will be listed in the .Results parameter $complianceSearchAction = New-ComplianceSearchAction -SearchName $searchName -Preview do { Write-host "Waiting for search action to complete..." Start-Sleep -s 5 $complianceSearchAction = Get-ComplianceSearchAction $searchActionName }while ($complianceSearchAction.Status -ne 'Completed') # Get the results and print out the folders $results = $complianceSearchAction.Results $matches = Select-String "Data Link:.+[,}]" -Input $results -AllMatches foreach ($match in $matches.Matches) { $rawUrl = $match.Value $rawUrl = $rawUrl -replace "Data Link: " -replace "," -replace "}" $rawUrls += "DocumentLink:""$rawUrl""" } $rawUrls |ft } else { Write-Host "No folders were found for $siteUrl" } Remove-ComplianceSearch $searchName -Confirm:$false -ErrorAction 'SilentlyContinue' } else { Write-Error "Couldn't recognize $addressOrSite as an email address or a site URL" }
ローカル コンピューターで Windows PowerShell を開き、スクリプトを保存したフォルダーに移動します。
スクリプトを実行します。例えば:
.\GetFolderSearchParameters.ps1
スクリプトで求める情報を入力します。
スクリプトには、指定したユーザーのメールボックス フォルダーまたはサイト フォルダーの一覧が表示されます。 フォルダー ID またはドキュメントリンク名をコピーし、手順 2. で検索クエリに貼り付けることができるように、このウィンドウは開いたままにします。
ヒント
コンピューター画面にフォルダーの一覧を表示する代わりに、スクリプトの出力をテキスト ファイルに再転送できます。 このファイルは、スクリプトが配置されているフォルダーに保存されます。 たとえば、スクリプト出力をテキスト ファイルにリダイレクトするには、「手順 3:
.\GetFolderSearchParameters.ps1 > StacigFolderIds.txt
」のコマンドを実行します。その後、検索クエリで使用するフォルダー ID またはドキュメントリンクをファイルからコピーできます。
メールボックス フォルダーのスクリプト出力
メールボックス フォルダー ID を取得する場合、スクリプトは Exchange Online PowerShell に接続し、 Get-MailboxFolderStatisics コマンドレットを実行して、指定したメールボックスのフォルダーの一覧を表示します。 メールボックス内のすべてのフォルダーについて、スクリプトには FolderPath 列のフォルダーの名前と FolderQuery 列のフォルダー ID が表示されます。 さらに、スクリプトは folderId のプレフィックス (メールボックス プロパティの名前) をフォルダー ID に追加します。
folderid プロパティは検索可能なプロパティであるため、手順 2 の検索クエリでfolderid:<folderid>
を使用してそのフォルダーを検索します。
重要
この記事のスクリプトには、 Get-MailboxFolderStatistics によって返される 64 文字のフォルダー ID 値を、検索用にインデックスが作成されたのと同じ 48 文字形式に変換するエンコード ロジックが含まれています。 PowerShell で Get-MailboxFolderStatistics コマンドレットを実行して (この記事のスクリプトを実行するのではなく) フォルダー ID を取得するだけの場合、そのフォルダー ID 値を使用する検索クエリは失敗します。 コンテンツ検索で使用できる正しい形式のフォルダー ID を取得するには、スクリプトを実行する必要があります。
メールボックス フォルダーのスクリプトによって返される出力の例を次に示します。
手順 2 の例は、ユーザーの回復可能なアイテム フォルダー内の Purges サブフォルダーを検索するために使用されるクエリを示しています。
サイト フォルダーのスクリプト出力
SharePoint または OneDrive サイトから documentlink プロパティのパスを取得している場合、スクリプトは Security & Compliance PowerShell に接続し、サイトでフォルダーを検索する新しいコンテンツ検索を作成し、指定したサイトにあるフォルダーの一覧を表示します。 このスクリプトは、各フォルダーの名前を表示し、 documentlink のプレフィックスをフォルダー URL に追加します。
documentlink プロパティは検索可能なプロパティであるため、手順 2 の検索クエリで documentlink:<path>
property:value pair を使用してそのフォルダーを検索します。 スクリプトには、最大 100 個のサイト フォルダーが表示されます。 サイト フォルダーが 100 を超える場合は、最新のフォルダーが表示されます。
サイト フォルダーのスクリプトによって返される出力の例を次に示します。
複数のメールボックスから FolderID をプルするスクリプト
Excel で FolderID 変換の結果をグループ化して並べ替える必要がある場合は、次の手順を実行して、個々のユーザーに対して複数の削除されたフォルダーを表示できるようにします。
UserSMTP の列見出しを含む
Users_GatherFolderIDs
という名前の .csv ファイルを作成します。フォルダー クエリ構文に変換するメールボックス フォルダーのこの列の行にユーザーのメール アドレスを入力します。
.ps1 のファイル名サフィックスを使用して、次のテキストを Windows PowerShell スクリプト ファイルに保存します。例えば
GetMultiUserFolderIDseDiscovery.ps1
######################################################################################################### #This Sample Code is provided for the purpose of illustration only and is not intended to be used in a production environment. #THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS OR A PARTICULAR PURPOSE. #We grant You a nonexclusive, royalty-free right to use and modify the Sample Code and to reproduce and distribute the object code form of the Sample Code, provided that You agree: # (1) to not use Our name, logo, or trademarks to market Your software product in which the Sample Code is embedded; # (2) to include a valid copyright notice on Your software product in which the Sample Code is embedded; and # (3) to indemnify, hold harmless, and defend Us and Our suppliers from and against any claims or lawsuits, including attorney's fees, that arise or result from the use or distribution of the Sample Code. ######################################################################################################### " " write-host "***********************************************" write-host "Security & Compliance Center " -foregroundColor yellow -backgroundcolor darkgreen write-host "eDiscovery cases - FolderID report " -foregroundColor yellow -backgroundcolor darkgreen write-host "***********************************************" " " #prompt users to specify a path to store the output files $time = get-date -Format dd-MM-yyyy_hh.mm $Path = Read-Host 'Enter a folder path to save the report to a .csv file (filename is created automatically).' $inputPath = $Path + '\' + 'Users_GatherFolderIDs.csv' $outputpath = $Path + '\' + 'FileID Report' + ' ' + $time + '.csv' #Imports list of users #User List needs column "UserSMTP" with values of each mailbox's SMTP address. $users = Import-CSV $inputPath function add-tofolderidreport { Param( [string]$UserEmail, [String]$FolderName, [String]$FolderID, [String]$ConvertedFolderQuery ) $addRow = New-Object PSObject Add-Member -InputObject $addRow -MemberType NoteProperty -Name "User Email" -Value $useremail Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Folder Name" -Value $FolderName Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Native Folder ID" -Value $FolderID Add-Member -InputObject $addRow -MemberType NoteProperty -Name "Converted Folder Query" -Value $ConvertedFolderQuery $folderIDReport = $addRow | Select-Object "User Email", "Folder Name", "Native Folder ID", "Converted Folder Query" $folderIDReport | export-csv -path $outputPath -notypeinfo -append -Encoding ascii } #get information on the cases and pass values to the FolderID report function foreach ($u in $users) { $userAddress = $u.UserSMTP " " write-host "Gathering list of Folders for User:" $userAddress -ForegroundColor Yellow -BackgroundColor Black " " if ($userAddress.IndexOf("@") -ige 0) { # List the folder Ids for the target mailbox $emailAddress = $userAddress # Connect to Exchange Online PowerShell $folderQueries = @() $folderStatistics = Get-MailboxFolderStatistics $emailAddress -IncludeSoftDeletedRecipients foreach ($folderStatistic in $folderStatistics) { $folderId = $folderStatistic.FolderId; $folderPath = $folderStatistic.FolderPath; $encoding = [System.Text.Encoding]::GetEncoding("us-ascii") $nibbler = $encoding.GetBytes("0123456789ABCDEF"); $folderIdBytes = [Convert]::FromBase64String($folderId); $indexIdBytes = New-Object byte[] 48; $indexIdIdx = 0; $folderIdBytes | select -skip 23 -First 24 | % { $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -shr 4]; $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -band 0xF] } $folderQuery = "folderid:$($encoding.GetString($indexIdBytes))"; $folderStat = New-Object PSObject Add-Member -InputObject $folderStat -MemberType NoteProperty -Name FolderPath -Value $folderPath Add-Member -InputObject $folderStat -MemberType NoteProperty -Name FolderQuery -Value $folderQuery $folderQueries += $folderStat #add information to Report add-tofolderidreport -UserEmail $emailAddress -FolderName $folderPath -FolderID $folderId -ConvertedFolderQuery $folderQuery } #Outputs Exchange Folders for Single User Write-Host "-----Exchange Folders-----" -ForegroundColor Yellow $folderQueries | ft } } #Provides Path of Report " " Write-Host "----- Report Output Available at:" "$outputpath" " -----" -ForegroundColor Yellow -BackgroundColor Cyan " "
ローカル コンピューターで Windows PowerShell を開き、スクリプトを保存したフォルダーに移動します。 スクリプト ファイル
GetMultiUserFolderIDseDiscovery.ps1
を実行します。UsersGatherFolderIDs.csv ファイルを保存したフォルダー パスを入力します。
スクリプトには、指定したユーザーのメールボックス フォルダーまたはサイト フォルダーの一覧が表示されます。 また、手順 4 で指定したのと同じルート フォルダーにレポートを作成します。
手順 2: フォルダー ID またはドキュメントリンクを使用してターゲット検索を実行する
スクリプトを実行して特定のユーザーのフォルダー ID またはドキュメント リンクの一覧を収集した後、次の手順で Microsoft Purview ポータルに移動し、新しいケースを作成し、検索クエリで特定のフォルダーを検索します。 [キーワード クエリ言語 (KeyQL)] タブで構成する検索クエリで、folderid:<folderid>
またはdocumentlink:<path>
プロパティと値のペアを使用します (New-ComplianceSearch コマンドレットを使用する場合は ContentMatchQuery パラメーターの値として使用します)。
folderid
または documentlink
プロパティを他の検索パラメーターまたは検索条件と組み合わせることができます。 クエリに folderid
または documentlink
プロパティのみを含める場合、指定したフォルダーにあるすべてのアイテムが検索によって返されます。
Microsoft Purview ポータルに移動し、手順 1 でスクリプトを実行するために使用したアカウントと資格情報を使用してサインインします。
新しい ケース を作成し、 新しい検索クエリを作成します。 データ ソースで、手順 1 でスクリプトを実行したときに指定したのと同じメールボックスとサイト URL を追加します。
[ キーワード クエリ言語 (KeyQL)] タブで、手順 1 でスクリプトによって返された
folderid:<folderid>
またはdocumentlink:<path>/*
値を貼り付けます。重要
documentlink 検索では、後続の
asterisk '/*'
を使用する必要があります。検索を実行します。
対象検索の検索クエリの例
検索クエリで folderid
プロパティと documentlink
プロパティを使用してターゲット検索を実行する例を次に示します。 プレースホルダーは、領域を節約するために folderid:<folderid>
と documentlink:<path>
に使用されます。
次の使用例は、3 つの異なるメールボックス フォルダーを検索します。 同様のクエリ構文を使用して、ユーザーの回復可能なアイテム フォルダー内の非表示のフォルダーを検索できます。
folderid:<folderid> OR folderid:<folderid> OR folderid:<folderid>
次の使用例は、正確な語句を含むアイテムをメールボックス フォルダーで検索します。
folderid:<folderid> AND "Contoso financial results"
次の使用例は、サイト フォルダー (およびサブフォルダー) で、タイトルに "NDA" という文字が含まれているドキュメントを検索します。
documentlink:"<path>/*" AND filename:nda
次の使用例は、サイト フォルダー (および任意のサブフォルダー) で、日付範囲内で変更されたドキュメントを検索します。
documentlink:"<path>/*" AND (lastmodifiedtime>=01/01/2024 AND lastmodifiedtime<=01/21/2024)
詳細
この記事のスクリプトを使用して検索を実行する場合は、次の点に注意してください。
- スクリプトは結果からフォルダーを削除しません。 そのため、結果に一覧表示されている一部のフォルダーは、システム生成コンテンツが含まれているか、サブフォルダーのみが含まれており、メールボックスアイテムは含まれていないため、検索できない (または 0 個のアイテムが返される) 可能性があります。
- このスクリプトは、ユーザーのプライマリ メールボックスのフォルダー情報のみを返します。 ユーザーのアーカイブ メールボックス内のフォルダーに関する情報は返されません。 ユーザーのアーカイブ メールボックス内のフォルダーに関する情報を返すには、スクリプトを編集できます。 これを行うには、
$folderStatistics = Get-MailboxFolderStatistics $emailAddress
行を$folderStatistics = Get-MailboxFolderStatistics $emailAddress -Archive
に変更し、編集したスクリプトを保存して実行します。 この変更により、ユーザーのアーカイブ メールボックス内のフォルダーとサブフォルダーのフォルダー ID が返されます。 アーカイブ メールボックス全体を検索するには、すべてのフォルダー ID プロパティと値のペアを検索クエリのOR
演算子に接続できます。 - メールボックス フォルダーを検索する場合、指定したフォルダー (
folderid
プロパティで識別) のみが検索されます。サブフォルダーは検索されません。 サブフォルダーを検索するには、検索するサブフォルダーのフォルダー ID を使用する必要があります。 - サイト フォルダーを検索すると、フォルダー (
documentlink
プロパティで識別) とすべてのサブフォルダーが検索されます。 - 検索クエリで
folderid
プロパティのみを指定した検索結果をエクスポートする場合は、最初のエクスポート オプションである "検索クエリに一致するインデックス付きアイテム" を選択できます。フォルダー ID は常にインデックスが作成されるため、フォルダー内のすべてのアイテムは、インデックス作成の状態に関係なくエクスポートされます。