
Довольно часто нужно быстро, кратко, но информативно получить информацию о стационарном компьютере или ноутбуке, без дополнительного ПО и не «вскрывая крышку».
Это можно реализовать, например, средствами командной строки ОС Windows или PowerShell.
CMD — проверенный временем функционал, который есть в любой версии Windows.
Кроме того, для простых задач администрирования cmd использовать привычнее, а где-то и удобнее.
Что лучше — CMD или PowerShell? Я не готов однозначно ответить на этот вопрос.
Впрочем, ничто не мешает нам пользоваться и тем и другим, все зависит от поставленной задачи.
Мы не будем собирать всю информацию о ПК — для этого существует множество специализированного ПО!
Реализация с помощью CMD.
Сбор информации будем осуществлять использованием переменных среды Windows и выполнением сценариев WMI.
Для вывода всех переменных окружения в Windows и их значений служит команда set.
Для получения сведений об оборудовании и системе, управления процессами и их компонентами, а также изменения настроек с использованием возможностей инструментария управления Windows (Windows Management Instrumentation или WMI) служит команда WMIC.
Подсказку по работе с утилитой wmic.exe можно получить по команде:
- wmic /? — отобразить общую справку.
- wmic /?:BRIEF — отобразить краткую справку.
- wmic /?:FULL — отобразить полную справку.
Мы будем использовать:
- BASEBOARD (управление системной платой);
- COMPUTERSYSTEM (управление компьютером);
- CPU (управление ЦП);
- DISKDRIVE (управление физическими дисками);
- MEMORYCHIP (информация о микросхемах памяти).
Скрипт содержит много циклов с FOR.
Отличительной особенностью FOR /F является умение работать через токены, а также поддержка дополнительных ключевых слов:
- skip (пропуск определенного кол-ва обрабатываемых строк от начала файла);
- delims (задать другой разделитель(-ли), по умолчанию, пробел и знак табуляции);
- tokens (количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю). Также можно задать конкретный № токена, который попадет в первую переменную цикла;
- usebackq (изменение правил использования кавычек внутри IN (...)).
Ниже скрипт.
@echo off :имя файла для записи информации set fname=pcinfo.txt :имя компьютера Echo pcname: %computername% >>%fname% :IP-адрес компьютера по его имени FOR /F "usebackq tokens=2 delims=[]" %%i IN (`ping %Computername% -n 1 -4`) DO if not "%%i"=="" Set ip=%%i Echo IP %computername%: %ip% >>%fname% :имя активного пользователя Echo username: %username% >>%fname% :модель ноутбука set cmd=wmic computersystem get model for /f "skip=1 delims=" %%Z in ('%cmd%') do ( set _pn=%%Z GOTO BREAK1 ) :BREAK1 echo CS Model: %_pn% >>%fname% :процессор SETLOCAL ENABLEDELAYEDEXPANSION set mmr=0 for /f "skip=1 delims=" %%i in ('wmic cpu get name') do ( for /f "tokens=1-2 delims=" %%A in ("%%i") do ( set CPULbl=%%A set /a mmr=!mmr!+1 echo CPU !mmr!: !CPULbl! >>%fname% )) :материнская плата set cmd=wmic baseboard get product for /f "skip=1 delims=" %%Z in ('%cmd%') do ( set _mb=%%Z GOTO BREAK2 ) :BREAK2 echo MB: %_mb% >>%fname% :оперативная память SETLOCAL ENABLEDELAYEDEXPANSION set mmr=0 for /f "skip=1 delims=" %%i in ('WMIC MemoryChip get BankLabel^,DeviceLocator^,PartNumber^,Speed^,Capacity') do ( for /f "tokens=1-5 delims=" %%A in ("%%i") do ( set BnkLbl=%%A set /a mmr=!mmr!+1 echo Memory !mmr!: !BnkLbl! >>%fname% wmic MEMORYCHIP get banklabel, partnumber, capacity, speed, manufacturer )) :диски SETLOCAL ENABLEDELAYEDEXPANSION set mmr=0 for /f "skip=1 delims=" %%i in ('wmic diskdrive get model^,size') do ( for /f "tokens=1-2 delims=" %%A in ("%%i") do ( set HDDLbl=%%A set /a mmr=!mmr!+1 echo DISK !mmr!: !HDDLbl! >>%fname% ))
Реализация с помощью PowerShell.
В оболочке PowerShell, перед тем как запускать скрипт, нужно выполнить команду, разрешающую выполнение неподписанных скриптов для текущего сеанса оболочки:
Set-ExecutionPolicy RemoteSigned -Scope Process
Сбор информации будет осуществляться использованием в основном Get-WmiObject -Class win32, все просто, работа с циклами.
Мы будем использовать:
- Get-WmiObject -Class win32_processor;
- Get-WmiObject -Class win32_baseboard;
- Get-WmiObject Win32_PhysicalMemory;
- Get-PhysicalDisk;
- Get-WmiObject -Class Win32_ComputerSystem;
- Get-WmiObject Win32_NetworkAdapter;
- Win32_NetworkAdapterConfiguration.
Есть небольшие сложности при определении IP-адреса активной сетевой карты. Для этого применяем фильтр NetConnectionStatus — «2», после берем информацию mac-адрес от класса Win32_NetworkAdapter и IP-адрес из класса Win32_NetworkAdapterConfiguration и объединяем в один запрос:
PS C:\Users\admin> Get-WmiObject Win32_NetworkAdapter -Filter 'NetConnectionStatus=2' ServiceName : Qcamain10x64 MACAddress : 58:00:E3:7D:87:3F AdapterType : Ethernet 802.3 DeviceID : 1 Name : Qualcomm Atheros QCA61x4A Wireless Network Adapter NetworkAddresses : Speed : 144400000
Для получения параметров сети по MACAddress активной сетевой карты дополнительно считываем Win32_NetworkAdapterConfiguration.
Ниже скрипт.
#имя файла для записи информации $fname = "pcinfo.txt" $CPU = Get-WmiObject -Class win32_processor $MB = Get-WmiObject -Class win32_baseboard $MEM = Get-WmiObject Win32_PhysicalMemory $DD = Get-PhysicalDisk $pcn = Get-WmiObject -Class Win32_ComputerSystem #имя компьютера "pcname: "+$pcn.Name | Out-File -FilePath $fname -Append -Encoding Default #IP-адрес компьютера по его имени Get-WmiObject Win32_NetworkAdapter -Filter 'NetConnectionStatus=2' | ForEach-Object { $pcip = 1 | Select-Object IP $config = $_.GetRelated('Win32_NetworkAdapterConfiguration') $pcip.IP = $config | Select-Object -expand IPAddress $pcip } foreach($aip in $pcip) { "IP: "+$aip.IP | Out-File -FilePath $fname -Append -Encoding Default } #имя активного пользователя "username: "+$pcn.PrimaryOwnerName | Out-File -FilePath $fname -Append -Encoding Default #модель ноутбука "CS Model: "+$pcn.Model | Out-File -FilePath $fname -Append -Encoding Default #процессор $num = 0 foreach($processor in $CPU) { $num = $num+1 "CPU "+$num+": "+$processor.Name | Out-File -FilePath $fname -Append -Encoding Default } #материнская плата "MB: "+$MB.Product | Out-File -FilePath $fname -Append -Encoding Default #оперативная память $num = 0 foreach($memory in $MEM) { $num = $num+1 "MEMORY "+$num+": "+$memory.PartNumber+" "+$memory.Capacity+" "+$memory.Speed | Out-File -FilePath $fname -Append -Encoding Default } #диски $num = 0 foreach($disk in $DD) { $num = $num+1 "DISK "+$num+": "+$disk.FriendlyName+" "+$disk.Size+" "+$disk.MediaType | Out-File -FilePath $fname -Append -Encoding Default }
