Простая инвентаризация на VBScript

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

Лирика

В качестве языка программирования был выбран VBScript, как универсальное средство, одинаково хорошо работающее из коробки на всех версиях Windows от XP до 10. Чтобы собрать информацию о компьютере достаточно дергать систему за WMI и собирать ответы в файл. Для упрощения процесса Microsoft даже сделали утилиту WMI Code Creator которая помогает не только сориентироваться в WMI-классах, но и генерирует код запроса на одном из 3х поддерживаемых языков, включая VBScript.

Логика работы скрипта проста:

  • собираем и обрабатываем информацию о текущей машине;
  • проверяем и создаем csv-файл для хранения результата, если он отсутствует;
  • пишем собранную информацию в файл, если её там ещё нет.

Скрипт

Option Explicit

Dim ReportFile, strComputer, objWMIService, colItems, objItem, FS, File, Line
Dim ComputerName, Motherboard, Processor, Architecture, RAM, HDD, Display, OS

ReportFile  = "\\server\Share\Inventory\InventoryReport.csv"
strComputer = "." 

' Win32_ComputerSystem
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_ComputerSystem",,48) 
For Each objItem in colItems 
    ComputerName = objItem.Name
    Motherboard = objItem.Manufacturer & " " & objItem.Model
    Architecture = objItem.SystemType
Next
ComputerName = """" & ComputerName & """"
Motherboard = """" & Motherboard & """"
Architecture = """" & Architecture & """"

' Win32_Processor
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Processor",,48) 
For Each objItem in colItems 
    Processor = objItem.Name
Next
Processor = """" & Processor & """"

' Win32_PhysicalMemory
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_PhysicalMemory",,48) 
For Each objItem in colItems 
    RAM = RAM + Round(objItem.Capacity / (1024*1024*1024), 2)
Next
RAM = """" & RAM & "GB"""

' Win32_LogicalDisk
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_LogicalDisk where DriveType=3",,48) 
For Each objItem in colItems 
    HDD = HDD + Round(objItem.Size / (1024*1024*1024), 2)
Next
HDD = """" & HDD & "GB"""

' Win32_DesktopMonitor
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DesktopMonitor",,48) 
For Each objItem in colItems
    If isNull(objItem.ScreenWidth) Or isNull(objItem.ScreenHeight) Then
        Display = objItem.Description
    Else
        Display = objItem.Description & " (" & objItem.ScreenWidth & "x" & objItem.ScreenHeight & ")"
    End If
Next
Display = """" & Display & """"

' Win32_OperatingSystem
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_OperatingSystem",,48) 
For Each objItem in colItems 
    OS = objItem.Caption
Next
OS = """" & OS & """"

Line = ComputerName & "," & Motherboard & "," & Processor & "," & RAM & "," & HDD & "," & Display & "," & OS & "," & Architecture
Line = CutSpaces(Line)
'Wscript.Echo Line

' Write to file
Set FS = CreateObject("Scripting.FileSystemObject")
If Not FS.FileExists(ReportFile) then
    Set File = FS.CreateTextFile(ReportFile, False)
    File.Write "ComputerName,Motherboard,CPU,RAM,HDD,Display,OS,Architecture" & vbCrLf
Else
    ' Search for existing string
    Set File = FS.OpenTextFile(ReportFile)
    If InStr(File.ReadAll, Line) > 0 Then
        File.Close
        Wscript.Sleep 100
        WScript.Quit 1
    End If

    ' Reopen for appending
    File.Close
    Wscript.Sleep 100
    Set File = FS.OpenTextFile(ReportFile, 8, True) ' 8 - appending
End If

' Write to file
File.Write Line & vbCrLf
File.Close
WScript.Quit 0

Function CutSpaces (Input)
    Dim objRegEx
    Set objRegEx = CreateObject("VBScript.RegExp")
    objRegEx.Global = True
    objRegEx.Pattern = "\s+|\t+/ig"
    CutSpaces = objRegEx.Replace(Input, " ")
End Function

Средствами GPO устанавливаем этот скрипт на исполнение при входе пользователя в систему (хотелось бы, конечно, при выходе, но не работает) и получаем отчет о параметрах компьютеров в сети в одном csv-файле.

Пример отчета об инвентаризации

Profit!

Light Spirit Funky Solutions © 2010 ‒ 2024