Мы используем Exchange 2013 и пытаемся следовать рекомендациям Microsoft пример 3 для поиска eDiscovery в общих папках с помощью командной консоли Exchange:
New-MailboxSearch -Name "Contoso Litigation" -AllSourceMailboxes $true -AllPublicFolderSources $true -SearchQuery '"price list" AND "contoso"' -StartDate "01/01/2015" -TargetMailbox "Discovery Search Mailbox"
Start-MailboxSearch "Contoso Litigation"
Пользователь, выполняющий команды, получил роль «Управление обнаружением» в Exchange, как обязательный. Однако при выполнении первой команды возникает следующая ошибка:
Не удалось найти параметр, который соответствует имени параметра «AllSourceMailboxes».
В документация для команды New-MailboxSearch указывает, что этот параметр действителен как для Exchange 2013, так и для 2016. Кроме того, выполнение Get-Help New-MailboxSearch
выплевывает следующий список параметров:
СИНТАКСИС
New-MailboxSearch -Name <String> [-AllPublicFolderSources <$ true | $ false>] [-AllSourceMailboxes <$ true | $ false>] [-Confirm <SwitchParameter>] [-Description <String>] [-DomainController <Fqdn>] [-EndDate <ExDateTime>] [-EstimateOnly <SwitchParameter>] [-ExcludeDuplicateMessages <$ true | $ false>] [-Force <SwitchParameter>] [-IncludeKeywordStatistics <SwitchParameter>] [-IncludeUnsearchableItems <SwitchParameter>] [-InPlaceHoldEnabled <$ true | $ false>] [-InPlaceHoldIdentity <String>] [-ItemHoldPeriod <Unlimited>] [-Language <CultureInfo>] [-LogLevel <Suppress | Базовый | Полный>] [-MessageTypes <KindKeyword []>] [-PublicFolderSources <PublicFolderIdParameter []>] [-Recipients <String []>] [-SearchQuery <String>] [-Senders <String []>] [-SourceMailboxes < RecipientIdParameter []>] [-StartDate <ExDateTime>] [-StatusMailRecipients <RecipientIdParameter []>] [-TargetMailbox <MailboxIdParameter>] [-WhatIf <SwitchParameter>] [<CommonParameters>]
Такая же ошибка появляется и для -AllPublicFolderSources
параметр, если -AllSourceMailboxes
удаляется из команды.
Почему эти четко задокументированные параметры не принимаются? Что может помешать этому работать?
Итак, я покопался в работе powershell и узнал, что команда, выполняемая локально, - это просто небольшая функция PowerShell, которая «проксирует» команду и параметры на сервер Exchange через «неявное удаленное взаимодействие» (оболочка Exchange Management Shell в основном подключается к сервер через New-PSSession
а затем делает Import-PSSession
). Настоящий командлет выполняется на сервере и существует в двоичном файле .NET.
При декомпиляции этого двоичного файла в классе NewMailboxSearch обнаруживаются следующие параметры:
private const string ParameterAllPublicFolderSources = "AllPublicFolderSources";
private const string ParameterAllSourceMailboxes = "AllSourceMailboxes";
private const string ParameterDescription = "Description";
private const string ParameterEstimateOnly = "EstimateOnly";
private const string ParameterExcludeDuplicateMessages = "ExcludeDuplicateMessages";
private const string ParameterForce = "Force";
private const string ParameterIncludeKeywordStatistics = "IncludeKeywordStatistics";
private const string ParameterIncludeRemoteAccounts = "IncludeRemoteAccounts";
private const string ParameterIncludeUnsearchableItems = "IncludeUnsearchableItems";
private const string ParameterInPlaceHoldEnabled = "InPlaceHoldEnabled";
private const string ParameterInPlaceHoldIdentity = "InPlaceHoldIdentity";
private const string ParameterItemHoldPeriod = "ItemHoldPeriod";
private const string ParameterLanguage = "Language";
private const string ParameterLogLevel = "LogLevel";
private const string ParameterManagedBy = "ManagedBy";
private const string ParameterMessageTypes = "MessageTypes";
private const string ParameterPublicFolderSources = "PublicFolderSources";
private const string ParameterRecipients = "Recipients";
private const string ParameterSearchQuery = "SearchQuery";
private const string ParameterSenders = "Senders";
private const string ParameterSourceMailboxes = "SourceMailboxes";
private const string ParameterStatusMailRecipients = "StatusMailRecipients";
private const string ParameterTargetMailbox = "TargetMailbox";
Итак, командлет должен принять параметры, которые не работают.
Однако выполнение (Get-Command New-MailboxSearch).Definition
в Exchange Management Shell выгружает код для локальной функции PowerShell, и который перечисляет только следующие параметры:
param(
${Description},
${DomainController},
${EndDate},
${EstimateOnly},
${ExcludeDuplicateMessages},
${Force},
${IncludeKeywordStatistics},
${IncludeUnsearchableItems},
${InPlaceHoldEnabled},
${InPlaceHoldIdentity},
${ItemHoldPeriod},
${Language},
${LogLevel},
${MessageTypes},
${Name},
${Recipients},
${SearchQuery},
${Senders},
${SourceMailboxes},
${StartDate},
${StatusMailRecipients},
${TargetMailbox}
)
Поэтому кажется, что есть проблема с удаленным сеансом и с тем, как Import-PSSession
взаимодействует с ним. К сожалению, я недостаточно эксперт, чтобы понять, почему.
Я попытался добавить недостающие параметры в локальную функцию, но это не имело никакого значения, и вы также не можете просто выполнить настоящий двоичный командлет на сервере, потому что вы получаете эту ошибку:
Невозможно выполнить задачу. Причина: задача не может идентифицировать пользователя, выполняющего задачу.
По-видимому, командлет может только использоваться через удаленный сеанс.
У кого-нибудь есть дальнейшее понимание?
Согласно моему тесту, да, это похоже на ошибку в Exchange 2013, но в Exchange 2016 она работает должным образом.
Тест в Exchange 2013 CU18:
Тест в Exchange 2016 CU8: