Buch
- App-V Infrastruktur
- App-V Client
- App-V Sequenzierung
- Tools & Troubelshooting
- PowerShell mit App-V
Diesen Artikel habe ich ursprünglich in mehreren Teilen auf meinem englischen Blog https://www.andreasnick.com veröffentlicht. Insbesondere einem Bekannten ist es zu verdanken, dass nun auch eine deutsche Version vorliegt und hier veröffentlicht wird. Ich selber lese lieber technische Artikel auf deutsch nur ist die Interessengruppe etwas kleiner. Nun heute, am 23.12. als kleines Vorweihnachtsgeschenk an die Community endlich auch die deutsche Version dazu wie der geniale Microsoft Edge mit App-V zu virtualisieren ist.
Microsoft hat vor einigen Monaten einen neuen Edge-Browser auf der Basis des Google Engine Chromium herausgebracht. Dieser wird über eine bestehende Installation installiert, kann aber auch auf Serversystemen die bisher keinen Edge-Browser hatten nachinstalliert werden. Interessant ist, dass dieser Edge problemlos auf älteren Systemen wie Server 2012 R2 oder Windows 8.1 installiert werden kann. Schön ist, dass sich der neue Edge-Browser leicht mit App-V virtualisieren lässt. Wir haben seit dem Release eine App-V variante der Anwendung im Einsatz und bisher keine Probleme damit.
Anmerkung: Das Dokument Edge mit App-V virtualisieren ist insbesondere Thorsten @endi24 zu verdanken. Vielen Dank für den Support! Weiterhin danke ich @bsplittg für das Testen des PaketesDas Paket funktioniert auf aktuellen und auf allen älteren Microsoft-Betriebssystemen, wenn es mit einem klassischen (nicht ADK) Sequencer (App-V 5.1) erstellt wird. Dabei kann das Edge App-V Paket parallel zu einem vorhanden Edge funktionieren. Ein App-V Edge-Browser hat, wenn man möchte, eigene Einstellungen. Beispielsweise eine eigene Startseite oder eine andere Suchmaschine.
Das alles gilt nur für Windows-Systeme. Denn den neuen Edge-Browser gibt es auch für MacOS!
Zu finden ist dieser Browser als online Installation unter:
https://www.microsoft.com/en-us/edge
Bzw. in Deutschland unter:
https://www.microsoft.com/de-de/edge
Weiterhin findet sich eine Insider Version unter:
https://www.microsoftedgeinsider.com/de-de/download/
Für uns ist jedoch die offline Variante vom neuen Edge am interessantesten. Diese ist hier zu finden:
https://www.microsoft.com/en-us/edge/business/download
Zum Zeitpunkt dieses Blogs ist die Version 87 (Current) die aktuelle „Stable" Version, die wir für das App-V Paketnutzen wollen. Als Voraussetzung für die Paketierung mit App-V empfiehlt sich offline Version der Anwendung. Es gibt aktuell keine MSIX Version zum Download. Microsoft scheint hier selber nicht so auf die neue Technik zu setzen, obwohl Office 365 bald darüber verteilt werden soll. Wir bekommen ein klassisches MSI Paket „MicrosoftEdgeEnterpriseX64.msi" für die Installation.
Anmerkung: Eine 64 Bit Version von Edge wird dennoch nach c:\Programm Files (x86) installiert!
Es wird ein DCOM Subsystem gefunden, welches nicht virtualisiert werden kann. Meistens werden diese in den Anwendungen nicht benötigt.
{1FCBE96C-1697-43AF-9140-2897C7C69767} (LocalService)
Wenn wir nach der Komponente suchen, erkennen wir, dass es sich um den Edge Elevation Service handelt.
In Chrome ist der Elevation_Service ist eine eigenständige ausführbare Datei, die vom Chrome-Browser auf dem Computer des Benutzers installiert wird. Wir finden diese unter „C:\Program Files (x86)\Microsoft\Edge\Application\87.0.664.66\elevation_service.exe"
Genutzt wird dieser Service in Edge, um Komponenten und Updates zu installieren, die höhere Rechte benötigen. Beides wollen wir in einem App-V Paket nicht. Im Gegenteil - diese Dienste deaktivieren oder löschen wir.Auf einem Server oder Desktop, auf dem der Citrix VDA installiert ist, führt der Start eines des Edge zu einem weißen Fenster. Das passiert nicht mit dem App-V Paket. Wer hier näheres wissen will findet dazu hier einen Blog:
Wir verschieben im späteren Verlauf die Benutzerdaten von Edge in den Roaming Teil. Hier hat Microsoft scheinbar auch das schlechte Konzept von Crome übernommen, alles nach AppDataLocal zu speichern. FSLogix hat hier kein Problem und dieser Teil kann vielleicht ignoriert werden.
Zum Profilmanagement gibt es hier einen schönen Artikel. U.a. werden Citrix Profilemanager und VMWare DEM betrachtet. Zu beachten ist, dass das App-V Rezept unten alles nach %Appdata% umleitet. Daher ändern sich die Pfade. Wir müssen eher Pfade exkludieren. Im Besonderen den FSLogix den Cache Pfad!
Exclusion wenn nach AppDataLocal gespeichert wird:
Appdata\Local\Google\Chrome\User Data\Default\Cache
Exclusion für FSLogix und Microsoft Roaming Profiles wenn nach AppData gespeichert wird:
Appdata\Roaming\Microsoft\Edge\Default\Cache
Optional:
Appdata\\ Microsoft\Edge\User Data\Default\JumpListIconsMostVisited
Appdata\ \ Microsoft\Edge\User Data\Default\JumpListIconsRecentClosed
AppData\\ Microsoft\Edge\User Data\Default\Media Cache
Dienste werden deaktiviert:
Bei Bedarf weitere Sprachen hinzufügen.
Edge://settings/languages
Bei Bedarf weitere Sprachen hinzufügen.
Edge://settings/languages
Neue Sprachen:
Hintergrundeinstellungen
Edge://settings/SystemWenn das Paket auch auf älteren Systemen funktionieren soll, müsst ihr zwingend einen App-V 5.1 Sequencer nutzen. Für aktuelle Umgebungen empfehle ich den Sequencer aus dem ADK 1807.
Insbesondere kann der Ordner [{ProgramFilesX86}]\Microsoft\Edge\Application\81.0.416.53\Installer gelöscht werden. Hier liegt noch einmal ein vollständiges Setup. Andere Elemente sind [{SystemX86}], [{Windows}]\Serviceprofiles (Dienste) und [{AppVPackageDrive}]\Boot (warum auch immer etwas am BCD verändert wird?).
<?xml version="1.0" encoding="utf-8"?> <SequencerTemplate xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <AllowMU>false</AllowMU> <AppendPackageVersionToFilename>true</AppendPackageVersionToFilename> <AllowLocalInteractionToCom>false</AllowLocalInteractionToCom> <AllowLocalInteractionToObject>false</AllowLocalInteractionToObject> <FullVFSWriteMode>false</FullVFSWriteMode> <ExcludePreExistingSxSAndVC>false</ExcludePreExistingSxSAndVC> <FileExclusions> <string>[{CryptoKeys}]</string> <string>[{Common AppData}]\Microsoft\Crypto</string> <string>[{Common AppData}]\Microsoft\Search\Data</string> <string>[{Cookies}]</string> <string>[{History}]</string> <string>[{Cache}]</string> <string>[{Local AppData}]</string> <string>[{LocalAppDataLow}]</string> <string>[{Personal}]</string> <string>[{Profile}]\Local Settings</string> <string>[{Profile}]\NTUSER.DAT.LOG1</string> <string>[{Profile}]\NTUSER.DAT.LOG2</string> <string>[{Recent}]</string> <string>[{Windows}]\Debug</string> <string>[{Windows}]\Logs\CBS</string> <string>[{Windows}]\Temp</string> <string>[{Windows}]\WinSxS\ManifestCache</string> <string>[{Windows}]\WindowsUpdate.log</string> <string>[{AppVPackageDrive}]\$Recycle.Bin</string> <string>[{AppVPackageDrive}]\System Volume Information</string> <string>[{AppData}]\Microsoft\AppV</string> <string>[{Local AppData}]\Temp</string> <string>[{ProgramFilesX64}]\Microsoft Application Virtualization\Sequencer</string> <string>[{Profile}]</string> <string>[{AppVPackageDrive}]\Boot</string> <string>[{Windows}]\ServiceProfiles</string> <string>[{SystemX86}]</string> <string>[{Quick Launch}]</string> <string>[{User Pinned}]</string> <string>[{System}]</string> <string>[{Common AppData}]</string> <string>[{ProgramFilesX86}]\Microsoft\Edge\Application\81.0.416.53\Installer</string> <string>[{Common Programs}]</string> </FileExclusions> <RegExclusions> <string>REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography</string> <string>REGISTRY\MACHINE\SOFTWARE\Microsoft\Cryptography</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Microsoft\Windows\CurrentVersion\Explorer\StreamMRU</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\StreamMRU</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\Streams</string> <string>REGISTRY\MACHINE\SOFTWARE\Microsoft\AppV</string> <string>REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\AppV</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Microsoft\AppV</string> <string>REGISTRY\USER\[{AppVCurrentUserSID}]\Software\Wow6432Node\Microsoft\AppV</string> </RegExclusions> <TargetOSes /> </SequencerTemplate>
Weitere Referenzen:
https://www.askwoody.com/2020/privacy-update-brave-is-the-most-private-browser-edge-blabs-like-crazy/
Seit unserem ersten Blog zu dem Thema sind inzwischen Monate vergangen. In dieser Zeit hat sich der Edge als App-V Anwendung als sehr stabil erwiesen. Wenn ich dann von Zeit zu Zeit lese, dass mal wieder eine neue kritische Sicherheitslücke auftaucht, können wir mir dem virtuellen Edge schnell darauf reagieren.
An dieser Stelle mache ich gerne noch einmal darauf aufmerksam, dass wir regelmäßig den Edge und andere Browser für unsere Kunden erstellen. Das mit bekannten AppV Bugfixen und mit kundenspezifischen Einstellungen. Bei Interesse sprecht mich bitte darauf an. Beispielsweise auf Twitter @Nickinformation
Generell funktioniert der IE Mode mit dem neuen Edge. Dabei wird der Internet Explorer in das Edge Fenster integriert. Leider öffnet der Edge Browser immer ein neues Fenster und integriert den Internet Explorer nicht in das Edgefenster. Aussehen soll das wie in der folgenden Abbildung. Dabei zeigt der Edge ein kleines Internet Explorer Symbol neben der Adressleiste.
Erst nachdem man den Edge einmal als Administrator gestartet at funktioniert alles korrekt.
Auf das Problem aufmerksam gemacht hat mich Ben Splittgerber @_qwertzu
Im Weiteren folgt hier auch die Lösung.
Konfiguriert wird der IE Mode über eine Gruppenrichtlinie. Entweder per User oder für den Computer: Computer → Administrative Templates → Microsoft Edge → Configure Internet Explorer Integration. Hier auf „Internet Explorer Mode" stellen.
Weiterhin über die Sitelist.xml. Diese mit dem Tool „Enterprise Mode Site List Manager (schema v.2)" erstellt werden. https://www.microsoft.com/en-us/download/details.aspx?id=49974
Dort wird u.a. festgelegt, wie eine Webseite aus der Sitelist dargestellt wird. Es ist auch möglich eine IE Webseite immer im IE zu starten.
Die Liste legt ihr in eine Freigabe. Anschließend konfiguriert ihr wieder eine Gruppenrichtlinie. Entweder per User oder für den Computer: Computer → Administrative Templates → Microsoft Edge → Configure the Enterprise Site List. Abschließend den SMB Pfad auf die Freigabe eintragen.
Nun funktioniert das Ganze aber noch nicht als App-V Paket. Ich habe das Problem analysiert. Sobald man sich auf eine „Internet Explorer" Seite begibt, möchte Edge administrative Rechte haben. Werden diese gewährt, funktioniert alles. Das ist für ein App-V Paket kein Problem. App-V Anwendungen dürfen in Ihrem Dateisystem und in der App-V Registrierung administrative Aktionen durchführen. Es ist ja nicht das ganze System betroffen. Es muss ein Ein Fehlalarm sein!
Und tatsächlich, nach einer eingehenden Analyse mit dem Sysinternals Procmon konnte der Übeltäter schnell gefunden werden:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\EdgeIntegration] "Supported"=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\EdgeIntegration\AdapterLocations] "C:\\Program Files (x86)\\Microsoft\\Edge\\Application"=dword:00000001 "C:\\ProgramData\\App-V\\45B86F47-8C7E-4AFB-A8CF-F31F14BECC2E\\BE041909-4063-4984-A66A-0F1BBE446AA2\\Root\\VFS\\ProgramFilesX86\\Microsoft\\Edge\\Application"=dword:00000001
Gib deinen Text hier ein ...
Die Lösung ist recht einfach. Wir erweitern die DeploymentConfig.xml um den folgenden Skriptteil.
<UserScripts> <StartVirtualEnvironment RunInVirtualEnvironment="true"> <Path>c:\Windows\system32\reg.exe</Path> <Arguments>ADD "HKLM\SOFTWARE\Microsoft\Internet Explorer\EdgeIntegration\AdapterLocations" /v "[{AppVPackageRoot}]\VFS\ProgramFilesX86\Microsoft\Edge\Application" /t REG_DWORD /d 1 /f</Arguments> <Wait RollbackOnError="true"/> </StartVirtualEnvironment> </UserScripts>
Ich habe hier den einfachsten Ansatz gewählt. Damit wird kein Skript im App_V Paket benötigt. Komplexer geht natürlich immer.
Damit wird der Registrierungsschlüssel mit dem Start von Edge gesetzt und der IE Mode funktioniert.
Alternativ könne man mit einem Editor, der die VersioID nicht ändert diesen Schlüssel direkt im Paket setzen.
Es gibt in letzter Zeit ein Problem mit dem Fonts Subsystem, welches zu einem Crash des Edge geführt hat. Gefunden hat das Problem @Royessers
Das Problem kann leicht gelöst werden, indem das Font Subsystem in der DeploymentConfig.xml deaktiviert wird.
<Fonts Enabled=“false“ />
Die neue DeploymentConfig.xml muss anschließend im PublishingServer importiert werden.
Die Zusammenspiel mit Office 365 klappt herforragend, wenn der folgende Registrierungsschlüssel gesetzt ist:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClickToRun\OverRide]
"AllowJitvInAppvVirtualizedProcess"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ClickToRun\OverRide]
"AllowJitvInAppvVirtualizedProcess"=dword:00000001
Wenn ein Microsoft Office lokal installiert ist, kann es zu Problemen mit den Protokolltreibern kommen. Beispielsweise das Öffnen eines Excel Dokuments in Sharepoint. Das ist einer der Gründe, warum Anwendungen, die mit Office interagieren am besten auf einem Sequencer mit einem lokal installierten Office sequenziert werden. Es geht auch anderes. Die das folgende Skript „simuliert" ein lokales Office und sollte vor der Paketierung von Edge auf dem Sequencer ausgeführt werden.
#Create Regkeys for Office if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\11.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\11.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\12.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\12.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\13.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\13.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\14.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\14.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\15.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\15.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\16.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\16.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKCU:\SOFTWARE\Microsoft\Office\17.0") -ne $true) { New-Item "HKCU:\SOFTWARE\Microsoft\Office\17.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\11.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\11.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\12.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\12.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\13.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\13.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\14.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\14.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\15.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\15.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\16.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\16.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\Microsoft\Office\17.0") -ne $true) { New-Item "HKLM:\SOFTWARE\Microsoft\Office\17.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\11.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\11.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\12.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\12.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\13.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\13.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\14.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\14.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\15.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\15.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\16.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\16.0" -force -ea SilentlyContinue }; if((Test-Path -LiteralPath "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\17.0") -ne $true) { New-Item "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\17.0" -force -ea SilentlyContinue }; #Create Folders for Office if(-not (Test-Path 'C:\Program Files (x86)\Microsoft') ) {new-Item 'C:\Program Files (x86)\Microsoft' -Type Directory -Force} if(-not (Test-Path 'C:\Program Files (x86)\Microsoft\Office') ) {new-Item 'C:\Program Files (x86)\Microsoft\Office' -Type Directory -Force} if(-not (Test-Path 'C:\Program Files\Microsoft') ) {new-Item 'C:\Program Files\Microsoft' -Type Directory -Force} if(-not (Test-Path 'C:\Program Files\Microsoft\Office') ) {new-Item 'C:\Program Files\Microsoft\Office' -Type Directory -Force}
Kommentare 2
Hello!
Thank you for this article/guide!
It doesn't work for me the IE mode solution
Should I update/edit only the "UserScripts" in the "deploymentconfig.xml" file and add it/save it to the App-V package or should I also create a GPO/policy that adds the reg keys that you described and apply it on the Windows Server so it has the reg keys "Supported" and "C:\\Program Files (x86)\\Microsoft\\Edge\\Application" and "C:\\ProgramData\\App-V\\ID\\Version ID\\Root\\VFS\\ProgramFilesX86\\Microsoft\\Edge\\Application"?
My issue/problem is the URL:s I have added for IE mode in the Edge browser that I have packaged with App-V that the URLs doesn't open up in the same Edge browser it redirects the URL:s and opens up instead in a new window in the Internet Explorer browser? I also get the administrator authorization pop up window when it tries to open the URL:s that I have added for IE mode for the Edge browser.
One problem is that we also need a VersionID in the registry key and that in the virtual environment. However, the VersionID is not set until it is saved. If the registry key is set to merge, the key can also be set outside via a GPO. Otherwise the described script over a UserConfig.xml is the best way. By the way, I have also published the article in English on http://www.andreasnick.com.