Mittwoch, 3. September 2025

'ExternalEmailAddress' ist für 'MailUser' verbindlich - 'ExternalEmailAddress' is mandatory on MailUser

 Problem: Bei einer Exchange Infrastruktur funktionieren in der PowerShell keine Abfragen für "Get-Mailbox" mehr. Damit auch keine Befehle oder Aktionen, die auf "get-mailbox" aufsetzen, wie z.B. die Installation eines neuen CU (siehe Log unten).

 

 Ursache: Das bemängelte "ExternalEmailAddress" war nicht die Ursache des Problems. Lösung war, ein fehlendes "HomeServer"-Attribut auf einer Mailbox zu ergänzen. Herausgefunden mittels "SetupAssist.ps1" Skript von hier: https://microsoft.github.io/CSS-Exchange/Setup/SetupAssist/

 

Fehler:
Der folgende Fehler wurde generiert, als "$error.Clear();
          if ($RoleIsDatacenter -ne $true -and $RoleIsDatacenterDedicated -ne $true)
          {
          if (Test-ExchangeServersWriteAccess -DomainController $RoleDomainController -ErrorAction SilentlyContinue)
          {
          $sysMbx = $null;
          $name = "SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}";
          $dispName = "Microsoft Exchange";
          Write-ExchangeSetupLog -Info ("Retrieving mailboxes with Name=$name.");
          $mbxs = @(Get-Mailbox -Arbitration -Filter {name -eq $name} -IgnoreDefaultScope -ResultSize 1 );
          if ($mbxs.Length -eq 0)
          {
          Write-ExchangeSetupLog -Info ("Retrieving mailbox databases on Server=$RoleFqdnOrName.");
          $dbs = @(Get-MailboxDatabase -Server:$RoleFqdnOrName -DomainController $RoleDomainController);
          if ($dbs.Length -ne 0)
          {
          Write-ExchangeSetupLog -Info ("Retrieving users with Name=$name.");
          $arbUsers = @(Get-User -Filter {name -eq $name} -IgnoreDefaultScope -ResultSize 1);
          if ($arbUsers.Length -ne 0)
          {
          Write-ExchangeSetupLog -Info ("Enabling mailbox $name.");
          $sysMbx = Enable-Mailbox -Arbitration -Identity $arbUsers[0] -DisplayName $dispName -database $dbs[0].Identity;
          }
          }
          }
          else
          {
          if ($mbxs[0].DisplayName -ne $dispName )
          {
          Write-ExchangeSetupLog -Info ("Setting DisplayName=$dispName.");
          Set-Mailbox -Arbitration -Identity $mbxs[0] -DisplayName $dispName -Force;
          }
          $sysMbx = $mbxs[0];
          }

          # Set the Organization Capabilities needed for this mailbox
          if ($sysMbx -ne $null)
          {
          # We need 1 GB for uploading large OAB files to the organization mailbox
          Write-ExchangeSetupLog -Info ("Setting mailbox properties.");
          set-mailbox -Arbitration -identity $sysMbx -UMGrammar:$true -OABGen:$true -GMGen:$true -ClientExtensions:$true -MailRouting:$true -MessageTracking:$true -PstProvider:$true -MaxSendSize 1GB -Force;

          Write-ExchangeSetupLog -Info ("Configuring offline address book(s) for this mailbox");
          Get-OfflineAddressBook | where {$_.ExchangeVersion.CompareTo([Microsoft.Exchange.Data.ExchangeObjectVersion]::Exchange2012) -ge 0 -and $_.GeneratingMailbox -eq $null} | Set-OfflineAddressBook -GeneratingMailbox $sysMbx.Identity;
          }
          else
          {
          Write-ExchangeSetupLog -Info ("Cannot find arbitration mailbox with name=$name.");
          }
          }
          else
          {
          Write-ExchangeSetupLog -Info "Skipping creating E15 System Mailbox because of insufficient permission."
          }
          }
        " ausgeführt wurde: "Microsoft.Exchange.Data.DataValidationException: 'ExternalEmailAddress' ist für 'MailUser' verbindlich.
   bei Microsoft.Exchange.Data.Directory.SystemConfiguration.TenantConfigurationCacheableItem`1.TryRunADOperation(ADOperation operation, Boolean throwExceptions)
   bei Microsoft.Exchange.Data.Directory.SystemConfiguration.TenantConfigurationCacheableItem`1.Initialize(OrganizationId organizationId, CacheNotificationHandler cacheNotificationHandler, Object state)
   bei Microsoft.Exchange.Data.Directory.SystemConfiguration.TenantConfigurationCache`1.InitializeAndAddPerTenantSettings(OrganizationId orgId, Boolean allowExceptions, TSettings& perTenantSettings, Object state)
   bei Microsoft.Exchange.Data.Directory.SystemConfiguration.TenantConfigurationCache`1.TryGetValue(OrganizationId orgId, Boolean allowExceptions, TSettings& perTenantSettings, Boolean& hasExpired, Object state)
   bei Microsoft.Exchange.Management.RecipientTasks.GetMailbox.ConvertDataObjectToPresentationObject(IConfigurable dataObject)
   bei Microsoft.Exchange.Configuration.Tasks.GetRecipientObjectTask`2.WriteResult(IConfigurable dataObject)
   bei Microsoft.Exchange.Configuration.Tasks.GetTaskBase`1.WriteResult[T](IEnumerable`1 dataObjects)
   bei Microsoft.Exchange.Configuration.Tasks.GetTaskBase`1.InternalProcessRecord()
   bei Microsoft.Exchange.Configuration.Tasks.GetObjectWithIdentityTaskBase`2.InternalProcessRecord()
   bei Microsoft.Exchange.Configuration.Tasks.GetRecipientObjectTask`2.InternalProcessRecord()
   bei Microsoft.Exchange.Management.RecipientTasks.GetRecipientWithAddressListBase`2.InternalProcessRecord()
   bei Microsoft.Exchange.Configuration.Tasks.Task.<ProcessRecord>b__91_1()
   bei Microsoft.Exchange.Configuration.Tasks.Task.InvokeRetryableFunc(String funcName, Action func, Boolean terminatePipelineIfFailed)". 

Mittwoch, 8. Juni 2022

0x800c8219 Fehler in Outlook wenn Outlook Anywhere auf Mailboxebene ausgeschaltet ist

Einige Postfächer konnten sich nicht mehr mit dem Exchangeserver verbinden - allerdings funktionierte OWA problemlos. Die Lösung war eigentlich naheliegend, der Fehlercode "0x800c8219" in Outlook aber nichtssagend.

Mittels...

CASMailbox -MAPIBlockOutlookRpcHttp:$True

....war auf den betroffenen Postfächern OA ausgeschaltet. Ein Einschalten löste das Problem:

 CASMailbox -MAPIBlockOutlookRpcHttp:$False

Donnerstag, 16. Juli 2020

Free/Busy Fehler bei Wechsel in neuen Tenant

Bei einem Kunde mit Exchange Hybrid (Exchange 2010 & 2016 mit Exchange Online) funktionierte die Anzeige der Frei/Gebuchtzeiten in beide Richtungen nicht. Auch die gesammelten Lösungen von Microsoft (https://techcommunity.microsoft.com/legacyfs/online/media/2019/01/FB_Errors.FixesV6.pdf
, eigentlich sehr hilftreich) konnten in diesem Fall nicht helfen.
Durch Test-OAuthConnectivity, Test-MigrationEndpoin & der Entwickler Konsole in IE (F12) mit OWA kamen wir auf folgende Meldung:

Autodiscover failed for email address ONPREMUSER@domain.com with error System.Net.WebException: The request failed with HTTP status 401: Unauthorized.
….
diagnostics: 2000009;reason=”The issuer of the token is unknown. Issuer was ‘00000001-0000-0000-c000-000000000000@xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’.”;error_category=”invalid_issuer”

 
Die Tenant GUID (xxxxxxx) stimmte mit der des produktiven Tenants überein. Ein "Get-AuthServer | fl" zeigte jedoch, dass on-premise noch die GUID des alten Tenants hinterlegt war. Lösung war es, den alten "ACS" AuthServer zu entfernen, und einen neuen anzulegen:

Remove-AuthServer "ACS"
New-AuthServer -Name "WindowsAzureACS" -AuthMetadataUrl https://accounts.accesscontrol.windows.net/theirdomain.com/metadata/json/1

Mittwoch, 13. Mai 2020

Send-As für Verteilergruppe in Hybridumgebung

First, grant SendAs via Exchange Admin Center, then open EXO PowerShell for the following command: Add-RecipientPermission -Identity <EmailAddress> -Trustee <UserEmailaddress> -AccessRights SendAs

Donnerstag, 30. Januar 2020

CSVDE Computer Details Export

 Bei Windows Server 2003 und älter gibt es noch keine PowerShell. Wenn man in solch alten Umgebungen Daten automatisiert exportieren muss, braucht man Tools wie CSVDE. Um z.B. Computerdetails zu exportieren (get-ADComputer), folgenden Befehl in eine CMD eingeben: CSVDE -f allComputer.csv -r (objectclass=Computer)

Montag, 11. November 2019

Exchange Hybrid nachträglich aufbauen nach Cutover Migration

Azenario: Exchange Migration lief per Cutover-Migration, Exchange wurde aus lokalem AD deinstalliert (mit allen Konsequenzen, wie verlorenen Attributen etc...).
Nachträglich wurde wieder ein Exchange Server installiert. Nun sind Mailboxes nur in der Cloud vorhanden, der lokale Exchange "weis" nichts über die O365 Postfächer.

Nachträglich kann man die Umgebungen wieder wie folgt verheiraten:
  1. Zuerst Mail User in Exchange erstellen 
  2. Set-ADUser -Identity <User>-Replace @{msExchRecipientDisplayType = "-2147483642"}
  3. Set-ADUser -Identity <User>-replace @{msExchRecipientTypeDetails = "2147483648"}
  4. Set-ADUser -Identity <User>-Replace @{msExchRemoteRecipientType = "100"}
Wobei 100 bei 4. der Wert für eine shared Mailbox ist. Normale Postfächer sind "1", Ressource Mailboxes "33".




Dienstag, 1. Oktober 2019

Externe Outlook Anywhere Verbindungen vorhindern mittels Set-CasMailbox -MAPIBlockOutlookExternalConnectivity

Wer in seiner Exchange Organisation intern Outlook Anywhere aktiv hat nur bestimmte Benutzer die direkte Outlook Verbindung von extern erlauben will, kann dies mit Set-CasMailbox -MAPIBlockOutlookExternalConnectivity tun. Damit werden OA-Verbindungen nur von internen Geräten zugelassen.

Siehe dazu:
https://docs.microsoft.com/en-us/powershell/module/exchange/client-access/set-casmailbox?view=exchange-ps

Es gibt auch Gründe die gegen eine Verwendung dieses Parameters sprechen. Diese wurden hier zusammengefasst: https://ingogegenwarth.wordpress.com/2017/01/23/why-using-mapiblockoutlookexternalconnectivity-is-a-bad-idea/