Имя: Пароль:
1C
 
Не могу подружить 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`шник), а не саму команду

Запуск = "%comspec% /c nbtstat -A 192.168.200.108 > C:\nbtstat.txt";
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 Цикл