# Get-FullHWInventory.ps1 - ВЕРСИЯ ДЛЯ СОХРАНЕНИЯ В XML! # Переменные $Computer = $env:COMPUTERNAME $User = $env:USERNAME $Date = Get-Date -Format "yyyy-MM-dd HH:mm:ss" Write-Host "Собираем информацию о системе для $Computer..." -ForegroundColor Yellow # Функция для получения установленного ПО function Get-InstalledSoftware { $software = @() # Из реестра (32-bit и 64-bit программы) $paths = @( "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" ) foreach ($path in $paths) { if (Test-Path $path) { $software += Get-ItemProperty $path | Where-Object { $_.DisplayName -and $_.DisplayName -notlike "*Update for*" -and $_.DisplayName -notlike "*KB*" } | Select-Object @{Name="Name";Expression={$_.DisplayName}}, @{Name="Version";Expression={$_.DisplayVersion}}, @{Name="Publisher";Expression={$_.Publisher}}, @{Name="InstallDate";Expression={$_.InstallDate}}, @{Name="UninstallString";Expression={$_.UninstallString}} } } # Сортируем и возвращаем return ($software | Sort-Object Name | Select-Object -First 100) } # Функция для получения сервисов function Get-ServiceInfo { return (Get-Service | Where-Object { $_.Status -eq "Running" } | Select-Object Name, DisplayName, Status | Sort-Object Name) } # Функция для получения процессов function Get-ProcessInfo { return (Get-Process | Select-Object Name, CPU, WorkingSet, StartTime | Sort-Object CPU -Descending | Select-Object -First 50) } # Сбор основной информации о системе Write-Host "Сбор информации об оборудовании..." -ForegroundColor Yellow $CS = Get-WmiObject -Class Win32_ComputerSystem $OS = Get-WmiObject -Class Win32_OperatingSystem $Proc = Get-WmiObject -Class Win32_Processor $RAM = [math]::Round($CS.TotalPhysicalMemory / 1GB, 2) $Motherboard = Get-WmiObject -Class Win32_BaseBoard $BIOS = Get-WmiObject -Class Win32_BIOS # Сбор информации о дисках $diskList = @() $disks = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" foreach ($disk in $disks) { $diskInfo = [PSCustomObject]@{ Drive = $disk.DeviceID SizeGB = [math]::Round($disk.Size/1GB, 0) FreeSpaceGB = [math]::Round($disk.FreeSpace/1GB, 0) FileSystem = $disk.FileSystem VolumeName = $disk.VolumeName } $diskList += $diskInfo } # Физические диски $physicalDiskList = @() $physDisks = Get-WmiObject -Class Win32_DiskDrive foreach ($physDisk in $physDisks) { $physDiskInfo = [PSCustomObject]@{ Model = $physDisk.Model SizeGB = [math]::Round($physDisk.Size/1GB, 0) InterfaceType = $physDisk.InterfaceType SerialNumber = $physDisk.SerialNumber } $physicalDiskList += $physDiskInfo } # Видеокарта $videoList = @() $videoCards = Get-WmiObject -Class Win32_VideoController foreach ($video in $videoCards) { $videoInfo = [PSCustomObject]@{ Name = $video.Name RAM = if ($video.AdapterRAM) { [math]::Round($video.AdapterRAM/1MB, 0) } else { 0 } DriverVersion = $video.DriverVersion RefreshRate = $video.CurrentRefreshRate } $videoList += $videoInfo } # Сетевые адаптеры $networkList = @() $netAdapters = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true } foreach ($netAdapter in $netAdapters) { $netName = (Get-WmiObject -Class Win32_NetworkAdapter | Where-Object { $_.Index -eq $netAdapter.Index }).Name $networkInfo = [PSCustomObject]@{ Name = $netName IPAddress = $netAdapter.IPAddress -join ", " MACAddress = $netAdapter.MACAddress DHCPEnabled = $netAdapter.DHCPEnabled DNSServers = $netAdapter.DNSServerSearchOrder -join ", " } $networkList += $networkInfo } # Мониторы $monitorList = @() try { $monitors = Get-WmiObject -Class WmiMonitorID -Namespace root\wmi -ErrorAction SilentlyContinue foreach ($monitor in $monitors) { $manufacturer = if ($monitor.ManufacturerName) { [System.Text.Encoding]::ASCII.GetString($monitor.ManufacturerName -ne 0) } else { "Unknown" } $name = if ($monitor.UserFriendlyName) { [System.Text.Encoding]::ASCII.GetString($monitor.UserFriendlyName -ne 0) } else { "Unknown" } $serial = if ($monitor.SerialNumberID) { [System.Text.Encoding]::ASCII.GetString($monitor.SerialNumberID -ne 0) } else { "Unknown" } $monitorInfo = [PSCustomObject]@{ Manufacturer = $manufacturer Name = $name SerialNumber = $serial YearOfManufacture = $monitor.YearOfManufacture } $monitorList += $monitorInfo } } catch { Write-Host "⚠️ Не удалось получить информацию о мониторах" -ForegroundColor Yellow } # Принтеры $printerList = @() $printers = Get-WmiObject -Class Win32_Printer | Where-Object { $_.Name -notlike "*Microsoft*" -and $_.Name -notlike "*OneNote*" -and $_.Name -notlike "*Fax*" -and $_.Name -notlike "*XPS*" } foreach ($printer in $printers) { $printerInfo = [PSCustomObject]@{ Name = $printer.Name Default = $printer.Default Network = $printer.Network DriverName = $printer.DriverName PortName = $printer.PortName Shared = $printer.Shared } $printerList += $printerInfo } # USB устройства $usbList = @() try { $usbDevices = Get-WmiObject -Class Win32_USBControllerDevice | ForEach-Object { [wmi]($_.Dependent) } $uniqueUSB = $usbDevices | Where-Object { $_.Name -and $_.Name -notlike "*USB Root Hub*" -and $_.Name -notlike "*Generic USB Hub*" } | Select-Object -Unique Name, Description, Manufacturer foreach ($device in $uniqueUSB) { $usbInfo = [PSCustomObject]@{ Name = $device.Name Description = $device.Description Manufacturer = $device.Manufacturer } $usbList += $usbInfo } } catch { Write-Host "⚠️ Не удалось получить информацию о USB устройствах" -ForegroundColor Yellow } # Клавиатуры и мыши $mouseList = @() $mice = Get-WmiObject -Class Win32_PointingDevice foreach ($mouse in $mice) { $mouseInfo = [PSCustomObject]@{ Name = $mouse.Name Manufacturer = $mouse.Manufacturer HardwareType = $mouse.HardwareType NumberOfButtons = $mouse.NumberOfButtons } $mouseList += $mouseInfo } $keyboardList = @() $keyboards = Get-WmiObject -Class Win32_Keyboard foreach ($keyboard in $keyboards) { $keyboardInfo = [PSCustomObject]@{ Name = $keyboard.Name Description = $keyboard.Description } $keyboardList += $keyboardInfo } # Установленное ПО Write-Host "Сбор информации об установленном ПО..." -ForegroundColor Yellow $InstalledSoftware = Get-InstalledSoftware # Сервисы Write-Host "Сбор информации о сервисах..." -ForegroundColor Yellow $Services = Get-ServiceInfo # Процессы Write-Host "Сбор информации о процессах..." -ForegroundColor Yellow $Processes = Get-ProcessInfo # Создаем главный объект со всей информацией $Inventory = [PSCustomObject]@{ # Информация о сборе ScanInfo = [PSCustomObject]@{ Date = $Date ComputerName = $Computer UserName = $User ScanVersion = "1.0" } # Системная информация SystemInfo = [PSCustomObject]@{ Manufacturer = $CS.Manufacturer Model = $CS.Model SerialNumber = $BIOS.SerialNumber Motherboard = "$($Motherboard.Manufacturer) $($Motherboard.Product)" BIOSVersion = $BIOS.SMBIOSBIOSVersion BIOSDate = $BIOS.ReleaseDate } # Процессоры Processors = $Proc | ForEach-Object { [PSCustomObject]@{ Name = $_.Name Cores = $_.NumberOfCores LogicalProcessors = $_.NumberOfLogicalProcessors MaxClockSpeed = $_.MaxClockSpeed Socket = $_.SocketDesignation } } # Оперативная память RAM = @{ TotalGB = $RAM # Можно добавить информацию по каждому модулю } # Диски LogicalDisks = $diskList PhysicalDisks = $physicalDiskList # Видеокарты VideoCards = $videoList # Сеть NetworkAdapters = $networkList # Периферия Peripherals = [PSCustomObject]@{ Monitors = $monitorList Printers = $printerList Keyboards = $keyboardList Mice = $mouseList USBDevices = $usbList } # Операционная система OperatingSystem = [PSCustomObject]@{ Name = $OS.Caption Version = $OS.Version Architecture = $OS.OSArchitecture InstallDate = $OS.InstallDate LastBootTime = $OS.LastBootUpTime RegisteredUser = $OS.RegisteredUser Organization = $OS.Organization SerialNumber = $OS.SerialNumber } # Установленное ПО InstalledSoftware = $InstalledSoftware # Сервисы Services = $Services # Процессы Processes = $Processes } # СОХРАНЯЕМ В XML Write-Host "Сохранение данных в XML..." -ForegroundColor Yellow try { # Создаем папку, если её нет $saveDir = "C:\ProgramData\Inventory" if (-not (Test-Path $saveDir)) { New-Item -ItemType Directory -Path $saveDir -Force | Out-Null } # Формируем имя файла с датой $dateStr = Get-Date -Format "yyyyMMdd_HHmmss" $savePath = "$saveDir\Inventory_${Computer}_${dateStr}.xml" # Сохраняем в XML $Inventory | Export-Clixml -Path $savePath -Depth 5 Write-Host "✅ Данные успешно сохранены в: $savePath" -ForegroundColor Green Write-Host " Размер файла: $([math]::Round((Get-Item $savePath).Length/1KB, 2)) KB" -ForegroundColor Green # Создаем симлинк или копию с постоянным именем для удобства $latestPath = "$saveDir\Inventory_$Computer-latest.xml" if (Test-Path $latestPath) { Remove-Item $latestPath -Force } Copy-Item $savePath -Destination $latestPath Write-Host " 📎 Последняя версия: $latestPath" -ForegroundColor Cyan } catch { Write-Host "❌ Ошибка при сохранении XML: $_" -ForegroundColor Red # Пробуем сохранить в корень C:\ try { $savePath = "C:\Inventory_${Computer}_$(Get-Date -Format 'yyyyMMdd_HHmmss').xml" $Inventory | Export-Clixml -Path $savePath -Depth 5 Write-Host "✅ Данные сохранены в: $savePath" -ForegroundColor Yellow } catch { Write-Host "❌ Критическая ошибка сохранения: $_" -ForegroundColor Red } } # Показываем статистику Write-Host "`n📊 Статистика сбора:" -ForegroundColor Cyan Write-Host " - Программ установлено: $($Inventory.InstalledSoftware.Count)" -ForegroundColor White Write-Host " - Сервисов запущено: $($Inventory.Services.Count)" -ForegroundColor White Write-Host " - Процессов: $($Inventory.Processes.Count)" -ForegroundColor White Write-Host " - Дисков: $($Inventory.LogicalDisks.Count)" -ForegroundColor White Write-Host " - Сетевых адаптеров: $($Inventory.NetworkAdapters.Count)" -ForegroundColor White Write-Host " - USB устройств: $($Inventory.Peripherals.USBDevices.Count)" -ForegroundColor White Write-Host "`n✅ Готово!" -ForegroundColor Green