News, links, downloads, tips and tricks on Microsoft Access and related

About Me Search
Name:Alex Dybenko

Location:Moscow, Russia

Tuesday, September 12, 2023

TeamViewer session is active - another method

 When TeamViewer running as service - connections established by System account, so we can't detect which user has TeamViewer session active. In that case we can use a following function, which looks through TeamViewer log file (logging must be enabled in TeamViewer options). Idea is based on that KB article Log file reading - Incoming connection

Public Function TeamViewerActive() As Boolean

    Dim tvLog As String

    tvLog = "C:\Program Files (x86)\TeamViewer\TeamViewer15_Logfile.log"

    If Len(Dir(tvLog)) = 0 Then Exit Function

    'Get user's process TeamViewer PID

    Dim objServices As Object, objProcessSet As Object, Process As Object

    Set objServices = GetObject("winmgmts:\\.\root\CIMV2")

    Set objProcessSet = objServices.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'TeamViewer.exe'", , 48)  '


    Dim tvPID As Long

    For Each Process In objProcessSet

        Dim ProcessUserName As Variant

        Call Process.GetOwner(ProcessUserName)

        If ProcessUserName = GetWindowsUserName Then

            tvPID = Process.ProcessID

            Exit For

        End If


    Set objProcessSet = Nothing


'no PID - no TeamViewer running

    If tvPID = 0 Then Exit Function


    Dim FSO As Object

    Dim strLog As String, a, i As Long

    Set FSO = CreateObject("scripting.FileSystemObject")

    Dim TS As Object 'TextStream

    Set TS = FSO.OpenTextFile(tvLog, 1) 'ForReading

    strLog = TS.ReadAll

    a = Split(strLog, vbNewLine)


'Get the lastest session

    Dim lngLastStart As Long, strSessionID As String

    For i = 0 To UBound(a)

        If a(i) Like "*  " & tvPID & " *" Then

            If a(i) Like "* CParticipantManagerBase participant *" Then

                lngLastStart = i

            End If

        End If

    Next i


    If lngLastStart > 0 Then

'Session was started

        TeamViewerActive = True

'Get session ID

        strSessionID = Mid(a(lngLastStart), InStr(1, a(lngLastStart), " (ID [") + 5)

        strSessionID = Left(strSessionID, InStr(1, strSessionID, "]"))

'Check if that session already ended, if no - then user in TeamViewer session

        For i = lngLastStart To UBound(a)

            If a(i) Like "* CPersistentParticipantManager::RemoveParticipant:*" & Replace(strSessionID, "[", "[[]") & "*" Then

                TeamViewerActive = False

            End If

        Next i

    End If

End Function

Labels: , ,


Post a Comment

<< Home