Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0636: Rechnername des RDP-Clients auslesen

 von 

Beschreibung 

Wenn die verwendete Oberfläche nicht der lokale Desktop ist, sondern eine Terminalserver-Sitzung, liefert die Rechnername-Funktionen nicht das gewünschte Ergebnis, man will ja nicht den HostName des Terminalservers, sondern denjenigen des verbundenen-PCs.
Mit dieser Funktion ist das Auslesen dieses Wertes möglich.

Schwierigkeitsgrad:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

lstrcpyA (StrCopyA), lstrlenA (StrLenA), WTSFreeMemory, WTSQuerySessionInformationA (WTSQuerySessionInformation)

Download:

Download des Beispielprojektes [3,08 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Sub Form_Load()
    Label1 = GetWTSQueryHost(-1)
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------


'Autoren: Christoph Kaser (chkaser@tiscali.ch) und
'         Kai Liebenau (Obivan_2000@gmx.net)

Option Explicit

'Handle für "lokaler Server"
Private Const WTS_CURRENT_SERVER_HANDLE As Long = 0&

Public Enum WTSInfoClass
    WTSInitialProgram
    WTSApplicationName
    WTSWorkingDirectory
    WTSOEMID
    WTSSessionId
    WTSUserName
    WTSWinStationName
    WTSDomainName
    WTSConnectState
    WTSClientBuilderNumber
    WTSClientName
    WTSClientDirectory
    WTSClientProductId
    WTSClientHardwareId
    WTSClientAddress
    WTSClientDisplay
    WTSClientProtocolType
End Enum

'WTS Sitzungsanfragen-Struktur
Public Type WTS_SESSION_QUERY
    SessionID As Long
    pWinStationName As Long
    senum As WTSInfoClass
End Type

'Funktionsdefinition API-Aufruf für Session-Daten auslesen
Private Declare Function WTSQuerySessionInformation Lib _
    "wtsapi32.dll" Alias "WTSQuerySessionInformationA" _
    (ByVal hServer As Long, ByVal SessionID As Long, _
    ByVal WTS_INFO_CLASS As WTSInfoClass, ByRef QSbuffer As Long, _
    ByRef pCount As Long) As Long

'Funktionsdefinition für API-Aufruf "Speicher freigeben"
Private Declare Sub WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Long)

'String API's
Private Declare Function StrCopyA Lib "kernel32.dll" Alias "lstrcpyA" _
    (ByVal retval As String, ByVal Ptr As Long) As Long

Private Declare Function StrLenA Lib "kernel32.dll" Alias "lstrlenA" _
    (ByVal Ptr As Long) As Long

'Funktion für Auslesen des RDP-Hostnames
Public Function GetWTSQueryHost(ByVal SessionID As Long) As String
    Dim retval As Long, lpBuffer As Long
    Dim p As Long, Count As Long
    Dim lName As Long, sName As String
    
    'Remotesitzungsinformationen holen
    retval = WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, _
        SessionID, WTSClientName, lpBuffer, Count)
    
    'Funktionsausschnitt
    ' Prozedur erfolgreich
    If retval Then
        
        'Stringlänge ermitteln
        lName = StrLenA(lpBuffer)
        If lName <> 0 Then
            
            'String initialisieren
            sName = String$(lName, 0)
            
            'String kopieren
            Call StrCopyA(sName, lpBuffer)
        End If
        
        ' Speicher wieder freigeben
        WTSFreeMemory lpBuffer
    Else
        
        'Prozedurfehler: Keine RDP, Keine DLL da oder sonstwas faul...
        MsgBox "Fehler beim Auslesen der RDP-Sitzungsdaten. Es konnten" & _
            "keine Informationen gewonnen werden. ", vbCritical, _
            "DLL-Zugriffsfehler " & Err.LastDllError
        
    End If
    
    'Returnwert
    GetWTSQueryHost = sName
End Function
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Steffen am 06.01.2011 um 12:17

Hallo.

Mich würde statt des Clientnamen viel mehr die Client-IP interessieren. Anhand derer könnte ich ja dann später eine Standortzuordnung definieren. Der Clientname ist bei Mobilen Nutzern leider unbrauchbar! Gibt es hier ebenfalls eine Methode?

Gruß und Dank.

Kommentar von VB6 am 25.04.2006 um 20:38

sollte in diesem label dann auch noch was drinnenstehen?

Kommentar von HP am 06.05.2005 um 22:50

Der Clientname aus den Environment-Variablen ist nicht zuverlässig, weil er sich ändert, sobald jemand mit dem gleichen Login von einem anderen PC eine Terminalsession startet...

Kommentar von Sascha am 23.12.2004 um 11:35

Hallo.
In dem downloadbaren Projekt wird die SessionID, welche ja in der Funktion GetWTSQueryHost übergeben wird, auf "-1" gesetzt. Meine Frage ist nun, wie das bei mehreren Clients ist.
Wird die SessionID immer als fixer Wert übergeben oder muss für jede einzelne Session die SessionID ermittelt werden? Wenn die Ermittlung der SessionID erfolgen muss, mit welcher API?

Gruß und Danke

Sascha

Kommentar von am 19.11.2004 um 15:38

Hallo,
mich würde noch interessieren, wie alle Clientnamen (aus mehrern TS-Sessions) ausgelesen werden können.
Danke für eine Antwort.

mfG
Bill

Kommentar von Chris am 20.05.2004 um 18:45

Hoi!
Das laesst sich aber auch einfacher aus den Umgebungsvariablen auslesen.
Wenns eine lokal Sitzung ist, lautet der Inhalt der Variable

CLIENTNAME immer "Console"

Ists eine TS-Session, ist der Inhalt von CLIENTNAME der des lokalen Hostnamens.

Gruss

Chris