Форум » [x]Harbour » Идентификатор сессии » Ответить

Идентификатор сессии

fil: Приветствую ! Как можно узнать идентификатор текущей RDP-сессии ?

Ответов - 37, стр: 1 2 All

Dima: Копай https://social.msdn.microsoft.com/Forums/en-US/e36baa73-3876-43f5-8fd4-c582512c400f/wmi-to-query-current-users-logged-in-on-a-remote-server https://www.activexperts.com/admin/scripts/wmi/vbscript/0219/

Andrey: Вопрос немного не в тему, но тоже про RDP-сессию. Как можно узнать из своей проге на Харборе сколько клиентов подключилось к серверу (RDP-сессии) или список логинов RDP-сессий ? Типа такого - https://kuharbogdan.com/stati-po-1s/7-sposobov-posmotret-kto-rabotaet-na-servere-terminalov/

Dima: Andrey Не в туда копаете товарисч https://infostart.ru/1c/articles/165702/ см. функцию Computer_Terminal Переложить это в Harbour + Wmi как два пальца об асфальт.......


Andrey: Спасибо Dima ! Буду разбираться...

Dima: Andrey Отпиши о результате если не сложно Получилось или нет.....

Andrey: Dima пишет: Отпиши о результате если не сложно Всё руки не доходили до этого... Начал пробовать и сразу затык ! А как узнать что моя прога запускается на сервере терминалов ?

Dima: win_OsIsTSClient()

Dima: Andrey пишет: сколько клиентов подключилось к серверу (RDP-сессии) или список логинов RDP-сессий Пробуй вроде норм пашет... Уверен что есть и другие способы это узнать через WMI , но надо с запросами разбираться а времени нет. [pre2] Proc main LOCAL oWMI LOCAL objWMI LOCAL oTerminal LOCAL objItem Local Ocosver Local elem local it:=0 REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) ? "win_OsIsTSClient()",win_OsIsTSClient() objWMI:=WmiService() objWMI:Security_:ImpersonationLevel:=3 objWMI:Security_:AuthenticationLevel:=6 Ocosver:= objWMI:InstancesOf ("Win32_OperatingSystem") for each elem in Ocosver ? elem:name next oTerminal:= objWMI:ExecQuery("Select * from Win32_LogonSession Where LogonType=10" ) ? "Number of terminal sessions ",oTerminal:count FOR EACH objItem IN oTerminal ? "objItem:LogonId", objItem:LogonId ? "objItem:StartTime", objItem:StartTime // objItem:Name и остальные фишки почему то возвращают NIL next wait RETURN ******************* FUNC WMIService( cComp ) Local oWmi ,oLocator hb_default(@cComp,'.') BEGIN SEQUENCE WITH {| oErr | Break( oErr ) } oLocator:= win_oleCreateObject( "wbemScripting.SwbemLocator" ) oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2") End SEQUENCE RETURN oWmi [/pre2]

Dima: Вот еще вариантик [pre2] oTerminal:= objWMI:ExecQuery("Select * from Win32_LogonSession Where LogonType=10" ) FOR EACH objItem IN oTerminal ? id:=objItem:LogonId userlist:=objWMI:ExecQuery("ASSOCIATORS OF {Win32_LogonSession.LogonId="+id+"} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent") for each elem in userlist ? elem:name next next [/pre2]

Dima: Dima пишет: ? elem:name Вот тут еще можно отслеживать Status (elem:Status) [pre2] Status Только для чтения. Текущий статус объекта. Может принимать следующие значения: "OK" "Error" "Degraded" "Unknown" "Pred Fail" "Starting" "Stopping" "Service" [/pre2]

Andrey: Спасибо БОЛЬШОЕ ! В инете только много пишут вот так - ("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10") Только в этой функции действительно нельзя получить имена пользователей в RDP-сессии А мне юзеру нужно выдать список кто ещё к серверу за логинился.

Dima: я подумаю Andrey когда время появится , много надо для этого гуглить так как в WMI я тоже не особо силен.......

Dima: Andrey пишет: Только в этой функции действительно нельзя получить имена пользователей в RDP-сессии имена есть смотри внимательней и ниже по коду

Andrey: Dima пишет: имена есть смотри внимательней и ниже по коду Да увидел ! Писал уже после того как ты добавил. Спасибо !

Dima: Andrey Собери EXE из исходника , запусти на серванте и все увидишь. Там код cамодостаточный для сборки.

Andrey: Да, сделал пока так. Работает однако ! Кому интересно - [pre2]/* * MINIGUI - Harbour Win32 GUI library Demo 28-01-2022 * * Copyright 2022 Dima - http://clipper.borda.ru/?32-dima * * Сколько клиентов подключилось к серверу (RDP-сессии) или список логинов RDP-сессий ? * How many clients connected to the server (RDP sessions) or a list of RDP session logins? */ #define _HMG_OUTLOG #include "hmg.ch" REQUEST HB_CODEPAGE_RU1251 ANNOUNCE RDDSYS ///////////////////////////////////////////////////////////////////// PROCEDURE MAIN(cComp) LOCAL cLog, aRet DEFAULT cComp := "" SET EPOCH TO ( Year(Date()) - 50 ) SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN SET Date TO GERMAN cLog := ChangeFileExt( Application.ExeName, ".log" ) DELETEFILE(cLog) SET LOGFILE TO &cLog // set filename for debug output to file SET WINDOW MAIN OFF ? REPL("= ",20) + "program Start " + HB_TSTOSTR( hb_DateTime() ) + REPL(" =",20) cComp := IIF( LEN(cComp) == 0, GetComputerName(), cComp ) ? "Computername:", cComp ? "Current user:", GetUserName() ? " OS:", wmiOsver(cComp) ? "Where is the program running ? RDP session:", win_OsIsTSClient() //IF win_OsIsTSClient() aRet := HmgLogonSession(cComp) ? "hmgLogonSession()=", aRet, HB_ValToExp(aRet) //ENDIF ? "." ; ? "=== End ===" ShellExecute( 0, "Open", cLog,,, 1 ) RETURN ///////////////////////////////////////////////////////////////////// FUNCTION WMIService( cComp ) LOCAL oWMI ,oLocator DEFAULT cComp := "." BEGIN SEQUENCE WITH {| oErr | Break( oErr ) } oLocator:= win_oleCreateObject( "wbemScripting.SwbemLocator" ) oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2") END SEQUENCE RETURN oWMI ///////////////////////////////////////////////////////////////////// // какая версия на компе FUNCTION wmiOsver(cComp) LOCAL cRet, objWMI, Ocosver, elem cRet := "" objWMI := WmiService(cComp) objWMI:Security_:ImpersonationLevel := 3 objWMI:Security_:AuthenticationLevel := 6 Ocosver := objWMI:InstancesOf ("Win32_OperatingSystem") FOR EACH elem IN Ocosver cRet += elem:name + CRLF NEXT RETURN cRet ///////////////////////////////////////////////////////////////////// // Функция, позволяющая получить информацию о терминальных сессиях // на сервере (локальный/удаленный компьютер). // Рекомендация: // Перед применением проверить на компьютерах // Windows Management Instrumentation (WMI): // 1. Состояние служб. // 2. Разрешение в брандмауэре. // FUNCTION hmgLogonSession(cComp) LOCAL aRet, objWMI, nI, elem, oTerminal, objItem, userlist, id DEFAULT cComp := "." nI := 0 aRet := {} ? REPL("-",40) objWMI := WmiService(cComp) objWMI:Security_:ImpersonationLevel := 3 objWMI:Security_:AuthenticationLevel := 6 oTerminal := objWMI:ExecQuery("Select * from Win32_LogonSession Where LogonType=10") FOR EACH objItem IN oTerminal // objItem:Name и остальные фишки почему то возвращают NIL ? " Caption ", objItem:Caption ? " Description ", objItem:Description ? " InstallDate ", objItem:InstallDate ? " Name ", objItem:Name ? " Status ", objItem:Status ? " StartTime ", objItem:StartTime ? " AuthenticationPackage ", objItem:AuthenticationPackage ? " LogonId ", objItem:LogonId ? " LogonType ", objItem:LogonType if !empty(objItem:LogonId) nI++ endif ? REPL("-",40) NEXT ? "Number of terminal sessions:",nI ? REPL("-",40) FOR EACH objItem IN oTerminal id := objItem:LogonId userlist := objWMI:ExecQuery("ASSOCIATORS OF {Win32_LogonSession.LogonId="+id+"} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent") FOR EACH elem IN userlist AADD( aRet, elem:name + " Status:" + elem:Status ) NEXT NEXT RETURN aRet [/pre2]

Dima: Andrey Ну вот и отлично когда не ленишься

Dima: Можно еще через Wtsapi32.dll пробнуть

Andrey: Dima пишет: Можно еще через Wtsapi32.dll пробнуть Это как ?

Dima: Andrey пишет: Это как ? это API и там куча функций для TS https://docs.microsoft.com/ru-ru/windows/win32/api/wtsapi32/

Andrey: Andrey пишет: Да, сделал пока так. Работает однако ! НЕ РАБОТАЕТ !!! Если запускать под учёткой пользователя - то НЕ работает ! Если запускать под учёткой администратора, то работает. Блин, опять засада.

Dima: Andrey пишет: Если запускать под учёткой пользователя - то НЕ работает ! ну так зашей L/P админа там где подключение идет в ConnectServer можно зашифровать и в какой то базе держать https://docs.microsoft.com/en-us/windows/win32/wmisdk/swbemlocator-connectserver Можно попробовать поиграть с привилегиями http://scriptcoding.ru/2013/04/12/swbemsecurity/

Andrey: Dima пишет: ну так зашей L/P админа там где подключение идет в ConnectServer В твоём примере нет ConnectServer ! Как это можно добавить ?

Dima: Andrey пишет: В твоём примере нет ConnectServer ! Dima пишет: oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2") а это что ? может пример не тот смотришь ?

Andrey: Dima пишет: а это что ? Где логин и пароль добавить ?

Dima: Andrey пишет: Где логин и пароль добавить ? Ты трезвый вообще ? oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2",логинТУТ,пассТУТ) ведь ссылку на доку же дал

Andrey: Dima пишет: ведь ссылку на доку же дал [pre2]objwbemServices = .ConnectServer( _ [ ByVal strServer ], _ [ ByVal strNamespace ], _ [ ByVal strUser ], _ [ ByVal strPassword ], _ [ ByVal strLocale ], _ [ ByVal strAuthority ], _ [ ByVal iSecurityFlags ], _ [ ByVal objwbemNamedValueSet ] _ )[/pre2] Смутил параметр [ ByVal strNamespace ] Спасибо ! Буду пробовать.

Dima: Andrey пишет: Смутил параметр [ ByVal strNamespace ] strNamespace – задаем пространство имен (например, root\CIMV2), если оно отсутствует, то будет взято пространство по умолчанию (оно прописано в реестре в ветке HKLM\SOFTWARE\Microsoft \WBEM\Scripting\ Default Namespace)

Andrey: Dima пишет: oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2",логинТУТ,пассТУТ) Если логин и пароль неправильны, то прога вылетает с ошибкой. [pre2]Error BASE/1004 Метод не экспортирован: SECURITY_ Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from SECURITY_(0) Called from WMILOGONSESSION(114) in module: hmgLogonSession.prg Called from MAIN(45) in module: hmgLogonSession.prg [/pre2] Как узнать что логин и пароль подошли на этом сервере ? Если админ поменяет пароль, то прога будет просто вылетать. С админом всегда трудно договориться. Они частенько меняются на фирме.

Dima: Andrey пишет: Как узнать что логин и пароль подошли на этом сервере ? я думаю что примерно так [pre2] BEGIN SEQUENCE WITH {| oErr | Break( oErr ) } oLocator:= win_oleCreateObject( "wbemScripting.SwbemLocator" ) oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2", Login , pass) if !hb_isobject(oWMI) ? "Что то пошло не так :)" ? hb_valtoexp(oWmi) Owmi:=NIL endif Recover // тут тоже можно что то чекануть END SEQUENCE [/pre2]

Andrey: Вообщё хрень получается. Сегодня пример перестал работать. Вот пример - [pre2]/* * MINIGUI - Harbour Win32 GUI library Demo 28-01-2022 * * Copyright 2022 Dima - http://clipper.borda.ru/?32-dima * * Сколько клиентов подключилось к серверу (RDP-сессии) или список логинов RDP-сессий ? * How many clients connected to the server (RDP sessions) or a list of RDP session logins? */ #define _HMG_OUTLOG #include "hmg.ch" REQUEST HB_CODEPAGE_RU1251 ANNOUNCE RDDSYS ///////////////////////////////////////////////////////////////////// PROCEDURE MAIN LOCAL oWMI, objWMI, oTerminal, objItem, Ocosver, elem, cLog SET EPOCH TO ( Year(Date()) - 50 ) SET LANGUAGE TO RUSSIAN SET CODEPAGE TO RUSSIAN SET Date TO GERMAN cLog := ChangeFileExt( Application.ExeName, ".log" ) DELETEFILE(cLog) SET LOGFILE TO &cLog // set filename for debug output to file SET WINDOW MAIN OFF ? REPL("= ",20) + "program Start " + HB_TSTOSTR( hb_DateTime() ) + REPL(" =",20) ? "win_OsIsTSClient()", win_OsIsTSClient() objWMI := WmiService() objWMI:Security_:ImpersonationLevel := 3 objWMI:Security_:AuthenticationLevel := 6 Ocosver:= objWMI:InstancesOf ("Win32_OperatingSystem") for each elem in Ocosver ? elem:name next oTerminal := objWMI:ExecQuery("Select * from Win32_LogonSession Where LogonType=10" ) ? "Number of terminal sessions:",oTerminal:count FOR EACH objItem IN oTerminal ? "objItem:LogonId", objItem:LogonId ? "objItem:StartTime", objItem:StartTime ? objItem:Name // objItem:Name и остальные фишки почему то возвращают NIL next oTerminal := objWMI:ExecQuery("Select * from Win32_LogonSession Where LogonType=10" ) FOR EACH objItem IN oTerminal id := objItem:LogonId userlist := objWMI:ExecQuery("ASSOCIATORS OF {Win32_LogonSession.LogonId="+id+"} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent") ? id For each elem in userlist ? elem:name, elem:Status Next NEXT ? "." ; ? "=== End ===" ShellExecute( 0, "Open", cLog,,, 1 ) RETURN ///////////////////////////////////////////////////////////////////// FUNCTION WMIService( cComp ) Local oWmi ,oLocator hb_default(@cComp,'.') BEGIN SEQUENCE WITH {| oErr | Break( oErr ) } oLocator:= win_oleCreateObject( "wbemScripting.SwbemLocator" ) oWMI := oLocator:ConnectServer(cComp,"ROOT\CIMV2") End SEQUENCE RETURN oWmi [/pre2] Взял твой пример и сделал минимум переделок. Что опять недосмотрел ?

Dima: Andrey пишет: Взял твой пример и сделал минимум переделок Лучше оставь свой пример который работал и сделай в нём тот же минимум переделок. А если чего и забыл то может L/P указать при подключении к серваку в строке oWMI := oLocator:ConnectServer(cComp,"ROOT\CIMV2")

Andrey: Dima пишет: Лучше оставь свой пример который работал и сделай в нём тот же минимум переделок. Тот тоже не работает....

Dima: Может админ увидел твои движняки и кислород перекрыл в виде отключения WMI сервиса :)

Dima: Глянь что возвращает oWMI:= oLocator:ConnectServer(cComp,"ROOT\CIMV2") Если это не объект то печалька и видать админчег что то подкрутил......

Andrey: Это просто цирк а не WMI. Как нет пользователей, то пример работает. Как пользователей больше 2 то пример не работает - возвращает 0 !

Dima: Да уж......



полная версия страницы