VisualBasic Erkennt VB6 Citrix u.a. ?

Nossi

Captain
Registriert
Okt. 2002
Beiträge
3.893
Servus,

ich möchte folgendes herausfinden:

Besitzt VB6 eine Möglichkeit (z.B. eine spezielle Funktion, aber nicht zwangsläufig darauf beschränkt) mit der man abrufen kann, auf welchem Betriebssystem die Anwendung ausgeführt wird ?

Speziell geht es mir dabei um den Citrix Server bzw. den Windows Terminal Server. Ausserdem wäre es noch interessant zu wissen, ob man herausfinden kann, ob die Anwendung auf einer virtuellen Machine mit VM Ware läuft.

Soweit ich weiß lassen sich zumindest die unterschiedlichen Windows-Betriebssysteme erkennen, wichtig wäre wie gesagt diese Info auf einem Citrix-System und die Möglichkeit, dass die Anwendung dementsprechend darauf reagieren kann.

Das muss sich wie gesagt nicht auf eine für diesen Fall konstruierte Funktion in VB6 Funktion beschränken, jede Idee/Methode ist erwünscht.
 
Das VB6 problemlos diverse Windows-Versionen erkennt weiß ich ja, dies ist ja auch ausreichend dokumentiert auf diversen Seiten. Mehr steht auf den Seiten in deiner Suchanfrage auch nicht.

Leider habe ich speziell zum Citrix-Server bislang nichts gefunden. Wenn also jemand noch eine Idee hat oder einen Link wäre ich ihm dankbar ;)
 
So, mal einen Nachtrag:

Ich habe in den letzten Tagen ein wenig nachgeforscht, ein kleines Testprogramm geschrieben und das Problem (wahrscheinlich) gelöst ;)

Die VM Ware Erkennung habe ich grade eben getestet, die funktioniert definitiv. Die Lösung des Problems ist, dass es auf einer virtuellen Maschine in der Registry den Eintrag HKLM\System\CurrentControlSet\Services\VMMEMCTL gibt. Dieser gehört wohl zu einem Prozess, der mit der Speicherverwaltung der VM Ware zu tun hat. Indem man die Registry auf diesen Eintrag überprüft lässt sich also herausfinden, ob es sich um eine virtuelle Maschine handelt oder nicht.

Die Citrix/Windows Terminal Erkennung konnte ich bislang nicht testen, da mir momentan kein Server zur Verfügung steht, dass wird sich hoffentlich heute oder morgen ändern. In der Theorie sieht es so aus, dass man mit der GetSystemMetrics Methode aus der Windows API eine 0 zurück bekommt wenn man es sich nicht um eine Remotesession handelt und einen anderen Wert, wenn es sich um Remote handelt.

Hier mal der Code. Die Oberfläche besteht lediglich aus einer Form mit zwei Labels.
Anzumerken ist, dass der Code zum Großteil nicht von mir stammt. Ich habe aus diversen Beispielen, Tutorials und Foreneinträgen im WWW Codeblöcke extrahiert und auf das nötige für dieses spezielle Problem zusammengeschrumpft.

Code:
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function ProcessIdToSessionId Lib "kernel32" _
    (ByVal dwProcessId As Long, ByRef pSessionId As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" _
    (ByVal nIndex As Long) As Long

Private Const S_REMOTESESSION = &H1000

'Fehler oder nicht
Const ERROR_SUCCESS = 0

'Hauptschlüssel
Const MainKey = &H80000000

'Zugriffcodes
Const KEY_ALL_ACCESS = &H3F

Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA"  _
(ByVal hKey As Long, ByVal sSubKey As String, ByVal lReserved As Long, ByVal lSecurity As Long, hKeyReturn As Long) As Long

Option Explicit

'Funktion zum erkennen des Registry Schlüssels bei VMWare
Function Reg_Exist_Key(KeyIndex%, Subkey As String) As Boolean
    Dim Key As Double
    Dim l As Integer
    Dim lhkeyopen As Long
    Key = MainKey + KeyIndex
    Reg_Exist_Key = False
    l = RegOpenKeyEx(Key, Subkey, 0, KEY_ALL_ACCESS, lhkeyopen)
    'Schlüssel existiert nicht
    If l <> ERROR_SUCCESS Then Exit Function
    Reg_Exist_Key = True
End Function

Private Sub Form_Load()
Dim KeyFound As Boolean

KeyFound = Reg_Exist_Key(2, "System\CurrentControlSet\Services\VMMEMCTL")
If KeyFound = True Then
   Label1.Caption = "VM Ware: Ja"
Else
   Label1.Caption = "VM Ware: Nein"
End If

Call TestTS

End Sub

Public Function GetTSSessionID() As Long

   Dim lSessionID As Long
   Dim lReturnCode As Long

   If GetSystemMetrics(S_REMOTESESSION) <> 0 Then

       lReturnCode = ProcessIdToSessionId(GetCurrentProcessId(), lSessionID)

       If lReturnCode <> 0 Then
           GetTSSessionID = lSessionID
       Else
           GetTSSessionID = -1
       End If

   Else
       GetTSSessionID = 0
   End If

End Function
Private Sub TestTS()
  Dim lTSID As Long
  lTSID = GetTSSessionID()
  If lTSID > 0 Then
    Label2.Caption = "Terminal/Citrix: Ja"
  Else
    Label2.Caption = "Terminal/Citrix: Nein"
  End If
End Sub
 
Nossi schrieb:
Die VM Ware Erkennung habe ich grade eben getestet, die funktioniert definitiv. Die Lösung des Problems ist, dass es auf einer virtuellen Maschine in der Registry den Eintrag HKLM\System\CurrentControlSet\Services\VMMEMCTL gibt. Dieser gehört wohl zu einem Prozess, der mit der Speicherverwaltung der VM Ware zu tun hat. Indem man die Registry auf diesen Eintrag überprüft lässt sich also herausfinden, ob es sich um eine virtuelle Maschine handelt oder nicht.

Jo, das ist dann halt der Eintrag des Services, den ich angesprochen hatte.
 
Zurück
Oben