Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2023, 16:06   #1
infopol
 
Регистрация: 01.11.2023
Сообщений: 4
По умолчанию Как определить имя компьютера и IP адрес подключенного через RDP в Delphi ?

Срочно нужно.
Знаю ,что нужно использовать WTSQuerySessionInformationW или WTSQuerySessionInformationA
Есть пример на C++
Код:
//https://cpp.hotexamples.com/ru/examples/-/-/WTSQuerySessionInformationA/cpp-wtsquerysessioninformationa-function-examples.html
	/* WTSClientName */

		bSuccess = WTSQuerySessionInformationA(hServer, sessionId, WTSClientName, &pBuffer, &bytesReturned);

		if (!bSuccess)
		{
			printf("WTSQuerySessionInformation WTSClientName failed: %d\n", (int) GetLastError());
			return -1;
		}

		ClientName = (char*) pBuffer;
		printf("\tWTSClientName: '%s'\n", ClientName);

Последний раз редактировалось infopol; 01.11.2023 в 21:45.
infopol вне форума Ответить с цитированием
Старый 09.11.2023, 10:20   #2
infopol
 
Регистрация: 01.11.2023
Сообщений: 4
По умолчанию

Вот пример кода в бухпрограмме Инфо-Предприятие c использованием внешней DLL dynwrapx.dll
http://dynwrapx.script-coding.com/dw...s/dynwrapx.php
Код:
      ЕСЛИ ЕСТЬ_ОБЪЕКТ("DynamicWrapperX.2") ТО
 
                                           // ПОПЫТКА
        DX = СОЗДАТЬ_ОБЪЕКТ!("DynamicWrapperX.2")//,"dynwrapx.dll")//,"",АВТО)//IDispatch)//,"wtsapi32.dll");//Создание объекта.
       //  DX.DllInstall
      //DX.Register("dynwrapx.dll","DllRegisterServer")
 
 //    DX.Register("dynwrapx.dll","DllRegisterServer")
     //DX.DllRegisterServer
       DX.Register("user32.dll", "MessageBoxW", "i=hwWu", "r=l");  // Регистрация функции из dll. //i= перечисляются типы параметров
         // ОТЛАДКА(DXX)
          text="Вопрос"
          предложение="Есть удаленное подключение к компьютеру!"
   DX.Register("wtsapi32.dll","WTSQuerySessionInformationA", "i=hllll", "r=l" ); // http://msdn.microsoft.com/en-us/library/aa383838(VS.85).aspx
        //BOOL WTSQuerySessionInformation(
        //  __in   HANDLE hServer,
        //  __in   DWORD SessionId,
        //  __in   WTS_INFO_CLASS WTSInfoClass,
        //  __out  LPTSTR *ppBuffer,
        //  __out  DWORD *pBytesReturned
        //);
 //    DX.Register("wtsapi32.dll","WTSConnectSessionW","r=l")//=pServerName")
     DX.Register("wtsapi32.dll", "WTSFreeMemory", "i=u" ); // http://msdn.microsoft.com/en-us/library/aa383834(VS.85).aspx
           DX.Register ("kernel32.dll", "GlobalAlloc", "i=ul", "r=p" );
           DX.Register ("kernel32.dll", "GlobalFree", "i=p", "r=p" );

       WTSInitialProgram         = 0; // http://msdn.microsoft.com/en-us/library/aa383861(VS.85).aspx
        WTSApplicationName        = 1;
        WTSWorkingDirectory     = 2;
        WTSOEMId                    = 3;
        WTSSessionId                = 4;
        WTSUserName                 = 5;
        WTSWinStationName         = 6;
        WTSDomainName             = 7;
        WTSConnectState           = 8;
        WTSClientBuildNumber    = 9;
        WTSClientName             = 10;
        WTSClientDirectory        = 11;
        WTSClientProductId        = 12;
        WTSClientHardwareId     = 13;
        WTSClientAddress          = 14;
        WTSClientDisplay          = 15;
        WTSClientProtocolType   = 16;
        WTSIdleTime                 = 17;
        WTSLogonTime                = 18;
        WTSIncomingBytes          = 19;
        WTSOutgoingBytes          = 20;
        WTSIncomingFrames         = 21;
        WTSOutgoingFrames         = 22;
        WTSClientInfo             = 23;
        WTSSessionInfo            = 24;
  
        WTS_CURRENT_SERVER_HANDLE = 0;
        WTS_CURRENT_SESSION = -1;
  
  ppBuffer = DX.StrPtr ( DX.Space ( 16) ); // Pointer (long) to a variable that receives a pointer to the requested information.
  
  pBytesReturned = DX.StrPtr ( DX.Space ( 4 ) ); // Pointer to a variable that receives the size, in bytes, of the data returned in ppBuffer.
  
  
  DX.WTSFreeMemory ( ppBuffer )
 lRet = DX.WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,WTSClientAddress, ppBuffer, pBytesReturned)
    ЕСЛИ lRet <> 0 ТО  //ЛАДКА(pBytesReturned)
                BytesReturned = DX.NumGet((pBytesReturned), 0, "u" );
           //   ОТЛАДКА (BytesReturned);
                pBuffer = DX.NumGet((ppBuffer), 0, "u" );
                    Address_Family = DX.NumGet ( pBuffer, 0, "u" )
                     // ОТЛАДКА(lRet,Address_Family,pBuffer)//DX.StrGet(pBuffer, "s" )) )    //  0, -1, 5, 132827680, 132821488
  
                  //         ОТЛАДКА(СТР(DX.NumGet ( pBuffer, 1)) ,DX.NumGet ( pBuffer, 2, "b" ),DX.NumGet ( pBuffer, 3, "b" ) , DX.NumGet ( pBuffer, 4, "b" ) ,DX.NumGet ( pBuffer, 5, "b" ), DX.NumGet ( pBuffer, 6, "b" ) , DX.NumGet ( pBuffer, 7, "b" ),DX.NumGet ( pBuffer, 8, "b" ) ,DX.NumGet ( pBuffer, 9, "b" ),DX.NumGet ( pBuffer, 10, "b" ),DX.NumGet ( pBuffer, 11, "b" ) , DX.NumGet ( pBuffer, 12, "b" ),DX.NumGet ( pBuffer, 13, "b" ) ,DX.NumGet ( pBuffer, 14, "b" ) ,DX.NumGet ( pBuffer, 15, "b" ),DX.NumGet ( pBuffer, 16, "b" )  );
  
    ЕСЛИ   Address_Family=2 ТО
  
       IPAdr=(СТР(DX.NumGet ( pBuffer, 6, "b" )) + "." +СТР( DX.NumGet ( pBuffer, 7, "b" ))+"." +СТР(DX.NumGet ( pBuffer, 8, "b" ))+  "." +СТР( DX.NumGet ( pBuffer, 9, "b" )));
         ЕСЛИ (DX.WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,WTSClientName, ppBuffer, pBytesReturned))<>0 ТО
  ptr= DX.NumGet(ppBuffer,"u")
     ПОПЫТКА
       str= DX.StrGet( ptr,"z")
       Computer=str
       DX.WTSFreeMemory ( ptr )
       DX.WTSFreeMemory ( str )
  
   ИСКЛЮЧЕНИЕ
   КОНЕЦ_ПОПЫТКИ
   КОНЕЦ_ЕСЛИ
 
КОНЕЦ_ЕСЛИ
Как реализовать в Delphi?

Последний раз редактировалось infopol; 09.11.2023 в 10:29.
infopol вне форума Ответить с цитированием
Старый 10.11.2023, 22:33   #3
infopol
 
Регистрация: 01.11.2023
Сообщений: 4
По умолчанию Разобрался сам. Оказалось всё просто

Код:
function Get_TerminalSesion(var IpAdr:String) :boolean;
Var
  WTS_CLIENT_ADDRESS :TWTS_CLIENT_ADDRESS ;
  PWTS_CLIENT_ADDRESS:^TWTS_CLIENT_ADDRESS;
  BufSize: DWORD;
i:Integer;
  buf:Byte;
  pSessionId: DWORD;
  Res:string;
  PAddres:^Address;
//IPAdr:String;

  begin
 Res:= ( StringOfChar(Chr(0),4));
 BufSize:= Integer( Addr(Res)^);
 result:=false;
   ProcessIdToSessionId(GetCurrentProcessId, pSessionId);
  if WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,pSessionId,WTSClientAddress,Pointer(PWTS_CLIENT_ADDRESS ),BufSize) then
  try
                   WTS_CLIENT_ADDRESS:=PWTS_CLIENT_ADDRESS^;
               IpAdr:='';
      for i:=2 to 5 do
           IPAdr:=IpAdr+ IntToStr(  WTS_CLIENT_ADDRESS.IPAddress[i])+'.';
            //     IntToStr(WTS_CLIENT_ADDRESS.AddressFamily)
//    ShowMessage(' > '+ IntToStr(WTS_CLIENT_ADDRESS.AddressFamily)+'; IP '+IpAdr);//IntToStr(  WTS_CLIENT_ADDRESS.IPAddress[6])+'.'+IntToStr(WTS_CLIENT_ADDRESS.IPAddress[7])+'.'+IntToStr(  WTS_CLIENT_ADDRESS.IPAddress[8])+'.'+IntToStr(  WTS_CLIENT_ADDRESS.IPAddress[9]));
   Result:=(WTS_CLIENT_ADDRESS.AddressFamily=2);
  finally
    System.FreeMemory(PWTS_CLIENT_ADDRESS);
    WTSFreeMemory(PWTS_CLIENT_ADDRESS);
  //  WTSFreeMemory(@ppBuffer);
  end;
end;
Код:
function Get_ClientName :String;
var
  BufSize: Cardinal;
  pBuf: PAnsiChar;
  pSessionId: DWord;
const
  WTS_CURRENT_HANDLE=0;

  begin

//pSessionId:=1;
  ProcessIdToSessionId(GetCurrentProcessId, pSessionId);
//  pSessionId:=-1;
  // èëè pSessionId := DWORD(-1);
  if WTSQuerySessionInformationA(WTS_CURRENT_HANDLE, pSessionId,
    WTSClientName, Pointer(pBuf), BufSize) then
  try
    SetString(Result, pBuf, BufSize);
   // ShowMessage(Result+' '+GettingComputerName+' '+ GetLocalName);
  finally
    WTSFreeMemory(pBuf);
  end;
end;
infopol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Delphi 7 можно получит от UPS (ИБП) подключенного через COM-порт Alex711 Общие вопросы Delphi 5 12.07.2019 01:50
Изменить МАС адрес компьютера и опредилить прошлый МАС адрес компьютера Эвелинка Помощь студентам 11 12.05.2015 15:58
Определить GMТ компьютера (Delphi) Air Помощь студентам 3 15.06.2012 08:22
Пинг компьютера подключенного через маршрутизатор Shouldercannon Работа с сетью в Delphi 3 26.05.2011 17:09