Контроль трафика

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

Контроль трафика

Сообщение SeT » 05.10.2005 (Ср) 14:44

Установил я себе ADSL, а нормальной проги для контроля трафика никак еайти не могу. Подскажите пожалуйста, как это сделать (или хоть намекните). :cry:
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.10.2005 (Ср) 15:07

Да много их.
Есть TMeter, но он с некоторыми файрволами конфликтует.
Есть BWMeter.
Lasciate ogni speranza, voi ch'entrate.

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 05.10.2005 (Ср) 15:09

А поподробнее можно? Я не совсем уразумел
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.10.2005 (Ср) 15:11

Поищи в Гугле или Яндексе.
Lasciate ogni speranza, voi ch'entrate.

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 05.10.2005 (Ср) 15:15

Так я же хочу САМ написать программу для контроля трафика!!!!!!!! :(
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.10.2005 (Ср) 15:39

Можно через WMI (запросами), но это получится только для Win2K и XP.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 05.10.2005 (Ср) 16:41

Устраивает, как это сделать (поподробнее, товарищи, не скупитесь на слова)
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.10.2005 (Ср) 17:11

Берём в руки качалку + браузер. Ищём инфу по WMI.
Берём в руки vb-script и уже в нём пишем всю обработку траффика. :)
Можно и через VB (в принципе методы те же).

Здесь ответы по WMI
http://www.microsoft.com/technet/script ... mifaq.mspx

Здесь более подробно написано про WMI
http://msdn.microsoft.com/library/defau ... e_bcbh.asp

http://msdn.microsoft.com/library/defau ... eevent.asp


А вот здесь лежит студия WMI - в которой описаны все методы, все возможности (кстати - на русском) - с помощью которых можно управлять виндой, компьютером и железками в частности.
http://www.microsoft.com/downloads/deta ... laylang=en

А здесь - учебник по WMI и инструментам работы с ним.
http://www.microsoft.com/downloads/deta ... laylang=en


Ну и для примера (применение WMI) - правда на vbs - но зато показательно ;) :
Код: Выделить всё

'==========================================================================
'
' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 3.0
'
' NAME: CompConfig
'
' AUTHOR: Ruslan Demidow
' DATE  : 04.07.2005
'
' COMMENT: Получает общие данные о конфигурации компьютера
'
'==========================================================================
'Win32_Processor - Данные процессора
'Win32_VideoConfiguration - Конфигурация видео
'Win32_LogicalMemoryConfiguration - Конфигурация памяти
'Win32_Printer - Конфигурация принтеров
'Win32_NetworkAdapterConfiguration - Конфигурация сетевых контроллеров
'Win32_NetworkAdapter - коллекция сетевых адаптеров
'Win32_NetworkLoginProfile - Сетевая конфигурация пользователя
'Win32_DiskDrive - Данные о жёстких дисках
'Win32_FloppyDrive - данные о флопиках
'Win32_CDROMDrive - Данные о сидюках

'Win32_GroupInDomain - Доменная информация пользователя
'Win32_AccountSID - Учётная запись пользователя
Option explicit

Dim Accounts, Account
Dim WMI, SQuery, S, Shell, FSO, TXT
Dim CompName

Const DELIM_STRING = "--------------------------------"
Const FOR_READING=1
CONST FOR_WRITING=2
Const FOR_APPENDING=1

set WMI=getobject("Winmgmts:")

CreateReport
SaveReport "C:\Report.txt", true
WScript.Quit(0)

Sub CreateReport
   On Error Resume next
   S=S & getcompdata & GetProcessorData & _
      GetVideoData & GetMemoryData & _
      GetPrintersData & GetNetworkAdaptersData & _
      GetIPaddress & _
      GetHardDrivesData & GetFloppyDrivesData & _
      GetCDDriveData & GetUserLoginData
   SaveReport "\\main\VBSFolder\UsersDataFromVBS\" & compName & ".txt" ,false
End sub


Function GetProcessorData()
Dim Processors, Processor
Dim str
'Получим данные по процессору
On Error Resume next
S= "ПРОЦЕССОР:" & vbcrlf
SQuery="select * from Win32_Processor"
Set Processors=WMI.execquery(SQuery)
For Each Processor In Processors
   Str=Str & "Архитектура: " & Processor.Architecture & vbcrlf
   Str=Str & "Производитель: " & Processor.Manufacturer & vbcrlf
   Str= Str & "Частота: " & Processor.CurrentClockSpeed & " Mhz" & vbcrlf
   Str=Str & "Размер кеша второго уровня: " & Processor.L2CacheSize & " Kb"  & vbcrlf
   Str=Str & "Частота кеша второго уровня: " & Processor.L2CacheSpeed  & " Mhz" & vbcrlf
   Str=Str & "DeviceID: " & Processor.DeviceID & vbcrlf
   Str=Str & "Description: " & Processor.description & vbcrlf
   Str=Str & "Семейство: " & Processor.Family & vbcrlf
   Str=Str & "Тип процессора: " & Processor.Level & vbcrlf
   Str=Str & "Средняя величина загруженности на данный момент: " & Processor.LoadPercentage & "%"  & vbcrlf
   Str=Str & "Максимальное быстродействие: " & Processor.MaxClockSpeed & " Mhz"  & vbcrlf
   Str=Str & "Версия: " & Processor.Version & vbcrlf
   Str=Str & DELIM_STRING & vbcrlf & vbcrlf
Next
   getprocessordata=str
End Function

Function GetVideoData()
dim Videos,Video
Dim str, st
On Error Resume next
'Получим данные по видео конфигурации
str=str & "ВИДЕО (ТЕКУЩИЕ НАСТРОЙКИ):" & vbcrlf
SQuery="select * from Win32_VideoConfiguration"
Set Videos=WMI.execquery(SQuery)
For Each Video In Videos
   With Video
      str=str & "Текущее количество цветов экрана: " & video.ActualColorResolution & vbcrlf
      str=str & "Чип видеоадаптера: " & Video.AdapterChipType & vbcrlf
      str=str & "Изготовитель адаптера: " & Video.AdapterCompatibility & vbcrlf
      str=str & "Название DAC: " & Video.AdapterDACType & vbcrlf
      str=str & "Описание видеоадаптера: " & Video.AdapterDescription & vbcrlf
      str=str & "Объём видеодаптера: " & Video.AdapterRAM/1048576 & " Mb" & vbcrlf
      str=str & "Тип видеоадаптера: " & Video.AdapterType & vbcrlf
      str=str & "Разрешение: " & video.HorizontalResolution & "x" & video.VerticalResolution & vbcrlf
      str=str & "Драйвер: " & Video.InstalledDisplayDrivers & vbcrlf
      str= str & "Монитор: "
      St="Монитор: "
      st= st &  Video.MonitorManufacturer & vbcrlf
      
      If st="Монитор: " & vbcrlf Then
         str = str &   "Стандартный или Plug-n-Play" & vbcrlf
      else
         str= str &  Video.MonitorManufacturer & vbcrlf
         str=str & "Модель монитора: " & video.MonitorType & vbcrlf
      End if
      If Video.RefreshRate=0 Or Video.RefreshRate=1 Then
         str=str & "Частота обновления экрана: По умолчанию" & vbcrlf
      Else
         str=str & "Частота обновления экрана: " & Video.RefreshRate & " hz" & vbcrlf
      End If
      str= str & DELIM_STRING & vbcrlf & vbcrlf
   End with
Next
   GetVideoData=str
End Function

Function GetMemoryData()
Dim Memory, Memoryes
Dim str
On Error Resume next
'Получим данные по памяти
   SQuery="select * from Win32_LogicalMemoryConfiguration"
   Set Memoryes=WMI.execquery(SQuery)
   For Each Memory In Memoryes
      str= str & "ПАМЯТЬ: " & vbcrlf   
      str=str & "Всего доступно: " & round((Memory.TotalPhysicalMemory)/1024 ,0) & " Mb" & vbcrlf
      str=str & "Описание: " & memory.Description & vbcrlf
   next
   str=str & DELIM_STRING & vbcrlf & vbcrlf
   GetMemoryData=str
End Function

Function GetCompData()
   Dim Comp, colComp
   Dim str
On Error Resume next
   'Получим данные компьютера
   SQuery="select * from Win32_ComputerSystem"
   Set colcomp=WMI.execquery(SQuery)
   str=str & "КОМПЬЮТЕР:" & VBCRLF
   For Each Comp In colComp
      str=str & "Имя: " & Comp.Name & vbcrlf
      CompName=Comp.Name
      If CompName="MAIN" Or CompName="1C" Then
         WScript.Quit(0)
      End if
         str=str & "Входит в домен или рабочую группу: " & Comp.domain & vbcrlf
      str=str & "Имя пользователя: " & Comp.UserName & vbcrlf
   next
   str=str & DELIM_STRING & vbcrlf & vbcrlf
   getcompdata=str
End function

Function GetPrintersData()
Dim Printers, Printer
Dim str
On Error Resume next
'Получим данные по принтерам
SQuery="select * from Win32_Printer " 'where=Atributes.Local>0"
Set Printers=WMI.execquery(SQuery)
str=str & "ПРИНТЕРЫ: " & VBCRLF
For Each Printer In Printers
   str=str & "' ' ' ' ' ' ' ' ' ' ' ' ' ' " &  vbcrlf
   str=str & "Имя: " & Printer.Name &  vbcrlf
   If trim(Printer.ServerName)="" Then
      str= str & "Подключен к " & Printer.PortName & " (локальный)" &  vbcrlf
   Else
      str= str & "Подключен к " & Printer.PortName &   vbcrlf
      str=str & "Общий доступ под именем: " & printer.ShareName & vbcrlf
   End If
Next
   str=str & DELIM_STRING & vbcrlf & vbcrlf
   GetPrintersData=str
End Function

Function GetNetworkAdaptersData()
Dim colAdapters, obAdapter
Dim NetwokAdapters, Adapter
Dim str
On Error Resume next
'Получим информацию по сетевым адаптерам
str=str & "СЕТЕВЫЕ АДАПТЕРЫ: " & vbcrlf
SQuery="select * from Win32_NetworkAdapter where AdapterType='Ethernet 802.3'"
Set NetwokAdapters=WMI.execquery(SQuery)
If NetwokAdapters.count>0 Then
   For each Adapter In NetwokAdapters
      str=str & "Имя: " & Adapter.name & vbcrlf
      SQuery="select * from Win32_NetworkAdapterConfiguration Where Index=" & adapter.deviceID
      Set colAdapters=WMI.execquery(SQuery)
      For Each obAdapter In colAdapters
         str=str & "DNSHostName: " &  obAdapter.DNSHostName & vbcrlf   
      Next
   next
End If
   str=str & DELIM_STRING & vbcrlf & vbcrlf
   GetNetworkAdaptersData=str
End Function

Function GetUserLoginData()
dim NetLogin , colNetLogin
Dim str
On Error Resume next
'Получим информацию по сетевому логину пользователя
str= str & "СЕТЕВЫЕ ДАННЫЕ ПОЛЬЗОВАТЕЛЯ: " & vbcrlf
SQuery="select * from Win32_NetworkLoginProfile"
Set colNetLOgin=WMI.execquery(SQuery)
For Each NetLOgin In colNetLogin
   'WScript.Echo InStrRev(NetLogin.name,"\",Len(NetLogin.name))
   str=str & "Логин для входа в сеть: " &  right(NetLogin.name,len(netlogin.name)-InStrRev(NetLogin.name,"\",Len(NetLogin.name))) & vbcrlf
   str=str & "Тип учётной записи: " &  netlogin.Usertype & vbcrlf
Next
str=str & DELIM_STRING & vbcrlf & vbcrlf
GetUserLoginData=str
End Function

Function GetCDDriveData()
   Dim str, ColCD, CD, i
   On Error Resume next
   str=str & "CD-ПРИВОДЫ:" & VBCRLF
   SQuery="select * from Win32_CDROMDrive"
   Set ColCD=WMI.execquery(SQuery)
   str=str & "Количество: " & ColCD.count & vbcrlf
   For Each CD In ColCD
      i=i+1
      str=str & "Диск (" & CD.MediaType & ") " & CD.Drive & vbcrlf
      str=str & CD.caption & vbcrlf
   Next
   str=str & DELIM_STRING & vbcrlf & vbcrlf
   GetCDDriveData=str
   
End function

Function GetHardDrivesData()
Dim Drives, Drive, FisicalDrives, FisDrive
Dim str, Cilinder, Heads, Sectors, SectorSize
Dim colDriveMedia, DrvMedia, i
On Error Resume next
'Получим информацию о локальных дисках
str=str & "ЛОКАЛЬНЫЕ ЖЁСТКИЕ ДИСКИ:" & VBCRLF
SQuery="select * from Win32_DiskDrive"
Set drives=WMI.execquery(SQuery)
   str = str & "Количество дисков: " & Drives.count & vbcrlf
For Each Drive In Drives
   i=i+1
   str=str & "Диск " & i & vbcrlf
   str=str & "Имя диска: " & Drive.name & vbcrlf
   str=str & "Тип диска: " & Drive.mediatype & vbcrlf
   str=str & "Интерфейс: " & Drive.InterfaceType & vbcrlf
   str=str & "Производитель: " & Drive.Manufacturer & vbcrlf
   str=str & "Модель: " & Drive.model & vbcrlf
   str=str & "Количество разделов: " & Drive.Partitions  & vbcrlf
   Select Case Drive.size/1048576
      Case Drive.size/1048576 < 1048576
         str=str & "Объём: " & round(Drive.size/1024,2) & " Kb" & vbcrlf
      Case Drive.size/1048576 <1000000000
         str=str & "Объём: " & round(Drive.size/1048576,2) & " Mb" & vbcrlf
      Case Else
         str=str & "Объём: " & round(Drive.size/1000000000,0) & " Gb" & vbcrlf '1073741824,2) & " Gb" & vbcrlf
   End Select
   str=str & vbcrlf
   str=str & DELIM_STRING & vbcrlf & vbcrlf
Next
   GetHardDrivesData=str
End Function

Function GetFloppyDrivesData()
Dim ColFloppyDrives, FloppyDrive
Dim str
On Error Resume next
'Получим данные о флопиках
str=str & "ЛОКАЛЬНЫЕ FLOPPY ДИСКИ:" & VBCRLF
SQuery="select * from Win32_FloppyDrive"
Set colfloppydrives=WMI.execquery(SQuery)
For Each FloppyDrive In ColFloppyDrives
   str=str & "Имя диска: " & FloppyDrive.name & vbcrlf
   str=str & "Производитель: " & FloppyDrive.Manufacturer & vbcrlf
   str=str & vbcrlf
   str=str & DELIM_STRING & vbcrlf & vbcrlf
next
str=str & DELIM_STRING & vbcrlf & vbcrlf
   GetFloppyDrivesData=str
End function



Sub SaveReport(sFileName, bAskShowReport)
   dim ask
On Error Resume next
Set FSO=CreateObject("Scripting.FileSystemObject")
Set TXT=FSO.OpenTextFile (sFileName,FOR_WRITING ,true)
TXT.Write (S)
TXT.Close
If baskshowreport Then
   ask=msgbox( "Конфигурация данного компьютера сохранена в " & VBcrlf _
      & "текстовый файл " & sfilename & vbcrlf & vbcrlf & _
      "Открыть данный файл в блокноте?", vbyesNo)
   if ask=vbyes then
      set shell=createobject("Wscript.Shell")
      dim cmdLine
      CMDlINE="notepad.exe " & chr(34) & sfilename & Chr(34)
      shell.run cmdLine
   end If
End if
End Sub

Function GetIPaddress()
Dim colConf, obSettings
Dim colAdapters,obAdapter
Dim AdapterType, bShowVirtual
Dim Service, obService, bShowAll
Dim sStr
On Error Resume next
'Данные возвращаются в виде целого значения,
'которые расшифровываются следующим образом:
' 0 - Ethernet 802.3
' 1 - Token Ring 802.5
' 2 - Fiber Distributed Data Interface (FDDI)
' 3 - Wide Area Network (WAN)
' 4 - LocalTalk
' 5 - Формат Ethernet с заголовком DIX
' 6 - ARCNET
' 7 - ARCNET (878.2)
' 8 - ATM
' 9 - Беспроводной
' 10 - Инфракрасный
' 11 - Bpc
' 12 - CoWan
' 13 - 1394
' Свойство AdapterTypeId может быть неприменимо
'ко всем перечисленным в классе сетевым адаптерам.
' Только Windows NT.

'Параметр bShowAll указывает отображать ли все найденные
'адаптеры или только те, тип которых указан в параметре
'AdapterType.
'Значения: True - отображать все, False - отображать только
'заданные параметром AdapterType
bShowAll=true

'Ethernet 802.3 (установим тип адаптера)
AdapterType=0
'Установим отображение системных(виртуальных) адаптеров
'(True - отображать, False - не отображать)
bShowVirtual=true

'Создадим запрос
SQuery="Select * from Win32_NetworkAdapter"
If bShowAll=False then
   'Добавим в запрос тип адаптера для отбора по значению
   SQuery=SQuery &" WHERE AdapterType=" & AdapterType
End if
'если не отображать системные(виртуальные) адаптеры, тогда
If not bShowVirtual Then
'добавим в запрос условие, что должны отображаться адреса
'только тех адаптеров, которые присутствуют в папке
'"соединения" т.е. не системные(виртуальные).
'Свойство NetConnectionID содержин полное название соединения,
'как оно отображается в папке "Соединения"
   SQuery=SQuery & " And NetConnection>0"
End If

'получим коллекцию сетевых адаптеров
set colAdapters=WMI.Execquery(squery)
'пройдёмся по коллекции
For Each obAdapter In colAdapters
'Получим имя сетевушки

sStr=sStr & obadapter.name & vbcrlf
'sstr=sstr & "Тип адаптера: " & obadapter.adaptertypeid & vbcrlf
'sStr=sStr & "Статус устройства: "
' Select Case obAdapter.NetConnectionStatus
'    case 0 '- Отключено
'       sStr=sStr & "отключено" & vbcrlf
'    case 1 '- Подключение
'       sStr=sStr & "подключение" & vbcrlf
'    case 2 '- Подключено
'       sStr=sStr & "подключено" & vbcrlf
'    case 3 '- Отключение
'       sStr=sStr & "отключение" & vbcrlf
'    case 4 '- Устройство отсутствует
'       sStr=sStr & "отсутствует" & vbcrlf
'    case 5 '- Аппаратное отключение
'       sStr=sStr & "отключено на аппаратном уровне" & vbcrlf
'    case 6 '- Аппаратный сбой
'       sStr=sStr & "аппаратный сбой" & vbcrlf
'    case 7 '- Носитель отключен
'       sStr=sStr & "носитель (кабель) отключен" & vbcrlf
'    case 8 '- Проверка подлинности
'       sStr=sStr & "проверка подлинности" & vbcrlf
'    case 9 '- Подлинность удостоверена
'       sStr=sStr & "подлинность удостоверена" & vbcrlf
'    case 10 '- Подлинность не подтверждена
'       sStr=sStr & "подлинность не подтверждена" & vbcrlf
'    Case Else
'       sStr=sstr & "статус неизвестен..." & vbcrlf
' End select
   
' SQuery="Select * from Win32_SystemDriver Where Name='" & obadapter.servicename & "'"
' set Service=WMI.execquery(SQuery)
' For each observice In Service
'    sStr=sStr & "Имя сервиса: " & obService.name & vbcrlf
' '   If obadapter.NetConnectionID=StopConName Then
' '      stopRes=obService.stopService()
' '      WScript.Echo StopRes
' '   End If
' next

'создадим запрос на получение коллекции настроек
SQuery="SELECT * from Win32_NetworkAdapterConfiguration " & _
   "WHERE index=" & obAdapter.DeviceID
'Получим коллекцию настроек (может быть несколько...)
   Set colConf=WMI.execQuery(SQuery)
'пройдёмся по коллекции
   For Each obSettings In colConf
'т.к. виртуальные (системные) адаптеры не имеют IP адреса
'а может быть и имеют (фиг его знает) - то при получении
' адреса (если установлено отображение системных) -
'возникает ошибка поэтому включим подавление ошибок
      On Error Resume Next
   'Получим адрес сетевушки
         sStr=sStr & "IP Address: " & obSettings.IPAddress(0) & vbcrlf
      On Error goto 0
   Next
   sstr=sstr & DELIM_STRING & vbcrlf
Next
If Len (sStr)= 0 Then
   sstr=sstr & "Активные сетевые адаптеры не обнаружены..."
End If
   sStr=sStr & DELIM_STRING & vbcrlf & vbcrlf
   GetIPaddress=sStr
End function
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 05.10.2005 (Ср) 17:24

Я, в общем ни х*я не понял, но всё-равно спасибо за то, что постарался до меня это донести
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 05.10.2005 (Ср) 18:33

SeT писал(а):Я, в общем ни х*я не понял, но всё-равно спасибо за то, что постарался до меня это донести

А ты пройди по ссылкам, много интересного узнаешь. Если не будешь пользовать - то хотя бы расширишь кругозор. ;)
Да и для автоматизации очень полезная вещь. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 06.10.2005 (Чт) 17:04

Пасиба сотым шрифтом
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 06.10.2005 (Чт) 18:09

SeT писал(а):Пасиба сотым шрифтом

:)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух


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

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 60

    TopList  
cron