none
Проблема с созданием общих папок RRS feed

  • Вопрос

  • Здравствуйте Уважаемые форумчане, мигрирую exchange server 2010 до 2016, все проходит более менее гладко, но пока не добрался до миграции Общих папок. Папки мигрировал по статье https://blogs.technet.microsoft.com/kabans/2013/05/21/public-folders-exc/

    Все шло хорошо, скрипты выполнялись, но только до тех пор пока не дошел до создания почтового ящика общих папок, выдает вот такую ошибку и непонятно куда дальше двигать.

    [PS] C:\Program Files\Microsoft\Exchange Server\V15\Scripts>New-Mailbox -PublicFolder -Verbose "PublicFolder Mailbox" -H
    oldForMigration:$true
    Свойство "OperatorNumber" агента расширения командлета "6" уже подготовлено другим агентом. Этот командлет можно выполн
    ить повторно с параметром Verbose, чтобы выяснить, какие агенты подготавливают это свойство.
        + CategoryInfo          : NotSpecified: (:) [New-Mailbox], ProvisioningException
        + FullyQualifiedErrorId : [Server=SH2016,RequestId=95a2cf79-3c29-4066-8e12-15871dc1c5f8,TimeStamp=08.04.2017 18:42
       :20] [FailureCategory=Cmdlet-ProvisioningException] 61DE7817,Microsoft.Exchange.Management.RecipientTasks.NewMailb
      ox
        + PSComputerName        : sh2016.mydc.ru

    Попробовал из ecp получил то же самое. Может есть у кого-нибудь какие-нибудь соображения?

    Спасибо!

    8 апреля 2017 г. 19:13

Ответы

  • Вы scripting agent на серверах используете? Может у вас логика при создании new-mailbox прописана. А можете показать, что у вас в файле installation path>\V15\Bin\CmdletExtensionAgents\ScriptingAgentConfig.xml

    scientia potentia est
    My blog


    • Изменено Mikhail SartaevMVP 11 апреля 2017 г. 6:11
    • Помечено в качестве ответа kudrik_tt 12 апреля 2017 г. 3:21
    11 апреля 2017 г. 6:10

Все ответы

  • Покажите вывод:

    Get-Mailbox -PublicFolder

    Возможно, почтовый ящик общих папок уже был создан. Тогда его можно удалить и создать заново.

    Консоль запускаете от имени администратора?

    9 апреля 2017 г. 19:45
  • Хорошо, спасибо что ответили, вывод команды:

    [PS] C:\Windows\system32>Get-Mailbox -PublicFolder
    [PS] C:\Windows\system32>

    Ничего не выводит, видимо база не была создана. Не может ли помешать созданию базы, то что ящик администратора и служебные ящики со старого сервера еще не мигрировались?

    10 апреля 2017 г. 6:26
  • Ну вообще может, так как миграция общих папок это самый последний шаг. Перенести служебные ящики надо было еще до переноса пользователей. 

    И еще. В Exchange 2013/2016 нет баз данных общих папок. Общие папки располагаются в базах Mailbox. 

    10 апреля 2017 г. 6:40
  • Да, я знаю что баз данных общих папок нет, спасибо! Тогда закончу вечером перенос пользователей и служебных ящиков и продолжу воевать с Общими папками. А вы не подскажите, служебные ящики нужно перемещать все? Ведь Exchange 2016 сам тоже создал служебные почтовые ящики.
    10 апреля 2017 г. 6:49
  • Да, служебные ящики надо перемещать все.
    10 апреля 2017 г. 6:58
  • Здравствуйте, переместил все оставшиеся ящики (ящик Administrator и служебные ящики), команда (Get-Mailbox -Database "Mailbox AA" -ResultSize:Unlimited).count по каждой из двух баз показывает 0. Перенос прошел хорошо, но служебные ящики не переносились, показывая что уже существует запрос на перенос, пришлось в Exchange Shell удалять запрос и потом все перенеслось штатно.

    Но это не помогло в миграции Общих папок, по прежнему ответ прежний:

    [PS] C:\Windows\system32>New-Mailbox -PublicFolder "PublicFolder MailBox" -HoldForMigration:$true
    Свойство "OperatorNumber" агента расширения командлета "6" уже подготовлено другим агентом. Этот командлет можно выполн
    ить повторно с параметром Verbose, чтобы выяснить, какие агенты подготавливают это свойство.
        + CategoryInfo          : NotSpecified: (:) [New-Mailbox], ProvisioningException
        + FullyQualifiedErrorId : [Server=SH2016,RequestId=36f2bd83-9ff6-49b9-987c-1963b824dce9,TimeStamp=10.04.2017 19:51
       :04] [FailureCategory=Cmdlet-ProvisioningException] 62129947,Microsoft.Exchange.Management.RecipientTasks.NewMailb
      ox
        + PSComputerName        : sh2016.mydm.ru

    Вот я и подумал, а может такое быть что сформирован какой-нибудь запрос на миграцию и поэтому нельзя не Почтовый ящик общих папок создать? Хотя конечно сомнительно, ведь объекты получается уже по сути разные.

    11 апреля 2017 г. 3:48
  • Здравствуйте, переместил все оставшиеся ящики (ящик Administrator и служебные ящики), команда (Get-Mailbox -Database "Mailbox AA" -ResultSize:Unlimited).count по каждой из двух баз показывает 0. Перенос прошел хорошо, но служебные ящики не переносились, показывая что уже существует запрос на перенос, пришлось в Exchange Shell удалять запрос и потом все перенеслось штатно.

    Но это не помогло в миграции Общих папок, по прежнему ответ прежний:

    [PS] C:\Windows\system32>New-Mailbox -PublicFolder "PublicFolder MailBox" -HoldForMigration:$true
    Свойство "OperatorNumber" агента расширения командлета "6" уже подготовлено другим агентом. Этот командлет можно выполн
    ить повторно с параметром Verbose, чтобы выяснить, какие агенты подготавливают это свойство.
        + CategoryInfo          : NotSpecified: (:) [New-Mailbox], ProvisioningException
        + FullyQualifiedErrorId : [Server=SH2016,RequestId=36f2bd83-9ff6-49b9-987c-1963b824dce9,TimeStamp=10.04.2017 19:51
       :04] [FailureCategory=Cmdlet-ProvisioningException] 62129947,Microsoft.Exchange.Management.RecipientTasks.NewMailb
      ox
        + PSComputerName        : sh2016.mydm.ru

    Вот я и подумал, а может такое быть что сформирован какой-нибудь запрос на миграцию и поэтому нельзя не Почтовый ящик общих папок создать? Хотя конечно сомнительно, ведь объекты получается уже по сути разные.


    Если вы выполните с ключом verbose как написано в ошибке, что выводит? Название машинки такое, у вас случаем sharepoint и exchange не на одной машинке? Так лучше не делать.

    scientia potentia est
    My blog

    11 апреля 2017 г. 5:54
  • Просто добавить ключ -Verbose никакой разницы, возможно я не туда его добавляю?

    [PS] C:\Windows\system32>New-Mailbox -PublicFolder "PublicFolder MailBox" -HoldForMigration:$true -Verbose
    Свойство "OperatorNumber" агента расширения командлета "6" уже подготовлено другим агентом. Этот командлет можно выполн
    ить повторно с параметром Verbose, чтобы выяснить, какие агенты подготавливают это свойство.
        + CategoryInfo          : NotSpecified: (:) [New-Mailbox], ProvisioningException
        + FullyQualifiedErrorId : [Server=SH2016,RequestId=f6f86ef6-81df-4b39-83e3-7023065d6405,TimeStamp=11.04.2017 5:59:
       17] [FailureCategory=Cmdlet-ProvisioningException] 62129947,Microsoft.Exchange.Management.RecipientTasks.NewMailbo
      x
        + PSComputerName        : sh2016.mydm.ru

    Машина чисто для exchange, дополнительных служб на ней не стоит.

    11 апреля 2017 г. 6:01
  • Вы scripting agent на серверах используете? Может у вас логика при создании new-mailbox прописана. А можете показать, что у вас в файле installation path>\V15\Bin\CmdletExtensionAgents\ScriptingAgentConfig.xml

    scientia potentia est
    My blog


    • Изменено Mikhail SartaevMVP 11 апреля 2017 г. 6:11
    • Помечено в качестве ответа kudrik_tt 12 апреля 2017 г. 3:21
    11 апреля 2017 г. 6:10
  • Здравствуйте, а Вы видимо правы, ведь при установке Exchange 2016 в среде где установлен Exchange 2010, сервер у меня отказался устанавливаться так как не может или найти или определить файл ScriptingAgentConfig.xml, я заглянул в google и нашел множество статей с такой же проблемой и решением ее было скопировать данный файл из старого сервера и вставить в папку на новом сервере, заменив имеющийся там. Файл выкладываю, и в структуре этого файла ip адрес старого сервера 192.168.0.155, но что теперь делать? Насколько я понимаю этот скрипт создает и отправляет два письма вновь созданным почтовым ящикам.

    <?xml version="1.0" encoding="UTF-8"?>
    <style xmlns="http://www.w3.org/1999/xhtml">@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-weight: bold; padding: 2em; padding- } * { display: block; padding- } html|style { display: none; } html|span, html|a { display: inline; padding: 0; font-weight: normal; text-decoration: none; } html|span.block { display: block; } *[html|hidden], span.block[html|hidden] { display: none; } .expand { display: block; } .expand:before { content: '+'; color: red; } .collapse { display: block; } .collapse:before { content: '-'; color: red; } </style><Configuration version="1.0"><feature cmdlets="New-Mailbox,Enable-Mailbox" name="Welcome Email"><Feature Cmdlets="New-Mailbox,Enable-Mailbox" Name="Welcome Email"><apicall name="OnComplete"><ApiCall Name="OnComplete">  if($succeeded)    { # Waiting for synchronization after mailbox has been created. Set-ADServerSettings -ViewEntireForest $true Start-Sleep -s 10 # Enable-Mailbox triggered. Taking Identity parameter, this is the only one avalaible in this case. if ($provisioningHandler.UserSpecifiedParameters.Contains("Identity") -eq $true) { $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString() $UsrAlias = (Get-Mailbox -Identity $UsrIdentity).Alias.ToString() $USRdfirst=$provisioningHandler.UserSpecifiedParameters["FirstName"] $USRdlast=$provisioningHandler.UserSpecifiedParameters["LastName"] $USRdname= $USRdfirst + " " + $USRdlast } # New-Mailbox triggered. Taking SamAccountName parameter. if ($provisioningHandler.UserSpecifiedParameters.Contains("SamAccountName") -eq $true) { $UsrSamAccountName = $provisioningHandler.UserSpecifiedParameters["SamAccountName"] $UsrAlias = (Get-Mailbox -Filter {SamAccountName -eq $UsrSamAccountName}).Alias.ToString() $USRdfirst=$provisioningHandler.UserSpecifiedParameters["FirstName"] $USRdlast=$provisioningHandler.UserSpecifiedParameters["LastName"] $USRdname= $USRdfirst + " " + $USRdlast } #creating email address $USRemail = (Get-Mailbox -Filter {Alias -eq $UsrAlias}).PrimarySmtpAddress.ToString() $UsrOU = (Get-Mailbox -Filter {Alias -eq $UsrAlias}).OrganizationalUnit $tempmsg = [string] (get-content ("C:\scripts\welcomemit.htm")) $tempmsg = $tempmsg -replace "NewUser00",$USRdname $tempmsg = $tempmsg -replace "USERname",$USRalias # Please give the correct HUB serve IP address in the following line. $HUBServer = "192.168.0.155" $EMail =new-object net.mail.mailmessage $HUBTask = new-object net.mail.smtpclient($HUBServer) # Email with attachment will be sent from the address given in the following line. $EMail.From = "butakov@partner-omsk.ru" # Email with attachment will be sent TO the address given in the following line. $EMail.To.Add($USRemail) # Email Subject and Body details are speficied in following lines   $EMail.Subject = "Добро пожаловать в Компанию. IT Правила! (обязательно к прочтению)" $EMail.Body= $tempmsg $Email.IsBodyHtml = $true $EMail.Priority = "High" $HUBTask.send($EMail) # Clearing variables. Each one in its own line in order to prevent error messages from being shown on EMC. if ($UsrAlias) { Remove-Variable UsrAlias } if ($UsrAddr) { Remove-Variable UsrAddr } if ($UsrOU) { Remove-Variable UsrOU } if ($UsrMsg) { Remove-Variable UsrMsg } if ($UsrIdentity) { Remove-Variable UsrIdentity } if ($UsrSamAccountName) { Remove-Variable UsrSamAccountName } }  </ApiCall></apicall></Feature></feature><feature cmdlets="New-Mailbox,Enable-Mailbox" name="Welcome Email"><Feature Cmdlets="New-Mailbox,Enable-Mailbox" Name="Welcome Email"><apicall name="OnComplete"><ApiCall Name="OnComplete">  if($succeeded)    { # Waiting for synchronization after mailbox has been created. Set-ADServerSettings -ViewEntireForest $true Start-Sleep -s 10 # Enable-Mailbox triggered. Taking Identity parameter, this is the only one avalaible in this case. if ($provisioningHandler.UserSpecifiedParameters.Contains("Identity") -eq $true) { $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString() $UsrAlias = (Get-Mailbox -Identity $UsrIdentity).Alias.ToString() $USRdfirst=$provisioningHandler.UserSpecifiedParameters["FirstName"] $USRdlast=$provisioningHandler.UserSpecifiedParameters["LastName"] $USRdname= $USRdfirst + " " + $USRdlast } # New-Mailbox triggered. Taking SamAccountName parameter. if ($provisioningHandler.UserSpecifiedParameters.Contains("SamAccountName") -eq $true) { $UsrSamAccountName = $provisioningHandler.UserSpecifiedParameters["SamAccountName"] $UsrAlias = (Get-Mailbox -Filter {SamAccountName -eq $UsrSamAccountName}).Alias.ToString() $USRdfirst=$provisioningHandler.UserSpecifiedParameters["FirstName"] $USRdlast=$provisioningHandler.UserSpecifiedParameters["LastName"] $USRdname= $USRdfirst + " " + $USRdlast } #creating email address $USRemail = (Get-Mailbox -Filter {Alias -eq $UsrAlias}).PrimarySmtpAddress.ToString() $UsrOU = (Get-Mailbox -Filter {Alias -eq $UsrAlias}).OrganizationalUnit $tempmsg = [string] (get-content ("C:\scripts\welcomeoup.htm")) $tempmsg = $tempmsg -replace "NewUser00",$USRdname $tempmsg = $tempmsg -replace "USERname",$USRalias # Please give the correct HUB serve IP address in the following line. $HUBServer = "192.168.0.155" $EMail =new-object net.mail.mailmessage $HUBTask = new-object net.mail.smtpclient($HUBServer) # Email with attachment will be sent from the address given in the following line. $EMail.From = "kapustina@partner-omsk.ru" # Email with attachment will be sent TO the address given in the following line. $EMail.To.Add($USRemail) # Email Subject and Body details are speficied in following lines   $EMail.Subject = "Добро пожаловать в компанию." $EMail.Body= $tempmsg $Email.IsBodyHtml = $true $EMail.Priority = "High" $HUBTask.send($EMail) # Clearing variables. Each one in its own line in order to prevent error messages from being shown on EMC. if ($UsrAlias) { Remove-Variable UsrAlias } if ($UsrAddr) { Remove-Variable UsrAddr } if ($UsrOU) { Remove-Variable UsrOU } if ($UsrMsg) { Remove-Variable UsrMsg } if ($UsrIdentity) { Remove-Variable UsrIdentity } if ($UsrSamAccountName) { Remove-Variable UsrSamAccountName } }  </ApiCall></apicall></Feature></feature>
    <!-- In order to enable Scripting Agent: - rename this file to ScriptingAgentConfig.xml - edit it appropriately - run the task: enable-CmdletExtensionAgent "Scripting Agent" In order to include into your scriptlet characters prohibited in XML, use escape sequences, e.g. "&lt;","&gt;","&amp;" for "less than", greater than" and "ampersand respectively. -->
    <feature cmdlets="new-mailbox" name="MailboxOperatorNumberProvisioning"><Feature Cmdlets="new-mailbox" Name="MailboxOperatorNumberProvisioning"><apicall name="ProvisionDefaultProperties"><ApiCall Name="ProvisionDefaultProperties"> #parameter list: #param([ProvisioningHandler]$provisioningHandler, [IConfigurable]$readOnlyIConfigurable) if($provisioningHandler.UserSpecifiedParameters["OperatorNumber"] -ne $null) { #if user has specified -OperatorNumber parameter, return return $null; } if($readOnlyIConfigurable.OperatorNumber -ne $null) { #if previous agent has provisioned OperatorNumber, return return $null; } $user = new-object -type Microsoft.Exchange.Data.Directory.Recipient.ADUser; $user.OperatorNumber = "911"; new-object -type Microsoft.Exchange.Data.Directory.Management.Mailbox -argumentlist $user </ApiCall></apicall></Feature></feature>
    <!-- The script enforces naming convention on distribution group. The rules to be applied are: 1. Bypass enforcement if the user is administrator. Note: we simplify this logic by only check role name 2. The name should follow the pattern as: "MY-DIY-<current user alias>-<free string that less than 32 characters>" -->
    <feature cmdlets="new-distributiongroup,set-distributiongroup" name="Name-Check"><Feature Cmdlets="new-distributiongroup,set-distributiongroup" Name="Name-Check"><apicall name="Validate"><ApiCall Name="Validate">      #parameter list:      #param([ProvisioningHandler]$provisioningHandler, [IConfigurable]$readOnlyIConfigurable)      
    <!-- Proceed only if -Name or -DisplayName is specified-->
          if (($provisioningHandler.UserSpecifiedParameters["Name"] -eq $null) -and ($provisioningHandler.UserSpecifiedParameters["DisplayName"] -eq $null)) {return $null}      $userId = (Get-User | where {$_.Sid -eq $provisioningHandler.UserScope.UserId}).Identity      
    <!-- Do nothing if the user has recipient management role assigned. We don't enforce naming convention on admin -->
          foreach ($userRole in (Get-ManagementRoleAssignment -RoleAssignee $userId))      {        if ((Get-ManagementRole $userRole.Role).RoleType -eq [Microsoft.Exchange.Data.Directory.SystemConfiguration.RoleType]::RecipientManagement) {return $null;}      }      
    <!-- Compose the naming convention validation regular expression: "MY-DIY-<user alias>-<free string that less than 32 characters>" -->
          $regExpression = "MY-DIY-" + (Get-Mailbox $userId).Alias + "-.{1,32}"      
    <!-- Do regular expression validation -->
          if ([System.Text.RegularExpressions.Regex]::IsMatch($readOnlyIConfigurable.DisplayName, "^(" + $regExpression + ")$", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase)) {return $null;}      New-Object -type Microsoft.Exchange.Data.ProvisioningValidationError -argumentlist ("The name must follow the pattern as: MY-DIY-[Your Alias]-[Free string less than 32 characters]", [Microsoft.Exchange.Data.ExchangeErrorCategory]::Client )     </ApiCall></apicall></Feature></feature><feature cmdlets="new-mailbox" name="Auditing"><Feature Cmdlets="new-mailbox" Name="Auditing"><apicall name="Validate"><ApiCall Name="Validate"> #parameter list: #param([ProvisioningHandler]$provisioningHandler, [IConfigurable]$readOnlyIConfigurable) $newObjectGuid = $readOnlyIConfigurable.Guid.ToString(); </ApiCall></apicall><apicall name="OnComplete"><ApiCall Name="OnComplete"> #parameter list: #param([ProvisioningHandler]$provisioningHandler, [bool]$succeeded, [Exception]$exception) if($succeeded) { WriteToSQL($newObjectGuid); } </ApiCall></apicall></Feature></feature><common><Common> function WriteToSQL { param([string]$newObjectGuid) $connectionString = GetConnectionString; $queryString = "INSERT into RecipientAudit (DistributionGroupGuid) VALUES ('$newObjectGuid')"; [reflection.assembly]::LoadWithPartialName("System.Data"); $sqlConnection = new-object -type System.Data.SqlClient.SqlConnection -argumentlist $connectionString; $command = new-object -type System.Data.SqlClient.SqlCommand -argumentlist $queryString; $command.Connection = $sqlConnection; $command.Connection.Open(); $command.ExecuteNonQuery(); $sqlConnection.Close(); } function GetConnectionString { return "server=MYSQLSERVER;uid=sa;password=myPassword;database=CmdletExtensions"; }      </Common></common></Configuration>

    11 апреля 2017 г. 8:12
  • Может удалить эти правила, или вернуть оригинальный файл?
    11 апреля 2017 г. 8:17
  • Может удалить эти правила, или вернуть оригинальный файл?
    в этой папке лежит еще example, переименуйте его в обычный файл xml и замените существующий. После миграции уже допилите на отправку письма на новом сервере.

    scientia potentia est
    My blog

    11 апреля 2017 г. 8:34
  • Вы имеете ввиду вот этот ScriptingAgentConfig.xml.sample? Хорошо, спасибо большое, вечером попробую.
    11 апреля 2017 г. 8:50
  • Вы имеете ввиду вот этот ScriptingAgentConfig.xml.sample? Хорошо, спасибо большое, вечером попробую.
    да, его, это просто пустой конфиг.

    scientia potentia est
    My blog

    11 апреля 2017 г. 8:54
  • Большое спасибо, базу создать получилось, ошибка была в измененных командах файла ScriptingAgentConfig.xml, которые я взял со старого сервера. Большое спасибо. Правда при создании вылезла какая то ошибка, но база создалась. Буду пробовать дальше и ждать где ошибка проявит себя:

    ПРЕДУПРЕЖДЕНИЕ: При попытке предварительного заполнения нового созданного почтового ящика /o=mydm /ou=Exchange
    Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=335ac8c2501744b79ca6fb1d78509aa6-PublicFolde в базе данных
    MailBox B на сервере sh2016.mydm.ru произошла ошибка. Сейчас почтовый ящик /o=mydm /ou=Exchange
    Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=335ac8c2501744b79ca6fb1d78509aa6-PublicFolde может быть
    недоступен для определенных командлетов и операций, пока не будет реплицирован в системе. Чтобы запустить командлет
    повторно и получить дополнительные сведения об ошибке, добавьте в команду параметр -Verbose. Ошибка: 0x8004010F.
    ПРЕДУПРЕЖДЕНИЕ: Агент расширения командлета с индексом 5 создал исключение в OnComplete(). Исключение:
    Microsoft.Exchange.Provisioning.ProvisioningException: ScriptingAgent: в ходе вызова сценария для API OnComplete
    возникло исключение: Исключение при вызове "ExecuteNonQuery" с "0" аргументами: "Для ExecuteNonQuery нужно открытое и
    доступное подключение Connection. Подключение закрыто.". ---> System.Management.Automation.MethodInvocationException:
    Исключение при вызове "ExecuteNonQuery" с "0" аргументами: "Для ExecuteNonQuery нужно открытое и доступное подключение
    Connection. Подключение закрыто." ---> System.InvalidOperationException: Для ExecuteNonQuery нужно открытое и доступное
     подключение Connection. Подключение закрыто.
       в System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
       в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName,
    Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
       в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       в CallSite.Target(Closure , CallSite , Object )
       --- Конец трассировки внутреннего стека исключений ---
       в System.Management.Automation.ExceptionHandlingOps.ConvertToMethodInvocationException(Exception exception, Type
    typeToThrow, String methodName, Int32 numArgs, MemberInfo memberInfo)
       в CallSite.Target(Closure , CallSite , Object )
       в System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
       в System.Management.Automation.Interpreter.DynamicInstruction`2.Run(InterpretedFrame frame)
       в System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
       --- Конец трассировки внутреннего стека исключений ---
       в Microsoft.Exchange.ProvisioningAgent.ScriptingAgentHandler.OnComplete(Boolean succeeded, Exception e)
       в Microsoft.Exchange.Provisioning.ProvisioningLayer.OnCompleteImpl(Task task, Boolean succeeded, Exception
    exception)

    12 апреля 2017 г. 3:20