Bis Windows 7 war die Verknüpfung von Dateiendungen mit den zugehörigen Programmen mittels “einfacher” Registry-Keys realisiert. Wollte man z.B. per Script die Datei-Zuordnungen herstellen, so war dies bequem mittels Registry-Manipulation (z.B. reg.exe, regedit, etc… ) möglich.
Mit Windows 10 und der Einführung von Universal-Apps ist dies (zumindest für einige gängige Datei-Endungen wie z.B. *.pdf, *.html etc…) nicht mehr so einfach möglich. Die Problematik wird nachfolgend anhand der Verknüpfung von PDF-Dateien erläutert, welche standardmäßig mittels Edge geöffnet und dargestellt werden – selbst wenn Adobe Reader installiert wurde!
Applikationen (wie z.B. Adobe Acrobat Reader) können sich unter Windows 10 nicht mehr selbst als Default registrieren, Anwender können Ihre Präferenz ausschließlich über ein von Windows bereitgestelltes GUI interaktiv festlegen, welches nicht nur die Auswahl von Win32-Anwendungen sondern auch von Universal-Apps anbietet:
Ändert man diese Zuordnung, wird dies wie folgt gespeichert:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice
Auffällig hierbei: Neben dem schon aus früheren Windows-Versionen bekannten “ProgId” Wert, der hier die kryptisch anmutende Zeichenfolge “AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723” beinhaltet (es handelt sich hiebei schlicht um den Well-Known-Identifyer für Microsoft Edge), existiert nun auch eine weitere Zeichenfolge “Hash” mit einem kurzen Base64-kodierten Wert.
Verknüpft man nun mittels des oben dargestellten Auswahl-Dialogs den gewünschten Adobe Reader DC mit der Dateiendung PDF, so ändern sich die Registry-Keys wie folgt:
ProgId: AcroExch.Document.DC Hash: Pol5Ki6OyIM= (neuer, stets wechselnder Wert!)
Folgende Erkenntnis gewinnt man, wenn man den Mechanismus näher untersucht:
- Versucht man diese Registry-Keys zu manipulieren, z.B. manuell oder gescriptet anzulegen, so werden diese nicht akzeptiert. Der Auswahl-Dialog erscheint wieder, bzw. die Verknüpfung wird auf Edge wiederhergestellt.
- Die Kombination ProgId + Hash funktioniert nur auf diesem PC, mit diesem Benutzer und nur solange man den UserChoice Registry-Key nicht “touch’t”.
- Im Hash sind daher allem Anschein nach zumindest folgende Merkmale enthalten:
- Dateiendung (.pdf) und ProgId, z.B.: AcroExch.Document.DC
- Zeitstempel des UserChoice Registry Keys
- SID des aktuellen Benutzers, z.B.: S-1-5-21-2884647033-3605804368-1986949432-1005
- Dies führt dazu, dass man dieses Tupel bestehend aus ProgId und Hash nicht auf andere User oder andere Maschinen transferieren kann. Man kann es nicht einmal sichern und wiederherstellen, da der TimeStamp des Registry-Keys hierbei nicht identisch bleibt.
Lösung a’la Microsoft
Microsoft schlägt vor in einer Enterprise-Umgebung die Verknüpfungen mittels Gruppenrichtlinien bzw. DISM zu konfigurieren. Der Haken hierbei: Das funktioniert nicht so, wie man sich das vorstellt. Damit kann man – sofern die aktuelle Windows-Version dies überhaupt beherrscht, offenbar gibts in diversen Releases Bugs – nur den Default von frischen (noch nie angemeldeten) Profilen beeinflussen. Eine Änderung bestehender Profile lässt sich so nicht durchführen. Siehe z.B. hier – ein über bereits mehrere Jahre und Windows-Versionen hinweg sehr emotional geführter Diskussions-Thread, in dem Microsoft wohl nicht ganz zu unrecht vorgeworfen wird hier untätig zu sein und die Kunden bzw. Administratoren im Stich lässt. Offenkundig haben selbst zahlende Kunden die Enterprise-Support in Anspruch genommen haben um eine Lösung zu finden nichts zufriedenstellendes erhalten!
Lösung: Tool das den Hash errechnet
Ich war kurz davor zu versuchen die geheimnisvolle Microsoft’schen Hash-Implementierung selbst zu debuggen. Mit den Suchbegriffen ProgId Hash Timestamp SID kommt man jedoch recht rasch zur Website von Christoph Kolbicz. Sein bereitgestelltes Tool SetUserFTA berechnet den Hash und kann zum gescripteten Setzen der gewünschten Applikation als Default-Handler verwendet werden:
SetUserFTA sets User File Type Associations per commandline or script on Windows 10 and Server 2016.
Beispiel:
SetUserFTA.exe .pdf AcroExch.Document.DC
Funktionskontrolle zeigt: Doppelklick auf eine PDF-Datei startet nun unmittelbar Adobe Reader => Problem elegant gelöst.
Sorge ob das von Christoph Kolbicz bereitgestellte Tool Malware enthalten könnte hatte ich freilich, eine intensive ProcMon-Analyse hat meinerseits jedoch keinerlei Anhaltspunkte für diese Befürchtung ergeben – das Tool tut offenkundig wirklich nur das, was es tun soll und nicht mehr.
Die gleiche Problematik ergibt sich übrigens, wenn die Protokoll-Handler für HTTP/HTTPS etc… geändert werden sollen, also der Default-Browser. Auch hierfür steht ein Tool bereit: SetDefaultBrowser.exe
Alternative Lösungen
Nachtrag (ein paar Jahre später :-)) … es gibt mittlerweile auch alternative Lösungen. Die mir am zweckmäßigsten erscheinende ist z.B. folgende Implementierung als PowerShell-Script, dieser Autor hat aber in seinem GitHub-Repo auch AutoIt-basierte Lösungen und mehr im Fundus: https://github.com/DanysysTeam/PS-SFTA
Danke für das schöne Writeup – wollte nur anmerken, dass man den Hash sehr wohl auf einen anderen PC übertragen kann.
Das geht einfach nicht mit reg export oder ähnlichem, da der Timestamp dann natürlich anders wäre – ABER mit einem Profilmanagement geht das.
Der Hash basiert ja nicht auf Computer, sondern nur auf Benutzer SID – wenn man also die Registry per NTUSER.DAT und USRCLASS.DAT (da sind teilweise die ProgId’s drin) korrekt roamed, dann ist der Hash auf einem anderen Client auch gültig.
Danke Christoph für die Ergänzung. Den Sonderfall die komplette User-Registry unter Beibehaltung der User-SID und Zeitstempel zu transferieren hatte ich in meinen Überlegungen außer Acht gelassen, da dies in meinem Anwendungs-Szenario nicht möglich ist (gleicher Benutzername auf anderem PC, jedoch andere SID).
Hallo,
die Lösung funktioniert bei mir (Windows 10 – 1709) leider nur für kurze Zeit. Nach gefühlt 30 Minuten stellt sich die ProgID auf “AppXd4nrz8ff68srnhf9t5a8sbjyar1cr723” zurück. Da ich jedoch gar keinen Edge Browser mehr habe, sind die PDF Dateien dann ohne Programmverknüpfung. Ich werde langsam wahnsinnig…
Woran kann das liegen?
Ich vermute, dass irgend eine Software den den betreffenden Registry-Eintrag in HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice modifiziert, und damit das Betriebssystem die Einstellungen zurücksetzt. Um den Übeltäter zu finden würde ich mit SysInternals ProcMon die Registry-Zugriffe überwachen und einen Filter für diesen Registry-Zweig einrichten. Jede Form von Schreibzugriff ist verdächtig und sollte den Übeltäter überführen.
danke, das teste ich gerade. Mal sehen, wer der Übeltäter ist 😉
Hallo, ich hab das jetzt mal probiert. Offenbar macht der Explorer (explorer.exe) die Änderung. Kann ich das irgendwie verhindern?
Wir müssen hier zwei Situationen unterscheiden. Einerseits die Situation, dass der Explorer-Prozess wieder einen Default herstellt, weil am Registry-Key eine Manipulation vorgenommen wurde. Und andererseits die Manipulation selbst, die den Explorer dazu animiert wieder den Default herzustellen. Die Manipulation ist es, die wir hier suchen. Wenn es tatsächlich so ist, dass gemäß ProcMon der Explorer.exe Prozess eine Manipulation vornimmt, dann vermute ich das dies eine Dritthersteller-Shell-Extension die vom Explorer-Prozess geladen ist tut. Das sollte sich eigentlich herausfinden lassen, indem man sich die Details des betreffenden Process-Monitor Event Eintrages der manipulativen Registry-Veränderung ansieht. In den Properties -> Stack sollte im Stack-Trace ganz oben erkennbar sein, welches Modul (DLL) hier involviert ist. Ich würde hier irgend eine Dritthersteller-Komponente erwarten.
Hallo zusammen … ich habe ein bestimmtes Problem in Sachen Endungen zu Zuordnung (im Netz nicht gefundenes Ergebnis): habe ich ein Programm, welches ich per RECHTSKLICK ÖFFNEN möchte, bekomme ich folgendes: öffnen mit -> öffnen mit. Also: nach “öffnen mit” (wonach im Anschluss die Auswahl getroffen wird), bekomme ich nochmals “öffnen mit”. Ansonsten ist alles leer.
Gibt es für einen (interessierten) Laien eine Möglichkeit (per Registry?) diesen Wert so zu bearbeiten, dass wieder eine korrekte Auswahl getroffen werden kann (z. B. nach dem “öffnen mit” einer .txt-Datei die Auswahl “Word-Pad” oder “Notepad” zu wählen ist)?
Ergänzung zur Datei (UserSettings.txt eines Spiele-Ordners): anscheinend liegt es an allen “.txt”-Dateien, die diesen ominösen Fehler aufweisen. Unter Standardprogramme kann ich eine individuelle Einstellung treffen; wirkt sich dennoch nicht aus.
Hallo Karlheinz,
Dein Problem scheint mir mit diesem Blog-Artikel von mir nichts zu tun zu haben. Hier geht es um den UserChoice-Mechanismus, aber Deiner Beschreibung zufolge ist mit der Dateiendung um die es Dir geht schlicht nichts verknüpft. Dazu musst Du dir die entsprechenden HKEY_CURRENT_USER\Software\Classes und HKEY_LOCAL_MACHINE\SOFTWARE\Classes Konfigurationen zur Datei-Endung in der Registry ansehen. Ich denke Du bist in einem Forum in dem Du auch Screenshots Deines Problems posten kannst hierzu besser aufgehoben – denn, ohne Dich kritisieren zu wollen – deine Beschreibung erscheint mir etwas schlecht nachvollziehbar zu sein. Einerseits schreibst Du, Du möchtest ein “Programm” mit Rechtsklick öffnen, andererseits dürfte es aber um Dokumente (.txt) gehen. das erscheint mir nicht konsistent. Wenn es um TXT geht solltest Du HKLM\SOFTWARE\Classes\.txt und HKLM\SOFTWARE\Classes\txtfile prüfen, vergleiche doch am Besten mit einem anderen Gerät auf dem es funktioniert. Die gleichen Settings findest du eventuell auch unter HKCU (sofern vom User angepasst, übersteuert allfälliges HKLM Setting).
Hallo Gunnar,
1000 Dank für die prompte Rückmeldung. Die Formulierung mit “Programm” war falsch … war natürlich ein .txt-Dokument gemeint (kommt davon, wenn man oft 2 – 3 Dinge gleichzeitig zu tun versucht). Ich wusste auch nicht, ob ich hier zu 100% richtig bin; kam über die “Google-Suche” zu deiner tollen Seite, welche ich mir gerne als Favoriten setze.
Dennoch bin ich über deine Hilfestellung sehr erfreut, wenngleich ich hier an der falschen Adresse (gelobe Besserung) gelandet bin … so falsch war’s (für mich) dann doch nicht. 😉