Время от времени клиенты просят сказать, какие у них конфигурации компьютеров, какие программы стоят у пользователей и т.п. Особо крупные клиенты часто интересуются, а сколько у них сейчас вообще живых ПК. Для решения подобных задач создан скрипт, собирающий информацию обо всех компьютерах в Active Directory.

Запустите ADInventory.ps1, и после его работы у Вас появятся два файла.

Во-первых, computers.csv с информацией о:

  • имени компьютера в AD и его организационной единицей;
  • последнем пользователе компьютера и пользователе, введшим его в домен (полезно при поисках хозяина компьютера в большой сети);
  • датой последнего появления в сети (полезно при поиске «мёртвых душ»);
  • ОС;
  • типом платформы – физическая или виртуальная;
  • IP и MAC;
  • аппаратной конфигурацией (модель, частота и кол-во ядер процессора, объёмом памяти, ёмкостью и моделями дисков, моделями мониторов).

Во-вторых, software.csv с информацией о:

  • всех установленных на компьютерах программах;
  • количеством установок каждой программы (полезно для подсчёта лицензий);
  • на каких компьютерах стоит или не стоит данная программа и, наоборот, какие программы стоят или не стоят на указанном компьютере.

Главная особенность – накопление информации от запуска к запуску. При следующем запуске старая информация не удаляется, а дополняется. Поэтому поставив скрипт в планировщик заданий на регулярное выполнение в течение, скажем, недели, вы получите информацию обо всех компьютерах, хоть раз появлявшихся on-line во время работы скрипта.

По мере поступления новых заказов от клиентов и расширения своих собственных потребностей, функционал скрипта расширяется.

  • Active Directory;
  • PowerShell на компьютере, где запущен скрипт;
  • скрипт запущен с правами администратора домена;
  • у компьютеров домена открыто удалённое администрирование по WMI (требуется включение разрешений на локальных сетевых экранах);
  • для получения информации о мониторе компьютера – ОС Windows Vista или выше, драйвер с поддержкой VESA E-EDID (как правило, все драйвера под современные ОС поддерживают).

На выходе – csv-файлы стандартного формата, которые можно открыть и обработать в любом табличном процессоре – Excel, OpenOffice и т.п. При минимальных навыках работы с таблицами (включение фильтрации и сортировки по столбцам) можно автоматизированно получить довольно симпатичные отчёты.

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

Может кому-нибудь пригодится данный способ:

1) Установленный/Portable Дистрибутив AIDA64

3) Учетка с правами администратора в данном домене

1) Создаем шару с полным доступом для всех и копируем туда все файлы aida64

2) Запускаем Aida64, заходим в мастер отчетов , выделяем нужные нам свойства и сохраняем на шару рядом с AIDA64.exe — aida64.rpf

3) Делаем бат-файл со следующим содержимым и кладем его на нашу шару в папку с aida64 под именем aida.bat:

\station177AIDALOGS2aida64.exe /R "\station177AIDALOGS2Reports$IPADDR — $HOSTNAME — $USERNAME.txt" /SUM /CSV /SHOWP /NOICONS /CUSTOM \station177AIDALOGS2aida64.rpf

где \station177AIDALOGS2 — путь к шаре

4)Для скана всех известных пк в сети(используется ARP таблица) запускаем данную команду:

Сначала обновляем ARP таблицу:

for /L %a in (1,1,254) do @start /b ping 10.200.1.%a -n 2 > nul

Замените 10.200.1 на вашу подсеть

И команда для инвентаризации:

psexec \* -u domainuser -p ***** -d -n 12 \station177AIDALOGS2aida.bat

, где * — скан всех пк (ARP)

Для скана определенного пк замените * на его имя

В итоге в папке REPORTS обнаружим отчеты в CSV/HTML формате, которые можно просмотреть в любом браузере в удобном виде.

+ данного метода в том, что aida предоставляет множество информации(нужные поля мы сами задаем в мастере отчетов)

+ все происходит в скрытом режиме для конечного пользователя

Дубликаты не найдены

Он денег стоит:D

Нам было необходимо достать инфу конкретную, чтобы закупить память под старый разрозненный парк. Опять же единоразово, а не на постоянной основе. Так и PRTG хватает

Опять повторюсь, аида позволяет достать ту же макс поддерживаемую ОЗУ + количество свободных слотов + поддерживаемые типы достать. И еще кучу всего по желанию. Не всякий софт справится.

А зачем перед сканированием ARP-таблицу очищать?

А именно очищать ее нужно перед сканом подсети так как некоторые пк, которые закэшировались в таблице уже могут быть выключены и это удлиняет время отработки скрипта.

У меня строчка завелась только после изменения:

Без этого ошибка "Непредвиденное появление а".

Дык это не очистка, а наоборот заполнение таблицы — пинг каждого пк в указанной подсети в указанном диапозоне, чтобы pstools смогла отработать с * диапозоном.

Как этот процесс заставить работать не в домне.

Допустим, на всех ПК есть админская учётка "admin" c одним и тем же паролем.

Первую проблему победил — это заставил psExec заходить на ПК — на всех ПК разрешил доступ к админиским шарам "C$" (в домене он уже включён, а у меня компьютеры не в домене), командой:

reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem" /v "LocalAccountTokenFilterPolicy" /t reg_dword /d 1 /f

Вторая проблема в том что psExec надо запускать в cmd, запущенной от администратора, т.к. aida64 требует повышения прав.

Третью пробелму я не смог победить: проблема в том, что psExec не может запустить бат файл с шары, хотя доступ для всех и без пароля (вручную с другого с ПК, с которого мне надо собрать отчёт я могу запустить из шары этот bat файл):

Всех приветствую.
Недавно начальство попросило меня подумать над вопросом о сборе информации о комплектации компьютеров у нас в домене. Сначала просьба была только на счет процессоров памяти и жестких дисков. Первая мысль — хождение по отделам и просьба освободить компьютер на минутку. В случае с 1 компьютером не сложно, но если их 1500. Мысли были направленны в сторону PowerShell.

Для начала надо было извлечь список всех компьютеров в домене. В данном примере мой домен Test.lan. Импортируем весь этот список в файл AllComputers.csv.
Для этого не забываем добавить модуль АД для PS. У меня на рабочем месте он прописан в профиле, и вам советую сделать тоже самое:

import-module activedirectory
get-ADcomputer -Filter * |
Where-Object <$a=$_.name; $_.DistinguishedName -ne "CN=$a,OU=Disable,DC=Test,DC=lan">|
Sort-Object name | Select-Object name | Export-csv C:InventAllComputers.csv -NoTypeInformation

Здесь надо пояснить, что у меня в домене есть папка Disable, где располагаются учетные записи всех отключенных компьютеров. Если они отключены, то какой смысл к ним стучаться. По этому эту папку мы исключаем из поиска.

Всем понятно, что далеко не все компьютеры, которые находятся в домене, включены, работают или вообще имеют место быть. По этому перед тем, как перейти к проверке, мы проверяем связь с ним. Конечно можно этого не делать, если у вас 100 компьютеров. А если у вас 2000 компьютеров, потеря времени при количестве выключенных компьютеров порядка 800 съест у вас не мало времени. Так же стоит сразу вспомнить компьютеры, к которым у нас нет доступа. Так же смысла стучаться в их дверь нет.

import-csv c:InventAllComputers.csv | foreach <
$a=$_.name
if ((Test-connection $a -count 2 -quiet) -eq "True")
<
if ((Get-WmiObject -computername $a Win32_OperatingSystem) -eq $null)
<

Многие могут возразить:
«Для чего такие сложности? Зачем сначала делать список а потом импортировать его. Не легче ли сразу?»
Согласен, легче. Но иметь перед глазами список компьютеров, согласитесь, приятно. К тому же, список пронумерован. И Вы всегда знаете сколько у вас компьютеров в АД.

Для теста соединения выбрал cmdlet Test-connection с параметром -quiet, дабы нам не выдавались строчки с разной информацией, а просто выдавался ответ: True or False. При чем мы сокращаем количество запросов с 2 до 4.
Если мы постучимся к компьютеру с WMI запросом, а прав на такое действие у нас нет, получим кучу строчек красного цвета с ошибками. Так что сразу отфильтровываем такие компьютеры пробным WMI запросом

Любую информацию (наверное, почти любую) можно узнать, если залезть в WMI объекты, а PS позволяет это делать просто на ура. Так что я сразу углубился в поиски нужных WMI объектов.
Здесь можно поглядеть все классы с их атрибутами.
Убедившись, что компьютер в сети, что доступ у нас к нему есть, смотрим его внутренности:

Write-Host "Проверка компьютера " -ForeGroundColor Green $a
"Компьютер" | out-file c:InventComp$a.txt
Get-WmiObject -computername $a Win32_OperatingSystem |
select-object csname, caption, Serialnumber, csdVersion |
ft @>,
@>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_ComputerSystemProduct | select-object UUID |
ft UUID -autosize | out-file c:InventComp$a.txt -append
"Процессор" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_Processor | select-object name, SocketDesignation, Description |
ft @>,
@>,
@> -auto -wrap | out-file c:InventComp$a.txt -append
"Материнская плата" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_BaseBoard | select-object Manufacturer, Product, SerialNumber |
ft @>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
"Жесткие диски" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_DiskDrive | select-object Model, Partitions, Size, interfacetype |
ft @>,
@>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
"Логические диски" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_LogicalDisk -Filter "DriveType=3" | select-object DeviceID, FileSystem, Size, FreeSpace |
ft @>,
@>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
"Оперативная память" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_Physicalmemory | Select-Object capacity, DeviceLocator |
ft @>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
"Видеокарта" | out-file c:InventComp$a.txt -append
Get-WmiObject -computername $a Win32_videoController |
Select-Object name, AdapterRAM, VideoProcessor |
ft @>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
"Сетевая карта" | out-file c:InventComp$a.txt -append
$OS=Get-WmiObject -computername $a Win32_OperatingSystem | foreach <$_.caption>
if ($OS -eq "Microsoft Windows 2000 Professional")
<
Get-WmiObject -computername $a Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=True" |
Select-Object caption,MACaddress |
ft @>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
>
else
<
Get-WmiObject -computername $a Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |
Select-Object name, AdapterType, MACAddress |
ft @>,
@>,
@> -auto -wrap |
out-file c:InventComp$a.txt -append
>
>

Вся информация о компьютере падает в текстовый файл.
Здесь стоит остановить внимание на 2 моментах.
Во-первых, строчку Write-Host "Проверка компьютера " -ForeGroundColor Green $a я делал исключительно для себя, ибо приятно знать чем занимается в данный момент PowerShell.
Во-вторых, для чего мы перед проверкой сетевой карты проверяем ОС.
К сожалению, Windows 2000 не отвечает на запрос Win32_NetworkAdapter, по этому к ней мы применяем запрос Win32_NetworkAdapterConfiguration. Почему не оставить только последний? Можно оставить, но Win32_NetworkAdapter выдает такой атрибут, как Name, когда в его аналоге только Caption. Мелочь, а приятно.
Так же можете видеть, что при проверки сетевой карты, мы проверяем ее на работоспособность, иначе мы получим список еще из нескольких карт, которые в данный момент Вас не интересуют. Вам это надо?

Вот в принципе и все.
Скрипт можно доработать до своих потребностей.
Так что теперь начальство вряд ли напугает вас инвентаризацией компьютеров.