Загрузить файлы в «/»
Собирает информацию об оборудовании пользовательского компьютера
This commit is contained in:
344
Get-FullHWInventory.ps1
Normal file
344
Get-FullHWInventory.ps1
Normal 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
|
||||||
Reference in New Issue
Block a user