App Volumes 4.x – mehrere Betriebssysteme [ohne Support]
Update 23.03.2021: Mit Version 2103 hat diese Funktion wieder Einzug in das offizielle Produkt erhalten: https://docs.vmware.com/en/VMware-Horizon/2103/rn/horizon-2103-release-notes.html
In App Volumes 4.x ist die Möglichkeit entfallen einen AppStack mehreren Betriebssystemen zuzuweisen.
Während es in App Volumes 2.X noch möglich war in der GUI einen AppStack mehreren Betriebssystemen hinzuzufügen, so ist dies in der Version 4 verschwunden. Somit kann man eine Applikation nicht sowohl auf Windows 10 wie auch auf einem RDSH zur Verfügung stellen.
Man kann zwar die entsprechende Applikation zuweisen, sie wird am Zielsystem aber nicht gemountet.
Dies ist etwas unzufriedenstellend wenn man sowohl Windows 10 Desktops wie auch RDSHs betreibt.
Doch mit einem Trick kann man das Ziel dennoch erreichen:
Doch dazu muss man die Datenbank bearbeiten.
An dieser Stelle sei gesagt das es von VMware nicht unterstützt wird die Datenbank manuell zu bearbeiten, man dies auf eigene Verantwortung tut und GSS den Support verweigern kann, sollte es hierdurch zu Problemen kommen. Ich selbst stelle auch keine Unterstützung für diese Änderung bereits und weise ausdrücklich darauf hin das die hier beschriebene Änderung auf eigene Gefahr geschieht und nicht in produktiven Umgebungen eingesetzt werden sollte. Auch kann ich nicht garantieren das dies in jeder Umgebung funktioniert.
Insgesamt gibt es drei Tabellen in denen die validen Betriebssysteme gespeichert sind:
- app_package_operating_systems
- snapvol_operating_systems
- snapvol_app_bundle_operating_systems
Um dies zu erleichtern, habe ich ein SQL-Script entwickelt und als Stored Procedure gespeichert.
Man sollte immer, vor jeder Datenbankänderung, eine Sicherung dieser haben um im Fehlerfalle die Änderung rückgängig machen zu können.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
USE [APPVOLS01] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: René Gessinger -- Create date: 02/16/2021 -- Description: add an additional operating system to the named application -- ============================================= CREATE PROCEDURE [dbo].[add_additional_os] @app nvarchar(30) = NULL, @app_id bigint = NULL, @os bigint AS BEGIN SET NOCOUNT ON; if (@app IS NULL AND @app_id IS NULL) OR @os IS NULL return -1 if 0 = (SELECT COUNT(*) FROM [APPVOLS01].[dbo].[operating_systems] WHERE [id] = @os) return -1 DECLARE @product_id bigint; DECLARE @package_id bigint; DECLARE @snapvol_id bigint; DECLARE @snapvol_bundle_id bigint; SET @product_id = @app_id; if @product_id IS NULL SET @product_id = (SELECT [id] FROM [APPVOLS01].[dbo].[app_products] WHERE [name] = @app); DECLARE @package_cursor Cursor; SET @package_cursor = CURSOR FOR SELECT [id] FROM [APPVOLS01].[dbo].[app_packages] WHERE [app_product_id] = @product_id AND [delete_status] IS NULL AND [version] IS NOT NULL AND [version] != '(unknown)'; OPEN @package_cursor; FETCH NEXT FROM @package_cursor INTO @package_id; WHILE @@FETCH_STATUS = 0 BEGIN if 0 = (SELECT COUNT(*) FROM [APPVOLS01].[dbo].[app_package_operating_systems] WHERE [app_package_id] = @package_id AND [operating_system_id] = @os) INSERT INTO [APPVOLS01].[dbo].[app_package_operating_systems] (app_package_id, operating_system_id, primordial, created_at, updated_at) VALUES (@package_id, @os, 1, GETDATE(), GETDATE()); DECLARE @snapvol_cursor Cursor; SET @snapvol_cursor = CURSOR FOR SELECT [snapvol_id] FROM [APPVOLS01].[dbo].[app_package_package_vols] WHERE [app_package_id] = @package_id AND [snapvol_type] = 'Snapvol'; OPEN @snapvol_cursor; FETCH NEXT FROM @snapvol_cursor INTO @snapvol_id; WHILE @@FETCH_STATUS = 0 BEGIN if 0 = (SELECT COUNT(*) FROM [APPVOLS01].[dbo].[snapvol_operating_systems] WHERE [snapvol_id] = @snapvol_id AND [operating_system_id] = @os) INSERT INTO [APPVOLS01].[dbo].[snapvol_operating_systems] (snapvol_id, operating_system_id, primordial, created_at, updated_at) VALUES (@snapvol_id, @os, 1, GETDATE(), GETDATE()); SET @snapvol_bundle_id = ( SELECT [id] FROM [APPVOLS01].[dbo].[snapvol_app_bundles] WHERE [snapvol_id] = @snapvol_id ); if 0 = (SELECT COUNT(*) FROM [APPVOLS01].[dbo].[snapvol_app_bundle_operating_systems] WHERE [snapvol_app_bundle_id] = @snapvol_bundle_id AND [operating_system_id] = @os) INSERT INTO [APPVOLS01].[dbo].[snapvol_app_bundle_operating_systems] (snapvol_app_bundle_id, operating_system_id, primordial, created_at, updated_at) VALUES (@snapvol_bundle_id, 14, 1, GETDATE(), GETDATE()); FETCH NEXT FROM @snapvol_cursor INTO @snapvol_id; END; CLOSE @snapvol_cursor; DEALLOCATE @snapvol_cursor; FETCH NEXT FROM @package_cursor INTO @package_id; END; CLOSE @package_cursor; DEALLOCATE @package_cursor; return 0; END GO |
Die Prozedur erwartet drei Parameter, wovon die ersten beiden gegenseitig austauschbar sind.
- app: Name der Applikation (wenn ID nicht bekannt)
- app_id: Die ID der Applikation (wenn bekannt)
- os: die ID des neuen Betriebssystemes
app_id wird automatisch aus dem Parameter
app gebildet, wenn die ID nicht angegeben wird.
Ist aber
app_id angegeben, wird der Parameter
app ignoriert.
Für die möglichen IDs für den Parameter
os muss ich etwas mehr angeben. Diese sind in der Tabelle
operating_systems gespeichert:
ID | Betriebssystem |
---|---|
1 | Windows 10 (x86) |
2 | Windows 10 (x64) |
3 | Windows 8.1 (x86) |
4 | Windows 8.1 (x64) |
5 | Windows 8 (x86) |
6 | Windows 8 (x64) |
7 | Windows 7 (x86) |
8 | Windows 7 (x64) |
9 | Windows Server 2012 R2 (x64) |
10 | Windows Server 2012 (x64) |
11 | Windows Server 2008 R2 (x64) |
12 | Windows Server 2008 (x86) |
13 | Windows Server 2008 (x64) |
14 | Windows Server 2016/2019 (x64 |
Zu beachten ist das meine Datenbank APPVOLS01 heißt und eventuell angepasst werden muss. Die Prozedur kann man entweder per SQL Management Studio ausführen oder z.B. über Powershell.
Eine Beispielimplementation habe ich ebenfalls in T-SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
DECLARE @app_id bigint; DECLARE @app_cursor Cursor; DECLARE @return_value int DECLARE @app_result TABLE (id bigint, result int); SET @app_cursor = CURSOR FOR SELECT [id] FROM [APPVOLS01].[dbo].[app_products] WHERE [delete_status] IS NULL; OPEN @app_cursor; FETCH NEXT FROM @app_cursor INTO @app_id; WHILE @@FETCH_STATUS = 0 BEGIN EXEC @return_value = [APPVOLS01].[dbo].[add_additional_os] @app = NULL, @app_id = @app_id, @os = 14 INSERT INTO @app_result VALUES (@app_id, @return_value); FETCH NEXT FROM @app_cursor INTO @app_id; END; CLOSE @app_cursor; DEALLOCATE @app_cursor; SELECT * FROM @app_result; |
Nun kann die Applikation auch an einem RDSH gemountet werden.