вторник, 26 апреля 2016 г.

Инвентаризация рабочих станций при помощи PowerShell


Приветствую тебя, читатель. В предпоследний день марта решил я затронуть тему инвентаризации. Рано или поздно этим придётся заниматься. Зачастую всем сначала впопыхах выдаётся оборудование без накладных и прочих документов о приеме сдаче оборудования, а потом, когда волна приёма сотрудников заканчивается, бухгалтерия, или ещё какой-нибудь ответственный за это дело отдел, начинает задавать неинтересные вопросы. А сколько у нас всего ПК, ноутбуков, нетбуков и всего того что может подключаться к сети и использоваться как рабочая станция?



Снова чертим на полу пентаграмму и призываем всесильный 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 не имеет ничего общего с настоящим. Плюс некоторые производители могут хранить серийники мониторов в другом месте.

Комментариев нет:

Отправить комментарий