Приветствую тебя, читатель. В предпоследний день марта решил я затронуть тему инвентаризации. Рано или поздно этим придётся заниматься. Зачастую всем сначала впопыхах выдаётся оборудование без накладных и прочих документов о приеме сдаче оборудования, а потом, когда волна приёма сотрудников заканчивается, бухгалтерия, или ещё какой-нибудь ответственный за это дело отдел, начинает задавать неинтересные вопросы. А сколько у нас всего ПК, ноутбуков, нетбуков и всего того что может подключаться к сети и использоваться как рабочая станция?
Снова чертим на полу пентаграмму и призываем всесильный PowerShell помочь нам в этот и сложном и простом деле. В 21 веке можно без жертвоприношений, так что простой пентаграммы на полу и произношения в слух заклинания "Win+R, PowerShell_ISE.exe, Enter! "3 раз вполне достаточно.
В первую очередь нам нужен список рабочих станций, которые мы будем инвентаризировать. Для этого смотрим мой предыдущий пост, о том как получить из нужной нам OU список Enabled компов.
Сохраняем все полученное в txt файл, каждое имя с новой строки.
Копируем код ниже, правим параметры ввода вывода, жмём F5 и идём пить кофе
$CompCol = $Comp = $null
$CompCol = Get-Content "C:\users\ODMIN\desktop\AllComputers.txt"
$PCInventory = New-Object System.Text.StringBuilder
$null = $PCInventory.Append("PCName;Availability;Manufacturer;Model;Serial Number;CPU;HDD Capacity;HDD Caption;NAdapter Model;MAC Address;IP V4 Address;IP V6 Address;RAM;Monitor Model;Monitor Number;Operating System;SP;Video Adapter;VGA Ram;User logged In; Last LogOn;Last Reboot;PCType`n") #changed добавлены Monitor Model, Monitor Number
foreach ($Comp in $CompCol)
{ $Availability = $Manufacturer = $Model = $SerialNumber = $CPU = $HDDCapacity = $HDDCaption = $RAM = $OperatingSystem = $SP = $LastLogOn = $LastReboot = $NAdapterModel = $LastLogOn = $MACAddress = $IPV4Address = $IPV6Address = $PCTypeT = $MonModel = $MonNumber =$UserLoggedIn = $null #changed добавлены $MonModel, $MonNumber
if (Test-Connection -ComputerName $Comp -Count 1 -Quiet) {
# Получаем данные от ПК
$Availability = 1
$Manufacturer = (gwmi Win32_ComputerSystem -ComputerName $Comp).Manufacturer
$Model = (gwmi Win32_ComputerSystem -ComputerName $Comp).Model
$SerialNumber = (gwmi Win32_BIOS -ComputerName $Comp).SerialNumber
$CPU = (gwmi Win32_Processor -ComputerName $Comp).Name
foreach ($_ in gwmi Win32_DiskDrive -ComputerName $Comp)
{
$HDDCapacity = "$HDDCapacity, " + "$([int]($_.Size / 1gb))"
$HDDCapacity = $HDDCapacity.trimstart(",", " ")
$HDDCaption = "$HDDCaption, " + $_.Caption
$HDDCaption = $HDDCaption.trimstart(",", " ")
}
foreach ($_ in gwmi Win32_NetworkAdapterConfiguration -ComputerName $Comp -Filter "IPEnabled='true'")
{
$NAdapterModel = "$NAdapterModel, " + $_.Description
$NAdapterModel = $NAdapterModel.trimstart(",", " ")
$MACAddress = "$MACAddress, " + $_.MacAddress
$MACAddress = $MACAddress.trimstart(",", " ")
$IPV4Address = "$IPV4Address, " + $_.IpAddress[0]
$IPV4Address = $IPV4Address.trimstart(",", " ")
$IPV6Address = "$IPV6Address, " + $_.IpAddress[1]
$IPV6Address = $IPV6Address.trimstart(",", " ")
}
foreach ($_ in gwmi WmiMonitorID -Namespace root\wmi -ComputerName $Comp)
{
$MonModel = "$MonModel, " + [System.Text.Encoding]::ASCII.GetString($_.UserFriendlyName)
$MonModel = $MonModel.trimstart(",", " ")
$MonNumber = "$MonNumber, " + [System.Text.Encoding]::ASCII.GetString($_.SerialNumberID)
$MonNumber = $MonNumber.trimstart(",", " ")
}
foreach ($_ in gwmi Win32_VideoController -ComputerName $Comp)
{
$VGAName = "$VGAName," + $_.Description
$VGAName = $VGAName.trimstart(",", " ")
$VGARam = "$VGARam, " + $_.AdapterRam/1Mb
$VGARam = $VGARam.trimstart(",", " ")
}
$UserLoggedIn = ((gwmi win32_computersystem -comp $comp).UserName)
$RAM = (gwmi Win32_ComputerSystem -ComputerName $Comp).TotalPhysicalMemory/1mb
$RAM = [math]::Round($RAM)
$OperatingSystem = (gwmi Win32_OperatingSystem -ComputerName $Comp).Caption
$SP = (gwmi Win32_OperatingSystem -ComputerName $Comp).ServicePackMajorVersion
$LastLogOn = ((Get-ADComputer -Identity $Comp -Properties LastLogonDate).LastLogonDate).ToShortDateString()
$LastReboot = [Management.ManagementDateTimeConverter]::toDateTime((gwmi Win32_OperatingSystem -ComputerName $Comp).LastBootUpTime).toString()
# Типы ПК в зависимости от значения ChassisTypes указаны здесь http://marckean.com/2010/12/21/sccm-2007-r2-collection-queries/
$PCType = (gwmi Win32_SystemEnclosure -ComputerName $Comp).ChassisTypes
switch ($PCType)
{
1 {$PCTypeT = "Other"}
2 {$PCTypeT = "Unknown"}
3 {$PCTypeT = "Desktop (Virtual machines as well)"}
4 {$PCTypeT = "Low Profile Desktop"}
5 {$PCTypeT = "Pizza Box"}
6 {$PCTypeT = "Mini Tower"}
7 {$PCTypeT = "Tower"}
8 {$PCTypeT = "Portable (Laptop or Notebook)"}
9 {$PCTypeT = "Laptop (Not as popular)"}
10 {$PCTypeT = "Notebook (Popular)"}
11 {$PCTypeT = "Hand Held"}
12 {$PCTypeT = "Docking Station (Laptop or Notebook)"}
13 {$PCTypeT = "All in One"}
14 {$PCTypeT = "Sub Notebook"}
15 {$PCTypeT = "Space-Saving"}
16 {$PCTypeT = "Lunch Box"}
17 {$PCTypeT = "Main System Chassis (Physical Server)"}
18 {$PCTypeT = "Expansion Chassis"}
19 {$PCTypeT = "Sub Chassis"}
20 {$PCTypeT = "Bus Expansion Chassis"}
21 {$PCTypeT = "Peripheral Chassis (Laptop or Notebook)"}
22 {$PCTypeT = "Storage Chassis"}
23 {$PCTypeT = "Rack Mount Chassis (Physical Server)"}
24 {$PCTypeT = "Sealed-Case PC"}
default
{$PCTypeT = "Not provided"}
}
# Пишем в лог
$null = $PCInventory.Append("$Comp;$Availability;$Manufacturer;$Model;$SerialNumber;$CPU;$HDDCapacity;$HDDCaption;$NAdapterModel;$MACAddress;$IPV4Address;$IPV6Address;$RAM;$MonModel;$MonNumber;$OperatingSystem;$SP;$VGAName;$VGARam;$UserloggedIn;$LastLogOn;$LastReboot;$PCTypeT`n") #changed добавлены $MonModel, $MonName
}
else {
# Пишем в лог, что нет связи с ПК
$Availability = 0
$null = $PCInventory.Append("$Comp;$Availability`n")
}
}
$PCInventoryStr = $PCInventory.ToString()
Set-Content -Value $PCInventoryStr -Path "C:\Users\odmin\Desktop\PCInventory.csv"
После того как всё это отработало смотрим наш файл и извлекаем всё полезное для себя.
Сразу точно могу сказать что мониторы Dell не инвентаризируются по WMI в принципе. Серийный номер выдаваемый скриптом из WMI не имеет ничего общего с настоящим.
Плюс некоторые производители могут хранить серийники мониторов в другом месте.
Комментариев нет:
Отправить комментарий