Outsider77
Erfahrenes Mitglied
Hallo zusammen!
Mit folgendem Modul lese ich den aktuell über Remote Desktop verbundenen Client aus:
liefert mir diesen Usernamen.
Ich lasse regelmäßig den Namen des aktuellen Users in eine Text-Datei schreiben, die von einem anderen Programm ausgelesen wird. Wenn keine Verbindung besteht, soll "frei" in die Text-Datei geschrieben werden. Bei der ersten aktiven Verbindung kappt alles, allerdings beim Trennen dieser "merkt" der Pc sich anscheinend den User, weil immer weiter der Name in die Text-Datei geschrieben wird. Also anstatt "frei" bei keiner Verbindung schreibt er den Namen des ersten Users. Wieso wird nicht erkannt, dass aktuell keine Verbindung besteht? Bin für jede Hilfe dankbar!
Gruß Outsider
Mit folgendem Modul lese ich den aktuell über Remote Desktop verbundenen Client aus:
Code:
Imports System.Runtime.InteropServices
Imports System
Module RDP_API
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 Structure WTS_SESSION_QUERY
Public SessionID As Int32
Public pWinStationName As Int32
Public WTSClientName As String
Public senum As WTSInfoClass
End Structure
'Funktionsdefinition API-Aufruf für Session-Daten auslesen
<DllImport("wtsapi32", CharSet:=CharSet.Ansi)> _
Public Function _
WTSQuerySessionInformation(ByVal hServer As System.IntPtr, ByVal _
sessionId As Integer, ByVal wtsInfoClass As WTSInfoClass, ByRef _
ppBuffer As System.IntPtr, ByRef pBytesReturned As System.UInt32) As _
UInt32
End Function
'Funktionsdefinition für API-Aufruf "Speicher freigeben",
<DllImport("wtsapi32", ExactSpelling:=True, SetLastError:=False)> _
Private Sub WTSFreeMemory(ByVal pMemory As IntPtr)
End Sub
'Funktion für Auslesen des RDP-Hostnames
Public Function GetWTSQueryHost(ByVal SessionID As Int32) As String
Dim retval As Int32
Dim lpBuffer As System.IntPtr = IntPtr.Zero
Dim Count As System.UInt32
Dim lName As Int32
Dim sName As String = ""
Try
'Remotesitzungsinformationen holen
'retval = WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, _
' SessionID, WTSInfoClass.WTSClientName, lpBuffer, Count)
retval = WTSQuerySessionInformation(System.IntPtr.Zero, _
WTS_CURRENT_SERVER_HANDLE, WTSInfoClass.WTSClientName, lpBuffer, _
Count)
'Funktionsausschnitt
' Prozedur erfolgreich
If retval Then
'Stringlänge ermitteln
lName = Strings.Len( _
System.Runtime.InteropServices.Marshal.PtrToStringAnsi( _
lpBuffer))
If lName <> 0 Then
sName = _
System.Runtime.InteropServices.Marshal.PtrToStringAnsi( _
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
Return sName
'Form1.Label1.Text = sName
Catch ex As Exception
Return ""
End Try
End Function
End Module
Code:
GetWTSQueryHost(-1)
Ich lasse regelmäßig den Namen des aktuellen Users in eine Text-Datei schreiben, die von einem anderen Programm ausgelesen wird. Wenn keine Verbindung besteht, soll "frei" in die Text-Datei geschrieben werden. Bei der ersten aktiven Verbindung kappt alles, allerdings beim Trennen dieser "merkt" der Pc sich anscheinend den User, weil immer weiter der Name in die Text-Datei geschrieben wird. Also anstatt "frei" bei keiner Verbindung schreibt er den Namen des ersten Users. Wieso wird nicht erkannt, dass aktuell keine Verbindung besteht? Bin für jede Hilfe dankbar!
Gruß Outsider
Zuletzt bearbeitet: