Терминальная сесия или рабочая станция

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Терминальная сесия или рабочая станция

Сообщение blinow » 25.04.2007 (Ср) 3:15

Как узнать приложение работает в терминальной сессии или на рабочей станции.
Конечно-же заранее не знаем, ни имени сервера, ни рабочей станции

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2007 (Ср) 8:39

Например, сравнить ProcessIdToSessionId(GetCurrentProcessId) и WTSGetActiveConsoleSessionId
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 25.04.2007 (Ср) 11:06

Где-то так еще можно:

Код: Выделить всё
Private Declare Function WTSEnumerateProcesses Lib "wtsapi32.dll" Alias _
        "WTSEnumerateProcessesA" (ByVal hServer As Long, ByVal Reserved As Long, _
            ByVal Version As Long, ByRef ppProcessInfo As Long, ByRef pCount As Long) As Long
Private Declare Sub WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Long)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

Private Type WTS_PROCESS_INFO
   SessionID As Long
   ProcessId As Long
   pProcessName As Long
   pUserSid As Long
End Type

Public Sub Main()
    MsgBox TerminalServerSessionId
End Sub

'Purpose   :    Returns a terminal server session ID
'Inputs    :    N/A
'Outputs   :    Returns "0" if not a terminal server, else returns
'               the terminal server session ID.
'Author    :    Andrew Baker
'Date      :    25/05/2001
'Notes     :

Function TerminalServerSessionId() As String
   Dim lRetVal As Long, lCount As Long, lThisProcess As Long, lThisProcessId  As Long
   Dim lpBuffer As Long, lp As Long, udtProcessInfo As WTS_PROCESS_INFO

   Const WTS_CURRENT_SERVER_HANDLE = 0&

   On Error GoTo ErrNotTerminalServer
   'Set Default Value
   TerminalServerSessionId = "0"
   lThisProcessId = GetCurrentProcessId
   lRetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, lpBuffer, lCount)
   If lRetVal Then
       'Successful
       lp = lpBuffer
       For lThisProcess = 1 To lCount
           CopyMemory udtProcessInfo, ByVal lp, LenB(udtProcessInfo)
           If lThisProcessId = udtProcessInfo.ProcessId Then
               TerminalServerSessionId = CStr(udtProcessInfo.SessionID)
               Exit For
           End If
           lp = lp + LenB(udtProcessInfo)
       Next
       'Free memory buffer
       WTSFreeMemory lpBuffer
   End If

   Exit Function

ErrNotTerminalServer:
   'The machine is not a Terminal Server
   On Error GoTo 0
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2007 (Ср) 11:12

Andrey, твой код совсем-совсем бредовый.
Фактически, вся эта страница кода заменяет один вызов ProcessIdToSessionId.
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 25.04.2007 (Ср) 11:35

дубль удалён --tyomitch
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 25.04.2007 (Ср) 11:44

Я по простому проверяю:
Код: Выделить всё
Environ("clientname")

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 25.04.2007 (Ср) 12:52

Спасибо, поэксперементируем :D

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 25.04.2007 (Ср) 13:39

tyomitch писал(а):Andrey, твой код совсем-совсем бредовый.
Фактически, вся эта страница кода заменяет один вызов ProcessIdToSessionId.


А бис его знает. По крайней мере он у меня сработал.
Ну и я его не сам писал - он выдран - там где-то и автор виден.

P.S Иногда проще и быстрей взять чужой кусок работающего кода чем тратить время на разборки с целью сэкономить пару строк...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.04.2007 (Ср) 13:43

Andrey Fedorov писал(а):P.S Иногда проще и быстрей взять чужой кусок работающего кода чем тратить время на разборки с целью сэкономить пару строк...

Будучи постоянным читателем http://thedailywtf.com/ , нисколько в этом не сомневаюсь ;-)
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 93

    TopList