|
Не могу подружить nbtstat и Wscript.Shell.Run() | ☑ | ||
---|---|---|---|---|
0
SiAl-chel
01.12.15
✎
16:58
|
Доброго дня, коллеги. Спасите мой мозг, пжл.
Имеется Windows 7 x64 Ultimate, 1С - 8.3.7.1759 Требуется получить вывод команды NBTSTAT -A <IP-Адрес> Вот кусок кода: WSh = Новый COMОбъект("WScript.Shell"); Запуск = "%comspec% /c nbtstat -A 192.168.200.108 > C:\nbtstat.txt"; Если WSh.Run(Запуск, 0, Истина) = 0 Тогда Run возвращает 1 вместо 0. Пробовал следующие варианты: Запуск = "%comspec% /c "nbtstat -A 192.168.200.108" > C:\nbtstat.txt"; - возвращает 1, пишет в StdErr - "nbtstat не является исполняемым файлом". Запуск = "%comspec% /c c:\windows\system32\nbtstat.exe -A 192.168.200.108 > C:\nbtstat.txt"; - тоже что и выще, только ругается на nbtstat.exe, Запуск = "c:\windows\system32\nbtstat.exe -A 192.168.200.108 > C:\nbtstat.txt"; - пишет что "Ошибка при вызове метода контекста" Запуск = "nbtstat -A 192.168.200.108 > C:\nbtstat.txt"; - пишет что "Ошибка при вызове метода контекста" Пробовал в VBScript Set objShell = CreateObject("Wscript.Shell") objShell.Run("%comspec% /c nbtstat -A 192.168.200.108 > C:\nbtstat.txt, 0, True) работает нормально. Также работает нормально в 1С WSh = Новый COMОбъект("WScript.Shell"); Запуск = "%comspec% /c nslookup 192.168.200.108 > C:\nbtstat.txt"; Если WSh.Run(Запуск, 0, Истина) = 0 Тогда Но дело в том, что по IP-адресу не для всех компов, откликающихся на ping возвращает DNS-имя. Может кто уже побеждал эту заразу? Или кто знает как другим способом делать программно запрос по NetBIOS, используя IP-адрес? Есть какая-то функция Win32 API GetHostByAddr, но как ее использовать в 1С - не знаю. |
|||
1
Garikk
01.12.15
✎
17:05
|
<Но дело в том, что по IP-адресу не для всех компов, откликающихся на ping возвращает DNS-имя. >
Для этого есть nslookup <делать программно запрос по NetBIOS, используя IP-адрес? > А что именно от нетбиоса то нужно? |
|||
2
SiAl-chel
02.12.15
✎
06:24
|
(1)
1. nslookup не для всех компов возвращает имя по ip. Процентов 40% - фэйл. В обратную сторону работает нормально. Я не админ, так что настройки dns-сервера не в моей компетенции. 2. Мне нужно по ip-адресу получить имя и домен хоста. От nbtstat я хотел получить имя, по которому 100% даст ответ nslookip, потому что см п. 1 |
|||
3
ЧеловекДуши
02.12.15
✎
06:30
|
(0) А позвольте поинтересоваться, каков конечный смысл сей задумки?
|
|||
4
SiAl-chel
02.12.15
✎
06:34
|
(3) Инвентаризатор. Юзер задает диапазон ip-адресов (несколько площадок и доменов через VPN). А всякие там запросы к SQL-, 1С-, файл-серверам осуществлятся по имени, ip-адрес не для всех случаев пдходит. Да и имя компа/сервера больше даст юзеру информации, чем его ip-адрес.
|
|||
5
ЧеловекДуши
02.12.15
✎
06:51
|
(4) Я думал, что Диапазон ИП адресов уже известен заранее, нет? :)
Сея задумка работает только под доменным правом Администратора :) http://sysadmins.ru/topic103240.html файл stat.bat: Код: echo %1>>c:\1\1.log nbtstat -a %1>>c:\1\1.log а теперь делаем cmd и пишем в него: Код: for /L %i in (1,1,255) do stat.bat 192.168.0.%i>>c:\1\1.log где 192.168.0.%i - маска сети. Вот вам информация по скрипту http://zheleznov.info/invent_comp.htm http://forum.script-coding.com/viewtopic.php?id=679 Вот как пользоваться гугл :) https://clck.ru/9cabg |
|||
6
PuhUfa
02.12.15
✎
07:04
|
(4) А позвольте поинтересоваться...
>> Инвентаризатор. Юзер задает диапазон ip-адресов (несколько площадок и доменов через VPN). зачем это пользователю 1С? -) |
|||
7
SiAl-chel
02.12.15
✎
07:23
|
(5) Спасибо, но дело в том, что в батнике nbtstat работает, работает и в VBScript через Wscript.Shell.Run, а вот внутри 1С через Wscript.Shell.Run - не работает. Использую Wscript.Shell.Run для того, чтобы окно CMD не моргало при каждом вызове nbtstat.
Думал может кто-то из сообщества сталкивался с некорректной работой Wscript.Shell.Run внутри 1С и знает как ее победить. (6) А разве пользователями базы 1С не могут быть программеры 1С, у которых голова идет кругом от зоопарка шар, каталогов, серверов, на которых лежат и крутятся файловые и SQL версии 1С версии 7.7 и 8. |
|||
8
ЧеловекДуши
02.12.15
✎
07:30
|
(7) Каждый вызов? Шутите? У вас, чего ПК уносят и приносят? :)
|
|||
9
ЧеловекДуши
02.12.15
✎
07:31
|
+(7) Регламентным заданием. Раз в 7 дней :)
Или как то так, в зависимости от полученного опроса сети. |
|||
10
ЧеловекДуши
02.12.15
✎
07:31
|
+(7) >>> Wscript.Shell
Не работает на х64 сервере :) |
|||
11
SiAl-chel
02.12.15
✎
07:50
|
(8) Причем тут это? В конторе куча подсетей, расположенных вразных города, соединенных через VPN, и за раз запускать сканирование по всем компам - глупо. Так что список адресов, диапазонов адресов, подсетей с маскй юзер обработки может указать произвольно.
Список адресов из указанных юзером диапазонов адресов я получил. Через Win32_PingStatus проверил наличие хоста в сети. А вот через nslookup <ip> я не всегда могу получить информацию о домене и имени хоста. |
|||
12
SiAl-chel
02.12.15
✎
07:55
|
(10) Это не критично. Сканирование запускается юзером с рабочей станции.
|
|||
13
ЧеловекДуши
02.12.15
✎
07:55
|
(11) Я к тому, что зачем вообще пользователю это указывать и запускать руками? :)
Выстраиваешь регламентное задание. Продумываешь, когда и во сколько, и как именно запускать сканирование :) Администратор только смотрит в отчет и некий анализ изменения :) |
|||
14
ЧеловекДуши
02.12.15
✎
07:56
|
(12) Вот я и хочу удивиться, у вас Администратору более делать нечего? Чем бессмысленное сканирование запускать, как попугай с одним и тем же интервалом времени :)
|
|||
15
ЧеловекДуши
02.12.15
✎
07:58
|
>>> я не всегда могу получить информацию о домене и имени хоста
Все же некоторая информация вам всегда известна. Тольок нужно правильно её заполнять :) |
|||
16
SiAl-chel
02.12.15
✎
08:29
|
(13), (14) Причем тут регламент? Сценарий работы вообще другой. Хочется например узнать какие есть каталоги с базами 1С 7.7 и когда последний раз их использовали. Есть несколько площадок, в каждой своя подсеть. Все соединено через VPN. Пользователь указывает диапазон адресов, получает из диапазона пингующиеся хосты, потом получает их dns-имена. А потом уже идет сканирование шар, каталогов, получение сервера и имени базы, если база SQL, и подключение к серверу SQL, чтобы проверить наличие базы на сервере SQL. Это один из сценариев.
Проблема в том, что я не хотел заморачиваться с nbtstat, но не во всех dns-серверах резолвятся имена из ip-адреса. А вот nbtstat всегда имя возвращает, которе я и хочу использовать в команде nslookup. |
|||
17
ЧеловекДуши
02.12.15
✎
08:33
|
(16) У вас что всегда что-то меняется?
Пользователи сами эти БД штампуют? Абы как и Абы где? ... Логичней предположить, что и хранить стоит сею информацию, что бы было с чем сверять :) Да про ВПН я понял, не зацикливайся, ВПН, это всего лишь некая фишка, которая позволяет всем работать как бы в одном сетевом пространстве, + типо что-то шифрует (но сей момент детали) :) ... >>> А потом уже идет сканирование шар Не хотите понять, что сей труд бессмыслен и беспощаден. И его можно автоматизировать. Ваше право. :) И в конечном счете СисАдмина будут интересовать только отклонения от того, что было сканировано Вчера, а не программный состав в сию минуту. :) |
|||
18
PuhUfa
02.12.15
✎
08:47
|
Есть подозрение что на nbtstat нехватает прав
Выполни: WSh = Новый COMОбъект("WScript.Shell"); Запуск = "%comspec% /K nbtstat -A 192.168.77.77 > C:\nbtstat.txt"; Сообщить("ответ: " + WSh.Run(Запуск, 1, "True")); |
|||
19
Мэс33
02.12.15
✎
08:51
|
(0) А дальше что 1С будет делать с полученными данными?
|
|||
20
SiAl-chel
02.12.15
✎
09:04
|
(17) Да, инфраструктура - живая вещь. Админы запускают новые физические и виртуальные серверы, убирают старые или сломавшиеся, программеры 1С создают новые базы для "погонять" и для работы по пожеланиям пользователей, или наоборот их переносят, удаляют. Какие-то базы "зависают", так как люди приходят и уходят, а последующие не знают или не помнят что это за базы и зачем они нужны.
Задача вообще не для сисадмина, а скорее для админов БД, программеров 1С. (18) Попробую. Но если параметр /K и 1 в о втором параметре Run показывают окно CMD, от чего и нужно избавиться. Так как иначе я вообще бы использовал КомандаСистемы(). (19) Имена хостов бы использовал для подключения к сетевым шарам, серверам 1С 8 или к SQL-серверам. |
|||
21
Мэс33
02.12.15
✎
09:06
|
(20) По мне - странный способ использовать под это дело 1с.
|
|||
22
PuhUfa
02.12.15
✎
09:06
|
(20) /К с параметром 1 в Run покажет тебе тебе окно CMD в котором написано:
"nbtstat" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. |
|||
23
SiAl-chel
02.12.15
✎
09:07
|
(18) Попробовал. Выдает что "nbtstat не является внутренней или внешней командой..."
|
|||
24
PuhUfa
02.12.15
✎
09:08
|
(23) о чем и речь...
|
|||
25
SiAl-chel
02.12.15
✎
09:09
|
(22) Как это можно победить? В CMD nbtstat работает нормально, в VBScript тоже работает. С запуском nslookup через Wscript.Shel.Run проблем нет.
|
|||
26
SiAl-chel
02.12.15
✎
09:10
|
(21) Меня устраивает 1С. Да и спецов по 1С больше, чем по всяким скриптовым языкам.
|
|||
27
PuhUfa
02.12.15
✎
09:13
|
(25) если бы я знал, я бы написал сразу. У меня пока тоже не взлетает. При этом PAHT, там же, выдает правильные пути... и всякие ping, netstat тоже работают. Не видит почему то исключительно nbtstat
|
|||
28
Мэс33
02.12.15
✎
09:15
|
А если запускать батник (cmd`шник), а не саму команду
|
|||
29
SiAl-chel
02.12.15
✎
09:17
|
(28) Значит коллеги по несчастью. Сейчас хочу пробовать запуск nbtstat через Vbscript внутри MSScriptControl.ScriptControl
|
|||
30
SiAl-chel
02.12.15
✎
09:18
|
(28) Буду пробовать.
|
|||
31
SiAl-chel
02.12.15
✎
09:19
|
То есть (29) для (27). И когда уже сделают редактирование сообщение, блин, на форуме?
|
|||
32
Мэс33
02.12.15
✎
10:40
|
(30) и 1Ску запустить с правами админа.
|
|||
33
Мэс33
02.12.15
✎
10:41
|
(29) не коллега. Я не юзаю скрипты через 1С ))).
Вам же главное потом получить этот результат C:\nbtstat.txt ? |
|||
34
SiAl-chel
02.12.15
✎
12:33
|
(33) Да. Мне нужно из StdOut nbtstat -A <ip> вытащить имя хоста.
|
|||
35
SiAl-chel
04.12.15
✎
10:49
|
Всё. Тема закрыта.
Для получения имени можно использовать команду ping -a <ip-адрес> Команда возвращает либо DNS-имя, если есть возможность, или WINS-имя. |
|||
36
Serginio1
04.12.15
✎
14:11
|
Можно запустить процесс и прочитать вывод консоли
private void run_cmd(string cmd, string args) { ProcessStartInfo start = new ProcessStartInfo(); start.FileName = cmd; start.Arguments = args; start.UseShellExecute = false; start.RedirectStandardOutput = true; using (Process process = Process.Start(start)) { using (StreamReader reader = process.StandardOutput) { string result = reader.ReadToEnd(); Console.Write(result); } } } |
|||
37
SiAl-chel
07.12.15
✎
08:45
|
(36) Не хотелось бы использовать ВК или прочее дополнительное ПО, окромя возможностей ОС и платформы 1С.
|
|||
38
SiAl-chel
09.12.15
✎
10:21
|
Нашел более удобный способ - использовать Win32_PingStatus. Главное условие - включить ResolveAddressNames.
Условие = ""; Для АдресIP из АдресаIP Цикл Условие = Условие + ?(Условие = "", "", " AND ") + "Address = '" + АдресIP + "'"; КонецЦикла; Запрос = "SELECT * FROM Win32_PingStatus WHERE (" + Условие + ") AND ResolveAddressNames = True; Pings = ПолучитьCOMОбъект("winmgmts://./root/cimv2").ExecQuery(Запрос); Для Каждого Ping Из Pings Цикл Сообщить(Ping.Address + Символы.Таб + Ping.); КонецЦикла; |
|||
39
SiAl-chel
09.12.15
✎
10:22
|
+(38)
Вместо Для АдресIP из АдресаIP Цикл читать Для Каждого АдресIP из АдресаIP Цикл |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |