Назад | Перейти на главную страницу

New-MailboxSearch: параметр не найден

Мы используем 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: