Teil­neh­mer

web.sta – web basier­te Appli­ka­ti­on, Ziel-Web­brow­ser ist Inter­net Explo­rer der Ver­si­on 9 und 11

Text­Sys­tem – eine eigen­stän­di­ge Desk­top-Anwen­dung, basie­rend auf Java/Swing

Inter­me­dia­teLay­er – eine Cli­ent-Ser­ver Anwen­dung, die web.sta und Text­Sys­tem mit­ein­an­der ver­bin­det.

web.sta kann Text­Sys­tem über den Inter­me­dia­teLay­er star­ten. Inter­me­dia­teLay­er erstellt zu die­sem Zweck einen HTTP-Ser­ver und web.sta sen­det ein­fa­che GET- oder POST-Abfra­gen an den local­host. Inter­me­dia­teLay­er ver­ar­bei­tet die Ein­gangs­pa­ra­me­ter und star­tet das Text­Sys­tem. Da kei­ne Rück­mel­dung erfor­der­lich ist, ist das Inter­ak­ti­ons­sche­ma ein­fach und robust genug.

Citrix

In einer Citrix-Umge­bung ist es nicht mög­lich, meh­re­re Lis­ten­ing-Sockets für die­sel­be IP-Adres­se und den­sel­ben Port zu erstel­len. Man muss ent­we­der den Port oder die IP-Adres­se ändern. Citrix bie­tet jedoch einen spe­zi­el­len Mecha­nis­mus an, um die­se Ein­schrän­kung zu umge­hen, ohne den Algo­rith­mus des Pro­gramms zu ändern. Die­ser Mecha­nis­mus wird als „Vir­tu­al IP Loop­back“ bezeich­net. Hier muss der Admi­nis­tra­tor ein­fach die erfor­der­li­chen Anwen­dun­gen im Citrix-Kon­fi­gu­ra­ti­ons­fens­ter kon­fi­gu­rie­ren. Die Anwen­dung, die „local­host“ für Socket-Ver­bin­dun­gen ver­wen­det, erhält nicht 127.0.0.1, son­dern eine IP-Adres­se in der Form 127.0.0.<SID + 1>, wobei SID die Sit­zungs-ID des Win­dows-Benut­zers ist.

Die Pro­ble­ma­tik

Unter IE9 (und auch mit ande­ren Brow­sern) unter Win­dows Ser­ver 2008 R2 funk­tio­nier­te dies alles ein­wand­frei. Dann jedoch woll­te der Kun­de etwas Neu­es und Win­dows Ser­ver 2012 R2 erschien mit IE11. Das gan­ze Sys­tem hör­te auf zu funk­tio­nie­ren. Unab­hän­gig von den Citrix Ein­stel­lun­gen ver­sucht IE11 bei Abfra­gen auf „local­host“ immer eine Ver­bin­dung zu 127.0.0.1 her­zu­stel­len, die­se natür­lich schei­tert, weil auf der Adres­se kei­ner Hörer (Lis­tener) gibt. Nach ein wenig Recher­che kamen wir zu dem Schluss, dass dies ein Bug in IE11 sein muss.

Rou­ting­Ser­vice

Wenn die Vir­tua­li­sie­rung des „local­host“ in Citrix-Box für IE11 nicht funk­tio­niert, schrei­ben wir sie selbst!
Des­halb ent­schlos­sen wir uns, selbst einen Win­dows-Dienst zu erstel­len, der ein ein­fa­cher Web­ser­ver ist und zu 127.0.0.1 eine Ver­bin­dung auf­baut und damit alle Abfra­gen auf der Grund­la­ge der Sit­zungs­num­mer des Benut­zers an den gewünsch­ten Inter­me­dia­teLay­er umlei­ten. Wir haben kei­ne ein­fa­che Lösung gefun­den, um die SID zu ermit­teln, aber in den Umge­bungs­va­ria­blen haben wir sofort SES­SI­ONNA­ME gefun­den. Im Inter­net Explo­rer bekom­men wir über ActiveX die­se Umge­bungs­va­ria­ble und über­ge­ben sie als Para­me­ter in der HTTP-Abfra­ge wei­ter. Im Rou­ting­Ser­vice erhal­ten wir durch den Sit­zungs­na­men unter wtsapi32.lib die Sit­zungs­num­mer. Dann lei­ten wir die HTTP-Abfra­ge um und sen­den die Ant­wort an den IE zurück.

Etwas ist schief gelau­fen

Wir haben mit dem Tes­ten und der Inte­gra­ti­on unse­res Ser­vice begon­nen. Aber nicht alles lief so rei­bungs­los, wie wir es uns gewünscht hat­ten.
Wie sich her­aus­stell­te, kann der Name der Sit­zung geän­dert wer­den, obwohl wir nicht ver­stan­den haben, unter wel­chen Bedin­gun­gen dies geschieht. Es kam jedoch häu­fig vor, dass der Sit­zungs­na­me geän­dert wur­de aber IE11 nur den Anfangs­wert der Umge­bungs­va­ria­blen kennt und die­sen Wert dau­er­haft an den Rou­ting­Ser­vice wei­ter­gibt.

Was ist in der Regis­try?

Es war not­wen­dig, einen ande­ren Weg zu fin­den, um den Sit­zungs­na­men zu ermit­teln. Wir haben nach Infor­ma­tio­nen zu Sit­zun­gen in der Regis­try gesucht und wur­den fün­dig: Unter HKEY_CURRENT_USER \ Vola­ti­le Envi­ron­ment ist es mög­lich eine Lis­te aller Sit­zun­gen des aktu­el­len Benut­zers abzu­ru­fen.

Wenn es nur um eine Anmel­dung geht, ist alles in Ord­nung, wir kön­nen sie lesen und ver­wen­den. Wenn es für einen Benut­zer jedoch vie­le Sit­zun­gen gibt, müs­sen wir irgend­wie fest­stel­len, in wel­cher Sit­zung wir uns befin­den. Die bes­te Mög­lich­keit die uns ein­fiel war, den Pfad zum Ord­ner mit den tem­po­rä­ren Datei­en abzu­glei­chen.

Bei­spiel:

Im IE erhal­ten wir den aktu­el­len Pfad zu TEMP mit­hil­fe von ActiveX Scripting.FileSystemObject. Auf die­se Wei­se konn­ten wir den Namen unse­rer Sit­zung ermit­teln. Aber das ist nicht alles. Der Wert der Schlüs­sel in der Vola­ti­le Envi­ron­ment ist in der Tat die SID. Somit kön­nen wir sofort die erfor­der­li­che IP-Adres­se in Java­Script abru­fen und eine Anfra­ge an die­se sen­den.

Sol­len wir es ver­ein­fa­chen?

Schließ­lich kön­nen wir die SID abru­fen und direkt eine Ver­bin­dung her­stel­len, ohne den Rou­ting­Ser­vice zu ver­wen­den. Aber der Lösungs­weg sieht immer noch nicht schön aus. Die Inter­net­su­che hat gezeigt, dass das Pro­blem besteht, aber wie es beho­ben wer­den kann wird nir­gend­wo beschrie­ben. Und auch Micro­soft bie­tet dazu bis­her kei­ne Lösung.

Wir hof­fen, dass jemand mit die­sem spe­zi­fi­schen Pro­blem von unse­rer Erfah­rung pro­fi­tie­ren kann.