Excel ändert selbstständig alle Links in Arbeitsmappen

Man speichert „jahrelang“ Excel-Dateien auf dem Netzlaufwerk, hat dort jede Menge Links auf andere (Netzwerk-)Dateien gesetzt alles funktioniert wunderbar. Doch plötzlich gibt es beim Klick auf die Links nur noch Fehlermeldungen, nicht geht mehr.

Es erscheint statt der Dokumente ein „Sicherheitshinweis“ und vermeldet „Office hat ein potentielles Sicherheitsrisiko erkannt“. Außerdem sei „Dieser Speicherort ist möglicherweise nicht mehr sicher“.

Vorweg: Links in Excel-Dokumenten zu anderen Dokumenten sind (außer in Web- oder SharePoint Dateien) nicht absolut. Die Links bleiben also nicht bei dem was man manuell hinterlegt, sondern werden „verwaltet“. Excel versucht anhand eines Regelwerkes die Links „funktional“ zu halten und ändert beim Speichern gerne „mal eben“ alle Links des Dokumentes entsprechend ab.

Was ist das? Links zu Dokumenten auf Netzlaufwerken sind auf einmal „geändert“?

Das „Regelwerk“ das Excel nun dazu nutzt ist zum Glück ganz gut dokumentiert:
https://support.microsoft.com/de-de/topic/beschreibung-der-linkverwaltung-und-speicherung-in-excel-46628e8d-2cd6-db5f-3474-f8d7144b09d6

Ein wahrscheinliches Szenario das wir schon öfter gesehen haben könnte also zum Beispiel so aussehen:

  • Es gibt ein Netzlaufwerk X: das von \\Server\Share\Folder verbunden ist
  • Es gibt Links in einer Arbeitsmappe dort und das Dokument wird stets dort bearbeitet
  • Man öffnet die Datei vermeintlich von dort
  • Man speichert die Datei wieder dort
  • Oh nein! Alle Links sind geändert und stehen plötzlich auf Profilpfaden (%appdata%\local\Folder) oder dem Systemlaufwerk (C:\Folder)

Das, also der „Link-Verlust“ (das Phänomen nennt sich neudeutsch auch „Link-Loss“) passiert immer wenn:

  • Das Dokument (=der PC) zwischen durch „Offline“ war und Windows die Datei im Offlinecache bearbeitet hat. Der liegt nämlich auf c:\ (siehe CSC)
  • Die Datei mal „kopiert“ wurde, zum Beispiel auf einen USB-Stick oder den Desktop (C:\ oder f:\ …)
  • Die Datei via UNC-Pfad geöffnet wurde (\\Server\Share\Folder\Datei.xlsx)
  • Die Datei wurde automatisch zwischengespeichert (Default: 10 Minuten). Das passiert (Default) in %appdata%\roaming\microsoft\excel

In diesen Varianten findet Excel keinen Referenzort der Datei mehr zum relativen Pfad des geöffneten Dokumentes und ändert aus „Sicherheits- und Komfortgründen“ alle Pfade. Allerdings erst beim speichern, solang das Dokument noch geöffnet ist, ist die „zukünftige“ Änderung nicht sichtbar.

Lösung

Es gibt keine „richtige“ Lösung. Links in Excel-Tabellen sind supergefährlich. In dem Moment in den Man Daten (wie z.B. Links) in einer Tabellenkalukation verwendet, ist etwas schief gelaufen, Daten verwaltet man in Datenbanken (z.B. Access).

Aber: man kann das Problem etwas einzuschränken. Das geht natürlich auch per GPO.

  • „Automatisches Speichern“ komplett deaktivieren
  • Unter Optionen/Speichern -> Automatisches Speichern den standardmäßigen Speicherort auf den (relativen!!) Pfad des Dokumentes ändern. Je nach Anzahl der Netzlaufwerke ist es natürlich unsinn, bei jeder Datei den Ort immer wieder zu ändern.

Excel (und alle anderen Office-Apps) speichern alle 10 Minuten die aktuellen Dateien. Das ist auch sehr gut so, denn wenn eine Office-App mal abstürzt oder der Datei-Handle verloren geht (Standy, Docking-Station, WLAN-Wechsel, Windows-Updates, USB-Stick Backup, Netzwerktrennung …) wird man ja von der „letzte bekannte Version“ begrüßt. Selbige kommt genau daher.

IIS SMTP stürzt nach einem in-place upgrade auf Windows Server 2022 ab (Fehler 7031 und Fehler 1000)

Nach der Durchführung eines In-Place-Upgrades von Windows Server 2016 oder 2019 hat der gute alte IIS SMTP Dienst scheinbar ein ernstes Problem: Er stürzt mit einem Fehler ab wenn an eine E-Mail über diesen versenden will. In manchen Fällen erfolgt der Crash auch schon beim einfachen start des SMTPSVC.

Im Ereignisprotokoll (Anwendungsprotokoll) gibt es auch sofort den dazu passenden Fehler:

Name der fehlerhaften Anwendung: inetinfo.exe, Version: 10.0.20348.1, Zeitstempel: 0x20d57e42
Name des fehlerhaften Moduls: SMTPSVC.dll, Version: 10.0.20348.1, Zeitstempel: 0xba4e29ad
Ausnahmecode: 0xc0000005
Fehleroffset: 0x0000000000059abb
ID des fehlerhaften Prozesses: 0x850
Pfad der fehlerhaften Anwendung: C:\WINDOWS\system32\inetsrv\inetinfo.exe
Pfad des fehlerhaften Moduls: C:\WINDOWS\system32\inetsrv\SMTPSVC.dll
[...]

Wir wissen zwar das der IIS6 „deprecated“ ist, haben aber keine Erklärung für Microsofts offensiver „Your Problem“ Haltung zu dieser oftmals vitalen Windows-Komponente.

Es gibt schliesslich einen Haufen guter Gründe, weiterhin ein internes SMTP-Relay zu betreiben. ERP-Software muss in aller Regel Mails versenden, Scanner-Systeme, Alarmmelder und Maschineninformationen wollen Kontakt halten. Kaum eines dieser Systeme beerrscht die sichere Authentifizierung, noch weniger eines möchte man sowas für den Versand ins Internet lassen.

Lösung

Der Trick ist einfach: man muss einfach vor dem Upgrade ein Backup der IIS-Site machen und nach dem Upgrade widerherstellen. Dann läuft alles wie gewohnt und weiterhin geschmiert. Der Grund ist unsinniges Update-Gefummel in der IIS-Metabase, die sich aber erledigt hat wenn man seine alte (fehlerfreie) Version einfach weiterverwendet.

VOR dem Upgrade ein IIS Backup erstellen

Die CMD-Shell „Als Administrator“ öffnen

%windir%\system32\inetsrv\appcmd.exe ADD BACKUP %computername%

Die Backup-Dateien landen sofort in diesem Pfad:

%windir%\system32\inetsrv\backup\%computername%

NACH dem Upgrade das Backup widerherstellen

Die Backup-Dateien gehen wärend des Upgrades zwar nicht verloren (aber paranoide Admins wie wir kopieren den Inhalt des Verzeichnisses natürlich an einen sicheren Ort).

Auch nach dem Update wird die CMD-Shell „Als Administrator“ benötigt:

%windir%\system32\inetsrv\appcmd.exe RESTORE BACKUP %computername%

Außerdem stellt das Setup den IIS SMTP Dienst auf den manuellen Start um, was nach Server-Neustarts zu Kopfkratzen führen könnte. Der Dienst sollte also möglichst wieder automatisch starten:

sc config smtpsvc start=auto
sc start smtpsvc

Und schon funktioniert der SMTP-Server auch unter Windows Server 2022 wieder.

Kalender einer Ressource zeigt keinen Betreff an, sondern den Namen des Organisators

Ein Ressourcenpostfach (z.B. Shared Mailbox) ist in Exchange Online mit „AutoAccept“ (automatische Zusagen, AutomateProcessing) konfiguriert, damit der Kalender Besprechungsanfragen bestätigt.

Die Besprechungsanfragen werden auch korrekt automatisch angenommen. Der Besprechungsbetreff wird im Postfach des Organisators auch angezeigt.

Aber alle anderen Benutzer (mit Berechtigungen auf dem Postfach) sehen statt des Besprechungsbetreffs nur den Namen des Organisators.

Lösung

Dies ist das Standardverhalten von Exchange Online (und Exchange seit 2010) und seither irritierend. Das passiert immer dann, wenn AddOrganizerToSubject und/oder DeleteSubject auf True festgelegt sind.

Aktuelle Einstellung anzeigen:

Get-CalendarProcessing -Identity <RESSOURCE> | fl *subject*

Einstellungen ändern:

Set-CalendarProcessing -Identity <RESSOURCE> -DeleteSubject $false -AddOrganizerToSubject $false

DeleteSubject: Soll der Betreff entfernt werden? (true=ja)

AddOrganizerToSubject: Soll der Name des Organisierenden den Betreff ersetzen? (true=ja)

Microsoft 365 Exchange Online E-Mails zählen

Manchmal muss man wissen, wie viele Nachrichten an einen bestimmten Empfänger gesendet wurden. Zum Beispiel „Wie viele Nachrichten wurden in den letzten 24 Stunden an dieses Postfach gesendet?“.

Das ist leider nicht ganz so einfach, weil Get-MessageTrace nur 1000 Zeilen ausgibt. Man kann das Commandlet zwar mit -PageSize 5000 etwas tunen, aber wenn es um mehr Nachrichten geht, muss man die abzufragende Zeit eingrenzen und addieren.

Anzahl empfangener E-Mails in 24h anzeigen

Wenn man erst mit Import-Module ExchangeOnlineManagement das Exchange Online PowerShell-Modul importiert hat und sich via Connect-ExchangeOnline auch verbunden hat, kann man Nachrichen auflisten und zählen:

Get-MessageTrace -PageSize 5000 -RecipientAddress [email protected] -Start ((get-date -hour 0 -Minute 0 -Second 0).adddays(-1)) -End (get-date -Hour 0 -Minute 0 -Second 0) | Measure-Object

Microsoft 365 Kennwort sofort ablaufen lassen (Änderung des Kennwortes erzwingen)

Manchmal möchte man ein bestimmtes Office 365 Konto schnell geändert wissen. Möglicherweise weil das Kennwort auf einem Zettel unter der Tastatur aufgetaucht ist oder ein Gerät verschwunden ist. Es wäre toll, wenn man den Benutzer schnell zur Änderung zwingen könnte.

Leider gibt Microsoft dem Administrator dafür kein GUI-Werkzeug in die Hand. Man kann in der Oberfläche das Kennwort zwar gewaltsam „zurücksetzen“, aber leider nicht als „abgelaufen“ markieren. Eine Kennwortablaufrichtline gibt es nur Unternehmensweis und nur in Tagen.

Lösung

An der PowerShell ist das natürlich möglich. Man muss dazu das MSOnline Modul in seiner PowerShell aktive haben (import-module MSOnline) und mit dem Microsoft-Tenant verbunden sein (Connect-MsolService).

Erzwingt die sofortige Änderung

Set-MsolUserPassword -UserPrincipalName "[email protected]" -ForceChangePassword $true -ForceChangePasswordOnly $true

⚠ Die Dokumentation des Commandlets „Set-MsolUserPassword“ ist leider unvollständig.

  • ForceChangePassword $true erzwingt das der Benutzer bei der nächsten Anmeldung sein Kennwort ändert
  • ForceChangePasswordOnly $true sorgt dafür, das kein neues Kennwort automatisch vergeben wird

Man kann natürlich auch an der Kommandozeile ein neues Kennwort vorgeben:

Set-MsolUserPassword -UserPrincipalName "[email protected]" -NewPassword "GEHE1MK3NNW0RT"

Oder von der Powershell ein neues Kennwort generieren und setzen lassen:

Set-MsolUserPassword -UserPrincipalName "[email protected]" -ForceChangePassword

Erzwingt die Änderung des Kennwortes nach Datum

Man kann in Set-MsolUserPassword auch beliebige Selektionen hinein-pipen. Das vereinfacht beispielweise die Vorgabe nach einem bestimmten Datum (hier der 24. Juli 2021) oder nach Alter.

Get-MsolUser | where LastPasswordChangeTimestamp -lt (Get-Date 24.07.2021) | Set-MsolUserPassword -ForceChangePassword $true -ForceChangePasswordOnly $true

Hinweis: „Sonderfall“ Outlook

Nachdem man für den nächsten Login eine Passwortänderung „erzwungen“ hat, funktioniert nun allerdings noch das bestehende Passwort und vor Allem Outlook kann wunderbar mit einem bestehenden Session-Token weiterarbeiten (auch mehrere Wochen lang).

Um im Outlook einen neuen Login zu erzwingen, muss man das Session-Token revoken. Das geht ebenfalls per PowerShell, benötigt aber das AzureAD Modul (😑):

Get-AzureADUser -SearchString "[email protected]" | Revoke-AzureADUserAllRefreshToken

Oder für die selben Benutzer wie oben (nach letztem Änderungsdatum):

Get-MsolUser | where LastPasswordChangeTimestamp -lt (Get-Date 24.07.2021) | foreach {Get-AzureADUser -SearchString $_.UserPrincipalName} | Revoke-AzureADUserAllRefreshToken