Что нового

Аналог System Information

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Версия AutoIt: 3.3.8.1

Описание: Нужен готовый скрипт который будет получать ту же информацию, что мы можем увидеть в System Information (Пуск - в поиске набрать msinfo32 - Сведения о системе).

Примечания: В какой форме оно будет получать особо не важно, пусть в массиве, или в строке, использоваться позже будет для разных целей.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Какую конкретно информацию Вам надо получить? У меня на Win7, если запустить
Код:
$iTimer = TimerInit()
$iPid = Run('"' & @SystemDir & '\msinfo32.exe"' & ' "/report"' & ' "' & @ScriptDir & '\info.txt"')
While ProcessExists($iPid)
	Sleep(250)
WEnd
ConsoleWrite(TimerDiff($iTimer) & @LF)
то через 140-150 секунд создается файл с системной информацией размером 966716 байт (а на WinXP у меня это не работает, я в ней не нашел msinfo32.exe). В принципе, этот файл можно парсить, но, скорей всего, вся информация не нужна.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
---Zak---,
Спасибо, не знал. :-[
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
madmasles
на WinXP у меня это не работает
Я чуть подправил Ваш скрипт. Проверил, на XP работает.
Вот только ждать надо ...
Код:
ShellExecuteWait("msinfo32.exe"," /report C:\info.txt")
ShellExecute("C:\info.txt")
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Какую конкретно информацию Вам надо получить?
С главной страницы (Сведения о системе).

через 140-150 секунд создается файл с системной информацией
Слишком долго, и к тому же мне это нужно сделать скрытно (в фоне).
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Я в курсе :smile:.

Я не ошибся разделом когда создал тему в Стол заказов :whistle:.
У меня сейчас туго со временем, поэтому нужен готовый вариант.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
С форматом ответа можно повозиться. Но вроде вся инфа собрана.
Код:
$objWMIService = ObjGet("winmgmts:\\localhost\root\CIMV2")


$vProcessor = _GetInfo('Name,CurrentClockSpeed,NumberOfCores,NumberOfLogicalProcessors', 'Win32_Processor')
$vOS = _GetInfo('Caption,Manufacturer,Version,CSDVersion,BuildNumber,CSName,WindowsDirectory,SystemDirectory,SystemDevice,RegisteredUser', 'Win32_OperatingSystem')
$vBaseBoard = _GetInfo('Manufacturer,Product', 'Win32_BaseBoard')
$vBios = _GetInfo('Manufacturer,SMBIOSBIOSVersion,SMBIOSMajorVersion,SMBIOSMinorVersion,SMBIOSPresent,ReleaseDate', 'Win32_BIOS')
$vTimeZone = _GetInfo('StandardName', 'Win32_TimeZone')
$vPageFile = _GetInfo('Name', 'Win32_PageFile')


ConsoleWrite($vProcessor & @LF)
ConsoleWrite($vOS & @LF)
ConsoleWrite($vBaseBoard & @LF)
ConsoleWrite($vBios & @LF)
ConsoleWrite($vTimeZone & @LF)
ConsoleWrite($vPageFile & @LF)
ConsoleWrite(__memInfo() & @LF)


Func __memInfo()
	Local $aMem = MemGetStats()
	Local $sOut
	$sOut &= 'Общее количество физической памяти (RAM) = ' & $aMem[1] & @CRLF
	$sOut &= 'Доступное количество физической памяти (RAM) = ' & $aMem[2] & @CRLF
	$sOut &= 'Размер файла подкачки = ' & $aMem[3] & @CRLF
	$sOut &= 'Доступный размер файла подкачки = ' & $aMem[4] & @CRLF
	$sOut &= 'Всего виртуальной памяти = ' & $aMem[5] & @CRLF
	$sOut &= 'Доступно виртуальной памяти = ' & $aMem[6]
	Return $sOut
EndFunc   ;==>__memInfo

Func _GetInfo($sImems, $sFrom)
	Local $colItems = $objWMIService.ExecQuery("SELECT " & $sImems & " FROM " & $sFrom, "WQL", 0x30)
	If Not IsObj($colItems) Then Return SetError(1, 0, 0)
	Local $sOut = ''
	For $objItem In $colItems
		$sOut &= $objItem.GetObjectText_(0)
	Next
	Return $sOut
EndFunc   ;==>_GetInfo



Добавлено:
Сообщение автоматически объединено:

Все о памяти можно тоже из Win32_OperatingSystem доставать
Нужно добавить эти:
FreePhysicalMemory,FreeSpaceInPagingFiles,FreeVirtualMemory,TotalVirtualMemorySize,TotalVisibleMemorySize


Добавлено:
Сообщение автоматически объединено:

Язык системы можно тут же из Locale будет возвращено 0419, нужно будет преврать это в Россия


Добавлено:
Сообщение автоматически объединено:

С этим хз как:
Аппаратно-зависимый уровень (HAL) Версия = "6.1.7601.17514"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
Мой вариант.
Код:
#include <Array.au3>

Global $oWMI, $oItems, $oTmp, $aInfo[25][2], $aTmp, _
		$aOS[13][8] = [[12],['Имя ОС', '$oTmp.Caption', '', '', '', '', 0], _
		['Версия (версия, сервис-пак, сборка)', '$oTmp.Version', '$oTmp.CSDVersion', '$oTmp.BuildNumber', '', ', ', 1, 2], _
		['Дополнительное описание', '$oTmp.Description', '', '', '', '', 2], _
		['Изготовитель ОС', '$oTmp.Manufacturer', '', '', '', '', 3], _
		['Имя системы', '$oTmp.CSName', '', '', '', '', 4], _
		['Папка Windows', '$oTmp.WindowsDirectory', '', '', '', '', 11], _
		['Системная папка', '$oTmp.SystemDirectory', '', '', '', '', 12], _
		['Устройство загрузки', '$oTmp.BootDevice', '', '', '', '', 13], _
		['Язык системы', '_Language($oTmp.OSLanguage)', '', '', '', '', 14], _
		['Доступно физической памяти', '$oTmp.FreePhysicalMemory', '', '', '', '', 20], _
		['Всего виртуальной памяти', '$oTmp.TotalVirtualMemorySize', '', '', '', '', 21], _
		['Доступно виртуальной памяти', '$oTmp.FreeVirtualMemory', '', '', '', '', 22]], _
		$aCSP[3][8] = [[2],['Изготовитель', '$oTmp.Vendor', '', '', '', '', 5], _
		['Модель', '$oTmp.Name', '', '', '', '', 6]], _
		$aCS[4][8] = [[3],['Тип', '$oTmp.SystemType', '', '', '', '', 7], _
		['Имя пользователя', '$oTmp.UserName', '', '', '', '', 16], _
		['Полный объем физической памяти', '$oTmp.TotalPhysicalMemory', '', '', '', '', 19]], _
		$aP[2][8] = [[1],['Процессор(имя, системная шина - Мгц, ядер, логических процессоров)', 'StringStripWS($oTmp.Name, 4)', '$oTmp.MaxClockSpeed', '$oTmp.NumberOfCores', '$oTmp.NumberOfLogicalProcessors', ', ', 8, 2]], _
		$aB[3][8] = [[2],['Версия BIOS', '$oTmp.Manufacturer', '$oTmp.SMBIOSBIOSVersion', _
		'StringRegExpReplace($oTmp.ReleaseDate, "^(\d{4})(\d{2})(\d{2}).*", "$1/$2/$3")', '', ', ', 9, 2], _
		['Версия SMBIOS', '$oTmp.SMBIOSMajorVersion', '$oTmp.SMBIOSMinorVersion', '', '', '.', 10, 1]], _
		$aTZ[2][8] = [[1],['Часовой пояс', '$oTmp.StandardName', '', '', '', '', 17]], _
		$aPFU[3][8] = [[2],['Размер файла подкачки', '$oTmp.AllocatedBaseSize', '', '', '', '', 23], _
		['Файл подкачки', '$oTmp.Name', '', '', '', '', 24]], _
		$aPM[2][8] = [[1],['Установленная физическая память (RAM)', '$oTmp.Capacity', '', '', '', '+', 18]], _
		$aFrom[9][2] = [[8],['Win32_OperatingSystem', $aOS],['Win32_ComputerSystemProduct', $aCSP],['Win32_ComputerSystem', $aCS], _
		['Win32_Processor', $aP],['Win32_BIOS', $aB],['Win32_TimeZone', $aTZ],['Win32_PageFileUsage', $aPFU],['Win32_PhysicalMemory', $aPM]]

$oWMI = ObjGet('winmgmts:\\localhost\root\CIMV2')
If @error Then Exit 1

For $w = 1 To $aFrom[0][0]
	$oItems = $oWMI.ExecQuery('SELECT * FROM ' & $aFrom[$w][0], 'WQL', 0x30)
	If Not IsObj($oItems) Then Exit 2
	$aTmp = $aFrom[$w][1]
	For $oTmp In $oItems
		For $i = 1 To $aTmp[0][0]
			$aInfo[$aTmp[$i][6]][0] = $aTmp[$i][0]
			For $j = 1 To 4
				If Not $aTmp[$i][$j] Then ExitLoop
				$aInfo[$aTmp[$i][6]][1] &= Execute($aTmp[$i][$j]) & $aTmp[$i][5]
			Next
			If $aTmp[$i][7] Then $aInfo[$aTmp[$i][6]][1] = StringTrimRight($aInfo[$aTmp[$i][6]][1], $aTmp[$i][7])
		Next
	Next
;~ 	If $w = $aFrom[0][0] Then $aInfo[$aTmp[$i - 1][6]][1] = StringFormat('%.2f Gb', Execute($aInfo[$aTmp[$i - 1][6]][1] & '0') / 1024 ^ 3)
Next
;~ не нашел в WMI
$aInfo[15][0] = 'Аппаратно-зависимый уровень (HAL)(версия)'
$aInfo[15][1] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataAccess', 'Version')
$aInfo[18][1] = StringFormat('%.2f Gb', Execute($aInfo[18][1] & '0') / 1024 ^ 3)
$aInfo[19][1] = StringFormat('%.2f Gb', $aInfo[19][1] / 1024 ^ 3)
For $i = 20 To 22
	$aInfo[$i][1] = StringFormat('%.2f Gb', $aInfo[$i][1] / 1024 ^ 2)
Next
$aInfo[23][1] = StringFormat('%.2f Gb', $aInfo[23][1] / 1024)
_ArrayDisplay($aInfo)

Func _Language($i_Lang)
	Switch StringLower(Hex($i_Lang, 4))
		Case '0419', '0819'
			Return 'Русский'
		Case '0422'
			Return 'Украинский'
		Case '0423'
			Return 'Белорусский'
		Case '0437'
			Return 'Грузинский'
		Case '082c'
			Return 'Азербайджанский'
		Case '0443', '0843'
			Return 'Узбекский'
		Case '043f'
			Return 'Казахский'
		Case '0444'
			Return 'Татарский'
		Case '0440'
			Return 'Киргизский'
		Case '0413', '0813'
			Return 'Нидерландский'
		Case '0409', '0809', '0c09', '1009', '1409', '1809', '1c09', '2009', '2409', '2809', '2c09', '3009', '3409'
			Return 'Английский'
		Case '040c', '080c', '0c0c', '100c', '140c', '180c'
			Return 'Французский'
		Case '0407', '0807', '0c07', '1007', '1407'
			Return 'Немецкий'
		Case '0410', '0810'
			Return 'Итальянский'
		Case '0414', '0814'
			Return 'Норвежский'
		Case '0416', '0816'
			Return 'Португальский'
		Case '040a', '080a', '0c0a', '100a', '140a', '180a', '1c0a', '200a', '240a', '280a', '2c0a', '300a', '340a', '380a', '3c0a', '400a', '440a', '480a', '4c0a', '500a'
			Return 'Испанский'
		Case '041d', '081d'
			Return 'Шведский'
		Case Else
			Return 'Не удалось определить язык OS'
	EndSwitch
EndFunc   ;==>_Language
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Спасибо за варианты, но инфа немного не соответствует...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Устройство загрузки у меня показывает \Device\HarddiskVolume4, а в "Сведения о системе" указано \Device\HarddiskVolume1.
Также Версия SMBIOS показывает 7.2, а должно быть 2.7.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR [?]
Также Версия SMBIOS показывает 7.2, а должно быть 2.7.
Поправил, это ошибка моя была. :-[
Устройство загрузки у меня показывает \Device\HarddiskVolume4, а в "Сведения о системе" указано \Device\HarddiskVolume1.
Поменял $oTmp.SystemDevice на $oTmp.BootDevice.
Перевел все значения памяти в Гб. Сейчас у меня на Win7x86 и WinXPx86 все значения совпадают.
Код в посте выше.

PS
На WinXPx86 Аппаратно-зависимый уровень (HAL) и Размер файла подкачки не совпадают. :(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у меня все поля заполнены правильно кроме двух: о доступности физической и виртуальной памяти..разница небольшая. вся остальная инфа совпадает
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
madmasles
madmasles сказал(а):
На WinXPx86 Аппаратно-зависимый уровень (HAL)

Думаю его проверять так:
В
Код:
@SystemDir
искать либо Halmps.dll либо Hal.dll либо Halapic.dll либо Halacpi.dll в зависимости от ОС
Код:
$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
$CIM = 'CIM_DataFile.Name="c:\\windows\\system32\\hal.dll"'
$Instance = $objWMIService.Get($CIM)
ConsoleWrite($Instance.Version&@LF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Прошу сравнить информацию из msinfo32.exe с тем, что возвратят эти функции на разных системах и разных компьютерах/ноутбуках.
Код:
;~ #include <Array.au3>

ConsoleWrite('Hal Version: ' & _Get_Hal_Version() & @LF)
ConsoleWrite('---' & @LF)
$aInfo = _Get_Manufacturer()
;~ _ArrayDisplay($aInfo)
For $i = 0 To 3
	For $j = 0 To 2
		ConsoleWrite(StringFormat('%-40s', $aInfo[$i][$j]))
	Next
	ConsoleWrite(@LF)
Next

Func _Get_Hal_Version()
	Local $h_Search, $s_File, $s_Version = 'Not available'

	$h_Search = FileFindFirstFile(@SystemDir & '\hal*.dll')
	If $h_Search = -1 Then Return $s_Version
	While 1
		$s_File = FileFindNextFile($h_Search)
		If @error Then ExitLoop
		$s_Version = FileGetVersion(@SystemDir & '\' & $s_File)
		If Not @error Then ExitLoop
	WEnd
	FileClose($h_Search)
	Return $s_Version
EndFunc   ;==>_Get_Hal_Version


Func _Get_Manufacturer()
	Local $o_WMI, $o_Items, $a_Exec[4][2] = [[3],['Win32_ComputerSystem', 'Manufacturer,Model'],['Win32_ComputerSystemProduct', 'Vendor,Name'], _
			['Win32_BaseBoard', 'Manufacturer,Product']], $a_Ret[4][3] = [['FROM Win32_*', 'Manufacturer', 'Model']], $a_Tmp, $o_Tmp

	$o_WMI = ObjGet('winmgmts:\\localhost\root\CIMV2')
	If @error Then Return SetError(-1, 0, -1)
	For $i = 1 To $a_Exec[0][0]
		$a_Ret[$i][0] = $a_Exec[$i][0]
		$o_Items = $o_WMI.ExecQuery('SELECT ' & $a_Exec[$i][1] & ' FROM ' & $a_Exec[$i][0], 'WQL', 0x30)
		If Not IsObj($o_Items) Then ContinueLoop
		$a_Tmp = StringSplit($a_Exec[$i][1], ',')
		For $o_Tmp In $o_Items
			For $j = 1 To $a_Tmp[0]
				$a_Ret[$i][$j] = Execute('$o_Tmp.' & $a_Tmp[$j])
			Next
		Next
	Next
	Return $a_Ret
EndFunc   ;==>_Get_Manufacturer
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
У меня на server 2003 msinfo пишет:
Аппаратно-зависимый уровень (HAL) Версия="5.2.3790.3959 (srv03_sp2_rtm.070216-1710)"

Dll это hal.dll
Дополнительный сведения:
Версия продукта: 5.2.3790.3959
Версия файла: 5.2.3790.3959 (srv03_sp2_rtm.070216-1710)

А FileGetVersion возвратила 5.2.3790.3959
Значит нужно менять на FileGetVersion(@SystemDir & '\hal.dll','FileVersion')


Добавлено:
Сообщение автоматически объединено:

madmasles
Странный конечно у вас способ поиска. :smile: Первым всегда будет находится hal.dll, но это не факт что система использует именно его, это только показывает, что файл такой есть.
 
Верх