Eigentlich bin ich ja kein Dienstleister für Netzwerke und Clients (mehr), aber es gibt da noch eine Ausnahme, die ich ein wenig aus Nostalgie weiterhin betreue: den Landwege e.V.. Dieser hat vergangenes Wochenende einen neuen Server basierend auf Ubuntu 18.04 bekommen, und dabei haben die Clients auch das Update auf Windows 10 erhalten. Außerdem mit dabei: ein neues Mail-Setup auf Basis inkl. Outlook. Da alle das Info-Postfach bearbeiten sollen, wollte ich eine Konfigurations-Vorlage machen und diese über die Domain-Logon-Scripte auf alle Clients verteilen.
Dabei stellte ich fest: das Verschieben eines Outlook-Profils ist gar nicht so einfach. Und das ist ein recht grundsätzliches Problem, was immer dann auftritt, wenn sich der Nutzerordner ändert – also auch, wenn man sein Outlook-Profil einfach nur auf einen neuen Rechner schieben will.
Outlook-Profil: die Bestandteile
Ein Outlook 2016 Profil besteht aus folgenden vier Bestandteilen:
- Dem lokalen Outlook-Ordner in C:\Users\USERNAME\AppData\Local\Microsoft\Outlook
- Die Signaturen in C:\Users\USERNAME\AppData\Roaming\Microsoft\Signatures
- Dem Roaming-Outlook-Ordner in C:\Users\USERNAME\AppData\Roaming\Microsoft\Outlook
- Das Profil in der Registry unter\HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Profiles
Während man 1 und 2 einfach kopieren kann, sind für 3 und 4 Anpassungen nötig.
Pfade anpassen: leider hexadezimal
Sowohl in 3 als auch 4 ist der Pfad der OST-Dateien versteckt. Wenn sich USERNAME ändert, wird dieser invalide, und Outlook startet nicht mehr. Also müssen wir den Pfad ersetzen.
Als Bonus arbeitet Windows mit UTF-16 little endian, so dass vor jedem ASCII-Zeichen ein 0x00 eingefügt werden muss (oder direkt in UTF-16 little endian konvertiert werden muss). Da Profil-Usernamen aber eh nur ASCII-Zeichen enthalten, kann man auch die oft einfachere Einsetz-Methode wählen.
Mit diesem Wissen lassen sich die Pfade der Datei 3) dann ganz gut ersetzen. In 4) hat man dagegen noch eine Zusatzherausforderung: zusätzliche Zeilenumbrüche, so dass ein einfaches Search & Replace nicht mehr funktioniert. Windows ist aber nicht auf die Zeilenumbrüche angewiesen, so dass man sie einfach herauslöschen kann.
Profile konvertieren: das Python-Script
Weil ein manuelles Konvertieren extrem nervig ist, habe ich daraus dann ein Python3-Script geschrieben. Vielleicht nutzt es ja jemandem. Natürlich ist es völlig ohne jede Gewähr, also macht bloß Backups.
#!/usr/bin/env python3
import sys
from binascii import hexlify
if len(sys.argv) != 5:
sys.exit('Benutzung: convert.py SRS-Datei REG-Datei Altes-Profil Neues-Profil')
srs_file_name = sys.argv[1].strip()
reg_file_name = sys.argv[2].strip()
old = sys.argv[3].strip()
new = sys.argv[4].strip()
old_bin = b''
for i in range(0, len(old)):
old_bin += old[i].encode() + b'\0'
new_bin = b''
for i in range(0, len(new)):
new_bin += new[i].encode() + b'\0'
# First: SRS File
with open(srs_file_name, 'rb') as srs_file:
srs_file_content = srs_file.read()
srs_file_content = srs_file_content.replace(old_bin, new_bin)
with open(srs_file_name[0:-4] + '-' + new + '.srs', 'wb') as srs_file:
srs_file.write(srs_file_content)
# Second: REG File in utf16-l in utf16-le
with open(reg_file_name, 'rb') as reg_file:
reg_file_content = reg_file.read().decode('utf-16-le')
# remove stupid newlines
reg_file_content = reg_file_content.replace('\x5c\x0d\x0a\x20\x20', '')
old_hex = hexlify(old_bin).decode("utf-8")
old_hex = ','.join(a+b for a,b in zip(old_hex[::2], old_hex[1::2]))
new_hex = hexlify(new_bin).decode("utf-8")
new_hex = ','.join(a+b for a,b in zip(new_hex[::2], new_hex[1::2]))
# replace hex
reg_file_content = reg_file_content.replace(old_hex, new_hex)
with open(reg_file_name[0:-4] + '-' + new + '.reg', 'wb') as reg_file:
reg_file.write(reg_file_content.encode())
Fehlende Features
Bei dem Umzug muss man sämtliche Passwörter neu eingeben. Das war mir automatisiert zu nervig, und mal schnell Copy Pasten ist im begrenzen Maße gut machbar. Wie immer bei Windows-Software gibt es ziemlich wenig Doku, aber dafür müsste man wohl ebenfalls die Registry auseinander nehmen. Wer mein Python-Script ergänzen will: einfach anmailen!
Hallo Ernesto,
dieses Script hat mir ziemlich viel Arbeit erspart. Vielen Dank dafür!
Wenn ich gewusst hätte, dass du sowas auch machst, hätte ich wohl viel früher bei dir gesucht 😉
Eigentlich mache ich sowas auch nicht (mehr). Das ist für den letzten Altkunden entstanden, bei dem ich noch was mit Client-Rechnern zu tun habe. Aber als Nerd weiß man sich halt einigermaßen zu helfen, selbst bei Aufgaben, die ich eigentlich gar nicht mehr so gerne machen mag, weil nicht Fokus-Thema. 😉
PS: ist ironischerweise übrigens in meine Beschäftigung mit Girocards reingefallen, da gibts auch Krieg mit Binär-Daten, und da war das Script eine hübsche Fingerübung zum Verständnis.
Hey,
cooles Skript, sowas hab ich gesucht.
Nur leider habe ich keine Ahnung von Python und keine Ahnung, was man dem Sktipt als Parameter übergeben soll… Die Ausgabe SRS-Datei REG-Datei Altes-Profil Neues-Profil ist da wenig hilfreich. Kannst du eine kurze Auflistung (am besten mit Beispielen) ergänzen?
Besten Dank.
… [Trackback]
[…] Read More: binary-butterfly.de/artikel/outlook-2016-profil-zu-neuem-nutzer-umziehen/ […]