VB 5/6-Tipp 0636: Rechnername des RDP-Clients auslesen
von Christoph Kaser
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: | Verwendete API-Aufrufe: lstrcpyA (StrCopyA), lstrlenA (StrLenA), WTSFreeMemory, WTSQuerySessionInformationA (WTSQuerySessionInformation) | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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