Загрузить файлы в «/»

Собирает информацию об оборудовании пользовательского компьютера
This commit is contained in:
2026-02-26 08:16:33 +00:00
commit 1a0d93d89e

344
Get-FullHWInventory.ps1 Normal file
View File

@@ -0,0 +1,344 @@
# 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