Получение параметров по сети через PowerShell

Started by sdm, March 18, 2014, 09:52:45 AM

Previous topic - Next topic

sdm

В PowerShell есть масса возможностей получать параметры с других компьютеров, по своей сути это информация WMI, но, при всем этом в интернете масса решений для получения тех или иных параметров, возможность их предобработки, а так же возможность получать эту информацию без агента на компьютере.

Каким образом ноде, присвоить значение полученное скриптом через агент другого компьютера?
В настоящий момент есть идея через агент сервера, где установлен агент выполнять PowerShell скрипт, снимающий значения с Windows компьютеров в сети, и заносить их в базу.
Каким образом можно инициализировать выполнение скрипта на сервере с подстановкой параметра $node в качестве имени компьютера ($computer в примере ниже) и, присвоением возвращенного результата в качестве значения определенного параметра для $node?
Я знаю, что снятие значений таким образом займет много времени, но в моем случае оно не требует оперативности, т.е. такой обход достаточен раз в сутки.

По своей сути данное решение является аналогом Agentless WMI, который ожидается в новой версии, но хочется, и, даже нужно уже сейчас.

Примеры того, что хотелось бы получать:
Get-WmiObject -Class Win32_LogicalDisk -Computername $computer -Filter DriveType=3 | Select DeviceID , @{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}}, @{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}}

(Get-WmiObject -Class Win32_ComputerSystem -Computername $computer | Select-Object Name,Domain,Model).Model

(Get-Service | Where {$_.Name -eq "ServiceName"} | Select-Object Status).Status

Victor Kirhenshtein

Один из вариантов такой:

1. Делаем ExternalParameter на агенте, с которого будем запускать скрипт. Выглядеть он может как-нибудь так:

ExternalParameterShellExec = Test(*):start_script.cmd $1

В $1 попадет имя ноды.

2. На узлах, для которых надо собирать информацию, делаем DCI Test(имя ноды) и указываем как прокси узел с агентом.

sdm

Спасибо за оперативный ответ, все почти заработало
Разобрался, что файл хранящийся по пути: C:\NetXMSAgent\etc\nxagentd.conf не имеет отношения к конфигурации агента, а вся настройка производится в консоли управления, по нажатию пкм на хосте из списка слева.

На хосте с агентом добавлены параметры:
чтобы была возможность использовать его как прокси:
EnableProxy = yes
чтобы дожидаться выполнения достаточно продолжительных powershell комманд:
ExecTimeout = 20000
примеры того, что я тестировал, работают оба варианта:
ExternalParameterShellExec = GetComputerModelLocal(*):powershell.exe "(Get-WmiObject -Class Win32_ComputerSystem -Computername localhost | Select-Object Name,Domain,Model).Model"
ExternalParameterShellExec = GetComputerModelHost(*):powershell.exe "(Get-WmiObject -Class Win32_ComputerSystem -Computername CustomName | Select-Object Name,Domain,Model).Model"
Так же с целью тестов, а именно того, что отправляется в powershell добавлено:
ExternalParameterShellExec = Write-Host(*):powershell.exe "Write-Host 1::$1 host::$host"

В результате
$1 - возвращает символ: *
$host возвращает слово: host

А вот при попытке добавить Write-Host(*) на другой компьютер с указанием в прокси компьютера с агентом никакие данные не отображаются, т.е. в приведенном примере, там, где установлен агент в качестве значений не пишутся: * и node,
на нужном мне компьютере (где нет агента) значения не пишутся, а метрики переходят в состояние: Не поддерживается
То же самое наблюдается при указании в качестве метрики Write-Host(computername)

Я правильно делаю, что добавляя метрику выбираю: прокси-ноду, Агент NetXMS, а в строчке Параметр вручную вписываю Write-Host(*), потомучто при нажатии кнопки Выбрать ничего не предлагается?
При выполнении скриптов замечены тормоза, означает ли это, что все выполняется последовательно, и, пока предыдущий скрипт не вернет ошибку, опрос соседнего хоста производится не будет?
Также остается вопрос каким образом автоматизировать добавление данного шаблона на другие компьютеры, т.е. способ, чтобы имя ноды подставлялось для снятия метрики автоматически..

sdm

Главный тест, проверил работу метрик:
Write-Host(custom) и GetComputerModelHost(customcomputername)
На ноде с агентом все работает и возвращает результат.
При выставлении этих же метрик на ноду без агента, но, с указанием прокси ничего не приходит, а метрика переходит в состояние Unsupported.

Victor Kirhenshtein

Попробуйте поставить параметр сервера CheckTrustedNodes в 0.

sdm

Снова спасибо, после добавления опции все заработало!!.

У меня тут после добавления сервера в домен перестал запускаться SQL, который от MS (черт попутал выбрать эту БД). Как выяснилось это стандартная фитча.
Не имеет отношения к текущему вопросу, но за оперативность желаю помочь проекту: я ставил версию 1.2.12, в качестве базы используется SQL Express 2012 (я не сторонник, но, большинство коллег работает с ней), все это запущено на Windows Server 2012 R2. В результате драйвер mssql не работает, зато работает odbc. Кроме сегодняшних проблем с запуском других проблем не наблюдал. После того, как потестирую, выложу получившиеся конфиги.

sdm

Что-то на радостях забыл одну из главных настроек, как все это переделать в шаблон и автоматически, в качестве значений в скобках прописывать имя ноды, с указанием прокси в настройках?

Victor Kirhenshtein

Прокси указать в шаблоне (поскольку он не меняется), а в качестве имени ноды в шаблоне указать %{node_name} (все макросы описаны здесь: https://www.netxms.org/documentation/adminguide/data-collection.html#macros-in-template-items).

sdm

Вообщем результаты:
Все настроилось, работает и выполняет то, что нужно, но, лишь при нагрузке в 2 компьютера, (на которых я тестировал).
Сам по себе скрипт:
powershell.exe "(Get-WmiObject -Class Win32_ComputerSystem -Computername localhost | Select-Object Name,Domain,Model).Model
локально у меня отрабатывает около 7-ми секунд.
Для тестов такую же метрику я добавил на саму ноду, с которой работает клиент, в результате после добавления задания на несколько десятков компьютеров, метрика на ноде с клиентом стала сниматься рывками, т.е. при количестве в 2 компьютера все успевало сниматься каждую минуту, а вот при добавлении еще нескольких десятков компьютеров начали появляться перерывы в метриках в неколько минут.
Получается, что все операции агент делает последовательно, не распараллеливая выполнение.
К 7-ми секундам на выполнение, нужно добавлять время на ожидание возврата ошибки в powershell, когда нет связи или доступа к какой-либо из нод.

sdm

Нет ли опции для агента, что позволяет параллелить выполняемые задания?


Нахожу все больше интересных вещей, которые можно мониторить powershell-ом:

Скорость на интерфейсе:
Get-Counter -ComputerName $computername -Counter "\Network Interface(*)\Current Bandwidth"
Количество открытых сессий:
Get-Counter -ComputerName $computername -Counter "\Terminal Services\Total Sessions"
Свободное место:
Get-Counter -ComputerName $computername -Counter "\LogicalDisk(*)\% Free Space"
Загрузку диска:
Get-Counter -ComputerName $computername -Counter "\PhysicalDisk(*)\Disk Reads/sec" -SampleInterval 1 -MaxSamples 5

Сейчас ищу как получать количество открытых соединений, но, думаю, что наверняка есть.

Также поинтересуюсь: Когда стоит ждать версию 1.3 и AgentlessWMI?

Victor Kirhenshtein

Можно пробовать использовать ExternalParametersProvider - на форуме довольно много сообщений на эту тему, например это: https://www.netxms.org/forum/configuration/reading-in-values-from-a-file/msg10173/#msg10173.

Первая версия в ветке 1.3.x будет думаю в начале мая.