gifts2017

Получение IP компьютера в 1С

Опубликовал Слава Кирлан (Ягг) в раздел Администрирование - Системное

Получение IP компьютера, имя компьютера, имя пользователя и домена  в сеансе 1С.

При удаленном работе с пользователями (например через R-admin), для подключения к компьютеру необходимо что бы пользователь сообщил свой IP. Можно, конечно, вытянуть эту информацию и стандартными способами, но порой сложно объяснить бухгалтеру как это сделать. Данная обработка позволяет нажатием кнопки получить нужные сведения в режиме 1С.

Кроме того, ее можно рассматривать как пример работы с wscript.network

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Получение данных о компьютере
.epf 6,89Kb
24.01.12
113
.epf 6,89Kb 113 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. ediks (ediks) 24.01.12 12:33
Не понял на картинке, что такое на "ДомИн пользователя" :)
2. Игорь Мирошниченко (igormiro) 24.01.12 12:43
Все работает.
А как можно получить IP не терминального сервера, а IP клиентской машины.
Я думаю эта информация больше волнует пользователей.
AK-74S; hulio; +2 Ответить
3. Александр Медведев (anig99) 24.01.12 14:31
4. aaaaaaa (aaaaaaa) 24.01.12 14:41
5. Слава Кирлан (Ягг) 24.01.12 16:09
Обработка для 8.1 но через конфигуратор 8.2. можно легко перекодировать.
Что касается объема информации - то ее делали имено что бы бухгалтер мог легко и просто сказать IP - поэтому не стали перегружать излишними данными.
6. Алексей Сергеев (students) 25.01.12 13:21
7. Максим Волков (maxlenium) 25.01.12 23:13
Очень полезная разработка. Ну и плюс нестандартный подход в ее решении.
8. Максим Волков (maxlenium) 25.01.12 23:15
Работает в 8.1. В моем случае у юзеров было несколько сетевых устройств (VPN, локалка и спутник). Чтобы выбрать все возможные IP, можно просто убрать "преравать" в процедуре Получить_ip.
9. sound sound (sound) 26.01.12 13:50
Имхо, на публикацию не тянет. Чем качать, да еще и непонятно что внутри, было бы гораздо интересней если бы был описан сам подход к решению задачи, ну и оформить все это дело по уму, показать пару-тройку примеров, вот тогда бы было гуд.
10. sound sound (sound) 26.01.12 13:54
Да и ну и до кучи, как верно было замечено в (3), можно через WMI, пример:

// Host,Mac,User,IP
// Для локального компьютера IP_Host = "."
Функция ПолучитьСетевыеПараметры(IP_Host) Экспорт
	Попытка
		Структура = Новый Структура("Host,Mac,User,IP");
		ServicesSet = GetComObject("winmgmts:{impersonationLevel=impersonate}!\\" + СокрЛП(IP_Host) + "\root\cimv2");
		// Host, UserName
		Items = ServicesSet.ExecQuery("SELECT UserName,Name FROM Win32_ComputerSystem");
		Для каждого Item Из Items Цикл
			Структура.Host	= СокрЛП(Item["Name"]);
			Структура.User 	= СокрЛП(Item["UserName"]);
			Прервать;
		КонецЦикла;
		Если ПустаяСтрока(Структура.Host) Тогда
			Возврат Неопределено;
		КонецЕсли;
		// MACAddress
		Items = ServicesSet.ExecQuery("SELECT MACAddress FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2");
		Для каждого Item Из Items Цикл
			Если СокрЛП(Item["MACAddress"]) <> "" Тогда
				Структура.Mac = СокрЛП(Item["MACAddress"]);
				Прервать;
			КонецЕсли;
		КонецЦикла;
		// IPAddress
		Items = ServicesSet.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress='" + Структура.Mac + "'");
		Для Каждого objItem Из Items Цикл
			Если ТипЗнч(objItem.IPAddress) = Тип("COMSafeArray") Тогда
				Для Каждого Элем Из objItem.IPAddress Цикл
					Структура.IP = Элем;
					Прервать;
				КонецЦикла;
			КонецЕсли;	
		КонецЦикла;
		Возврат	Структура;
	Исключение
		Возврат Неопределено;
	КонецПопытки;
КонецФункции // ПолучитьСетевыеПараметры()
...Показать Скрыть


Это, конечно, просто выдранный кусок, но тоже рабочий.
help1Ckr; +1 Ответить
11. Владимир Каракозов (karakozov) 27.01.12 10:32
Хм.Публикацию как мне кажется можно было сделать в рамках статьи а не разработки.Информация к сведению конечно.Но как механизм, не востребован.
12. Евгений Сосна (pumbaE) 27.01.12 16:52
Подскажите доколе это будет длиться с такими обработками? Нет что бы написать вот есть инструмент, вот как можно применять (получили бы свои плюсы) ?

Вот пример Видео как получить эту информацию
13. Слава Кирлан (Ягг) 28.01.12 12:55
Что касается статьи - стыдно признаться я не знаю как это делается. Разберусь - буду писать статьи. Мне самому обычно удобнее рассматривть готовые (работоспособные) обработки (которые можно запустить и оттрасировать). В наивности думал, что и остальным так удобнее, чем просмтртивать здоровые листинги.

Что касается плюсов, то не я придумывал правила этого форума. Я всего лишь им следую. И эти плюсы использую для скачки интересующих меня обработок. Так что да, получил, и благодарен за них.
14. Евгений Сосна (pumbaE) 28.01.12 13:18
Ну так пишите с помощью чего это можно получить, а то вот запущу вашу обработку в толстом клиенте на linux и скажу "Ааа, не работает!".
Если видео смотрели, то должны были увидеть утилитку которая генерит код (распространяеться микрософтом бесплатно).
Вот написали качаем от сюда программу, документацию, смотрим как сформировать правильный запрос, переносим это в 1С и получаем результат. Как пример для чего необходимо - вот лежит обработка получающая IP компьютера, имя компьютера, имя пользователя и домена в сеансе 1С.

P.S.: вот есть обработка, подскажите где можно увидеть другие параметры, получить другие данные?
15. Слава Кирлан (Ягг) 28.01.12 13:35
"не стреляйте в пианиста, он играет как умеет" :)
16. Евгений Сосна (pumbaE) 28.01.12 13:59
:) Обновите публикацию, допишите где вы взяли, как нашли такой запрос, а то извините смотришь на код, вау шаманство и откуда люди это знают, наверное днями и ночами не спять dll декомпилируют?
17. Слава Кирлан (Ягг) 28.01.12 14:37
в понедельник выложу (у меня счас нет обработки - на работе). Но как нашел запрос - не помню, копал в свое время в этом нарпалении.
18. Слава Кирлан (Ягг) 30.01.12 08:06
Кому инетерсен код программы:

Процедура Получить_network()
WSH = Новый COMobject("wscript.network");
ИмяКомпьютера = WSH.ComputerName;
ИмяПользователя = WSH.UserName;
ДоминПользователя = WSH.UserDomain;
КонецПроцедуры


Процедура Получить_ip()
IP = "";

MACAddress = Неопределено;
ИПАдрес = "";
ServicesSet = ПолучитьCOMОбъект("winmgmts:\\localhost\root\cimv2");
MyItems = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True");
Для Каждого MyItem Из MyItems Цикл
MACAddress = MyItem.MACAddress;
Если ЗначениеЗаполнено(MACAddress) Тогда
IPAddress = Неопределено;
Для Каждого IPAddress Из MyItem.IPAddress Цикл
Если ЗначениеЗаполнено(IPAddress) Тогда
IP = IPAddress;
прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;

КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
// Вставить содержимое обработчика.
Получить_network();
Получить_ip();

КонецПроцедуры

На решение наткнулся где-то на форумах в инетернете, когда копался в даном направлении. На исключительное авторство алгоритма и кода не претендую :)
19. Евгений Сосна (pumbaE) 30.01.12 16:01
Давайте тогда уж я дополню, а вы в статью отредактируете.
На решение наткнулся где-то на форумах в инетернете, когда копался в даном направлении.
Для того, что бы не искать это на форумах, достаточно скачать с сайта microsoft программку "Scriptomatic2.exe", данная программа генерит код на js, vbs, python для таких запросов. Если вы ее скачаете и посмотрите на код который она создает и код представленный в (18) то можно будет увидеть аналогию и спокойно получить эти данные в 1С.
Пример кода, который она генерит для задач в (18) вот:
var wbemFlagReturnImmediately = 0x10;
var wbemFlagForwardOnly = 0x20;

var arrComputers = new Array("LOCALHOST");
for (i = 0; i < arrComputers.length; i++) {
   WScript.Echo();
   WScript.Echo("==========================================");
   WScript.Echo("Computer: " + arrComputers[i]);
   WScript.Echo("==========================================");

   var objWMIService = GetObject("winmgmts:\\\\" + arrComputers[i] + "\\root\\CIMV2");
   var colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterSetting", "WQL",
                                          wbemFlagReturnImmediately | wbemFlagForwardOnly);

   var enumItems = new Enumerator(colItems);
   for (; !enumItems.atEnd(); enumItems.moveNext()) {
      var objItem = enumItems.item();

      WScript.Echo("Element: " + objItem.Element);
      WScript.Echo("Setting: " + objItem.Setting);
   }
}
...Показать Скрыть


Ссылка scriptomatic
20. Кэрин Веселенькая (hnya) 31.01.12 16:17
мне пока еще такая обработка не пригождалась, но я думаю в будущем вполне возможно, что будет полезно. сколько интересных вещей можно найти на этом сайте. что ж, спасибо!
21. Руслан Программист 1с (Mudrii_Gankster) 01.02.12 17:06
Хорошо бы дописать обработку, чтобы она как-то могла сказать IP или Имя компа с которого подконектились в RDP
22. Дмитрий (Hellisad) 01.02.12 18:31
(21) Mudrii_Gankster, А если терминал с внешним IP (на удаленном от офиса серваке), то IP или Имя компа с которого подконектились в RDP будет бесполезной информацией
23. Vetal Vetal (Vetal85) 03.02.12 08:39
А данная фишка может может извлекать мас-адреса
24. Роман Лиль (Lalei2008) 03.02.12 09:45
Когда-то хотел написать монитор для 1С7, чтобы он видел пользователя, и его ip, именно клиентский. Монитор так и не написал, а вот скрипт нашел, пользуйтесь) Для просмотра работы скрипта сохраните его в текстовый файл *.vbs

Dim Shell, DesktopPath, URL, Text
strComputer = "."
Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2")
Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where ipenabled = true")
Set HostNameSet = objWMIService.ExecQuery("Select DNSHostName from Win32_NetworkAdapterConfiguration where ipenabled = true")

For Each obj in HostNameSet
Text = "Имя компьютера: " & obj.DNSHostName & VbCrLf
Next

Text = Text & VbCrLf

for each IPConfig in IPConfigSet
if Not IsNull(IPConfig.IPAddress) then
for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
Text = Text & "Ваш IP: " &IPConfig.IPAddress(i)& VbCrLf
next
end if
next

Set Shell = CreateObject("WScript.Shell")

remotepc = Shell.ExpandEnvironmentStrings("%ClientName%")
session = Shell.ExpandEnvironmentStrings("%SESSIONNAME%")

if session <> "Console" then
getIP(remotepc)
end if
Text = Text & VbCrLf & "Пользуйтесь на здоровье!"
WScript.Echo Text
function getIP(strComputer)
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled=TRUE")
Text = Text & VbCrLf & "Терминальная сессия с:" & VbCrLf
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
Text = Text & VbCrLf & "Host: " & strComputer & " IP: " & IPConfig.IPAddress(i)
Next
End If
Next
Text = Text & VbCrLf
end function
allgorhythm; lsp71; +2 Ответить
25. Алексей Аборин (commo) 10.02.12 14:17
26. vladal (Vladal) 13.02.12 15:17
Месье, я за то, чтобы подобные вещи в виде статьи были - кому надо, используют опыт и сделают обработку/процедуру в своей системе.
Но не надо же издеваться над народом - чтобы посмотреть, как это сделано, надо скачать.

Опиши статью, как делали, кто хочет - тот скачает. Вот мой пример: описал в статье, как делал, для интересующихся, кто хочет - качают. Кто хочет - делают.
Вот статья с прикрепленной обработкой: Рекурсивный обход дерева значений с пересчетом иерархических итогов группировок.
27. vladal (Vladal) 13.02.12 15:22
(13) Ягг, >> В наивности думал, что и остальным так удобнее, чем просмтртивать здоровые листинги.

Вот здесь молодец, хочешь применять конструктивную критику. Я не видел этот твой пост, потому написал (26). На (26) смотри в призме этого поста.

Допиши, пожалуйста, свой код, как ты взял скрипт, как сделал обертку в 1С для него и т.д.

Удачи!
28. Слава Кирлан (Ягг) 19.02.12 09:12
(27) vladal, так в 18 сообшении выложен весь код - он не такой большой
29. vladal (Vladal) 19.02.12 16:42
(28) Ягг, теперь это надо в статье описать.

Как пример - Вот скрипт такой-то, вот его оболочка в 1С, вот готовую обработку можно скачать.

Или всё ради скачивания?
30. Евгений Сосна (pumbaE) 19.02.12 17:29
(29) vladal, все ради скачиваний... Посмотри (12) , (14), (16), (19) ...
И автор типа не понимает, что от него хотят.
31. vladal (Vladal) 19.02.12 23:56
(30) pumbaE, во мне проснулся Торквемада.
Буду нещадно минусовать.
32. vladal (Vladal) 20.02.12 00:01
(0) Автор, есть некий этикет. Об нём намекали. Говорили прямо.
Лично МНЕ не жалко самому зафигачить пару-тройку макросов на js, vbs или wsh и прикрутить их к 1С.
Но нужно уважать сообщество.

Повторю прямо - допиши текст статьи. А пока минус. Исправишь - мой минус превратится в плюс.
33. Евгений Сосна (pumbaE) 20.02.12 12:56
vladal происходил из испанской семьи крещёных евреев[2] и приходился племянником кардиналу Джорджи (исп.)русск., также крещеному еврею. Историк той эпохи pumbaE (исп.)русск. пишет о vladal, что "его дед и бабка были из рода обращенных в нашу святую веру 1С".
Получив специалиста по 1С и отличаясь аскетическими наклонностями, vladal поступил в infostart, в 20.. году стал Профессиональный разработчиком.
Главной задачей vladal было религиозное и политическое объединение infostart. Для достижения этой цели он реорганизовал и расширил деятельность модераторов. В 1483 году vladal был назначен «великим инквизитором».

:)
34. Слава Кирлан (Ягг) 20.02.12 16:03
"Хотел как лучше - получилось как вегда" :)
Ладно, ребята, всем не угодишь - пойду выпью яйду :)
35. Денис (mugger) 11.03.12 15:32
Спасибо за статью.

А теперь вопрос сложней, мож кто знает.
Нужно получить внешний ИП адрес клиента, который подключился через ВЕБ.
Через winmgmts определяются только локальные адреса...
36. vladal (Vladal) 23.08.12 16:55
(34) Ягг, всё нормуль. Надо только текст обработки запилить в статью. Умный посмотрит и слделает, ленивый скачает.
37. arukovasv arukovasv (arukovasv) 20.10.14 13:45
Коллеги, подскажите пож-та, как ж все таки получить IP клиента, который подконнектился по RDP? Код из (18) дает мне IP сервера..
38. shved (shved) 15.03.15 17:23
+Коллеги, подскажите пож-та, как ж все таки получить IP клиента, который подконнектился по RDP? Код из (18) дает мне IP сервера..
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа