狀況
假設您建立就地 eDiscovery 搜尋在 [Exchange 系統管理員中心 (EAC) 以傳回由指定送到外部收件者的項目不收件者:"internalDomain"準則,在搜尋]。在此情況下,搜尋語法會傳回給只外部收件者,會傳送的項目,但是不包括內部和外部的收件者的項目。
原因
之所以發生這個問題,是因為 eDiscovery 使用關鍵字查詢語言 (KQL) 所使用的布林邏輯。因此,不收件者:"internalDomain"排除所有的項目包含了內部的收件者,甚至也有外部的收件者的項目。
注意目前的設計並不會提供透過 [EAC 去蕪存菁的功能。因應措施
若要解決這個問題,您可以使用下列方法之一。
方法 1︰ 使用 EWSEditor
若要解決這個問題使用釋放波EWSEditor應用程式。沒有 [eDiscovery] 視窗它可以用來搜尋項目。 注意您必須設定讓稽核 RBAC 角色所使用的帳戶來執行這些搜尋。
方法 2︰ 使用不同的 API
使用不同的 API,不會依賴 KQL。您必須使用其他程式,例如 「 Exchange Web 服務 」 (EWS),以建置自訂的解決方案。方案可以擷取資料 (較大的資料集) 的某些部分。方案可以進一步處理接收到的結果,使用外部的邏輯,來到達您想要的相符的訊息集是不收件者:"internalDomain"的標準為您會將它解譯。
此外,為身份識別的發展這類訊息,更好的解決方案就是使用傳輸規則,可以將這類項目 (內部及外部收件者) 的副本傳送給稽核的信箱。 以下是程式碼範例,如果要解決這個問題,使用 EWS 管理 API。 注意在這個程式碼範例中,InternalDomain1.com、 InternalDomain2.com、 InternalDomain3.com 以取代您的內部網域名稱。這個版面配置區會出現在程式碼中的三個位置中。
<#AQS search using EWS Managed API
USAGE: .\Search-Mailbox.ps1 -MailboxName mbx@domain.com -AqsString "(""Test"")" #> [CmdletBinding()] param ( [Parameter(Position=0,Mandatory=$True,HelpMessage="Mailbox SMTP format")] [ValidateNotNullOrEmpty()] [string]$MailboxName, [Parameter(Position=1,Mandatory=$True,HelpMessage="AQS QueryString")] [ValidateNotNullOrEmpty()] [string]$AqsString ) ####################################################################### # Update EWS DLL Folder,$domain, $account, $pwd and $exserver Values ######################################################################## $resultFL = "C:\Scripts\Result" $domain = "SEARCH" $account = "MailboxSearch@domain.com";$pwd = '123' $exServer = "exch01search.net" $EWSManagedApiPath = "C:\scripts\Microsoft.Exchange.WebServices.dll" ######################################################################## $LogFile_All = "$($resultFL)\$($Mailboxname)_All.txt" $LogFile_Filtr = "$($resultFL)\$($Mailboxname)_Filtered.txt" $LogFile_Itype = "$($resultFL)\$($Mailboxname)_ItemTypes.txt" $StopWatch = New-Object system.Diagnostics.Stopwatch $StopWatch.Start() Add-Type -Path $EWSManagedApiPath $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2) $service.Credentials= new-object Microsoft.Exchange.WebServices.Data.WebCredentials($account,$pwd,$domain) $service.UseDefaultCredentials = $false $UseAutoDiscover = $false $service.Url = new-object uri("https://domain.com/EWS/Exchange.asmx") $ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$MailboxName); $service.ImpersonatedUserId = $ImpersonatedUserId #Define Extended properties $PR_Folder_Path= new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(26293, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String); $PR_FOLDER_TYPE = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(13825,[Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Integer); $folderidcnt = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$MailboxName) #Define the FolderView used for Export should not be any larger then 1000 folders due to throttling $fvFolderView = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1000) #Deep Transval will ensure all folders in the search path are returned $fvFolderView.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep; $pSchPropSet= new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties) $pSchPropSet.Add($PR_Folder_Path) $fvFolderView.PropertySet = $pSchPropSet #The Search filter will exclude any Search Folders $sfSearchFilter = new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo($PR_FOLDER_TYPE,"1") $fiResult = $null $MsgPropSet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Id) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ParentFolderId) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ItemClass) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::Sender) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::ToRecipients) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::ccRecipients) $MsgPropSet.Add([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::BccRecipients) $AptPropSet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Id) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ParentFolderId) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ItemClass) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Organizer) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::RequiredAttendees) $AptPropSet.Add([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::OptionalAttendees) $SchPropSet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Id) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ParentFolderId) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::ItemClass) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.MeetingRequestSchema]::Organizer) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.MeetingRequestSchema]::RequiredAttendees) $SchPropSet.Add([Microsoft.Exchange.WebServices.Data.MeetingRequestSchema]::OptionalAttendees) #Write-host "Checking Mailbox: $($MailboxName)" #Write-host "Searching QueryString: $($AqsString)" #The Do loop will handle any paging that is required if there are more the 1000 folders in a mailbox $ic=0 $fic=0 do { $fiResult = $Service.FindFolders($folderidcnt,$sfSearchFilter,$fvFolderView) #$fiResult.Folders.Count foreach($ffFolder in $fiResult.Folders){ # "Processing : " + $ffFolder.displayName $fpath = $ffFolder.ExtendedProperties[0].Value $fic++ $fiItems = $null $ItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000) do{ Write-Progress -Activity "Processing $($MailboxName) - QueryString $($AqsString)" -Status $ffFolder.DisplayName -PercentComplete ($fic/$fiResult.Folders.Count*100) $fiItems = $ffFolder.findItems($AqsString,$ItemView) $ic = $ic + $fiItems.items.count $ItemView.offset += $fiItems.Items.Count foreach($Item in $fiItems.Items){ $itype = "$($item.ItemClass)`t$($Item.id.UniqueId)" Add-content -Value $itype -Path $LogFile_Itype $result="" switch ($item.ItemClass) { "IPM.Note" { $Item.Load($MsgPropSet) $MT = @() # Create a MAPITABLE to filter external Domains $eRecipients="" $result = "$($mailboxname)`t$($fpath)`t$($Item.Sender.Name)`t$($Item.DateTimeSent)`t$($Item.Subject)`t$($Item.id.UniqueId)`t$($item.ItemClass)" Add-content -Value $result -Path $LogFile_All $item.ToRecipients | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address }} $item.ccRecipients | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address}} $item.BccRecipients | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address}} $er=@()<#Replace InternalDomain1.com, InternalDomain2.com, InternalDomain3.com with your internal domain name.#> $mt | %{if($_ -notmatch 'InternalDomain1.com|InternalDomain2.com|InternalDomain3.com'){ $eRecipients = $true $er +=$_ } } } "IPM.Appointment" { $Item.Load($AptPropSet) $MT = @() # Create a MAPITABLE to filter external Domains $eRecipients="" $result = "$($mailboxname)`t$($fpath)`t$($Item.Organizer.Name)`t$($Item.DateTimeSent)`t$($Item.Subject)`t$($Item.id.UniqueId)`t$($item.ItemClass)" Add-content -Value $result -Path $LogFile_All $item.RequiredAttendees | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address }} $item.OptionalAttendees | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address}} $er=@() <#Replace InternalDomain1.com, InternalDomain2.com, and InternalDomain3.com with your internal domain name.#> $mt | %{if($_ -notmatch 'InternalDomain1.com|InternalDomain2.com|InternalDomain3.com'){ $eRecipients = $true $er +=$_ } } } "IPM.Schedule.Meeting.Request" { $Item.Load($SchPropSet) $MT = @() # Create a MAPITABLE to filter external Domains $eRecipients="" $result = "$($mailboxname)`t$($fpath)`t$($Item.Organizer.Name)`t$($Item.DateTimeSent)`t$($Item.Subject)`t$($Item.id.UniqueId)`t$($item.ItemClass)" Add-content -Value $result -Path $LogFile_All $item.RequiredAttendees | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address }} $item.OptionalAttendees | %{If($_.RoutingType -ne "EX"){$mt+=$_.Address}} $er=@()<#Replace InternalDomain1.com, InternalDomain2.com, InternalDomain3.com with your internal domain.#> $mt | %{if($_ -notmatch 'InternalDomain1.com|InternalDomain2.com|InternalDomain3.com'){ $eRecipients = $true $er +=$_ } } } Default {$eRecipients="";$result=""} } #END Switch If($eRecipients){ $er = $er -join ";" $result="$($result)`t$($er)" Add-content -Value $result -Path $LogFile_Filtr } } #End Foreach Items }while($fiItems.MoreAvailable -eq $true) } #End Foreach Folders $fvFolderView.Offset += $fiResult.Folders.Count }while($fiResult.MoreAvailable -eq $true) $StopWatch.Stop() write-host "Completed $($Mailboxname) in Seconds:" $StopWatch.Elapsed.TotalSeconds -ForegroundColor Green Write-Host "Total Items found:" $ic $StopWatch = $null
方法 3︰ 預防監視為項目具有內部和外部的收件者的身份識別,建立傳輸規則,可以將這類項目的複本傳送到稽核的信箱。
狀態
Microsoft 已確認,這是原本設計的作法。
更多的資訊
如需有關在就地 eDiscovery 的詳細資訊,請前往下列 Microsoft 網站︰
在就地 eDiscovery 的一般資訊如需有關 KQL 的詳細資訊,請前往下列 Microsoft 網站︰