Что нового

Скрипт на отображение конфигурации компьютера. Прокачка скрипта на отображение оперативной памяти через WMI в .txt

DirtyJohny

Новичок
Сообщения
44
Репутация
0
Всем привет.Очень нужна помощь.Есть скриптец, который помогали собирать на этом форуме.(Отдельное спасибо lnnl и seestars). Я думаю это будет кому-то тоже полезно. Задача такая - нужно отображение информации по каждой плашке оперативки(В данный момент только суммарка по ним и это исходник 1) как видеокарты, жесткие диски, сетевухи и монитор. Есть нечто подобное(исходник 2). Пример написания в файле : RAM...................1: Слот: DIMM_A1...Память: 8GB....Марка: Kingston........S\N: KHX1600C10D3/8GB....Частота: 1600

Исходник 1
Код:
#RequireAdmin
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>

Opt("MustDeclareVars",1)

;Все что написано, после ';' является комментарием и ни как не влияет на работу скрипта.

Global $idComboBox  ;объявляем переменные, которые будут использоваться в цикле
Global  $hFile, $sInfo,$idComboBox ,$CopyBtn , $sComboRead, $fFile = @ScriptDir & "\" & "(" & @MDAY & "." & @MON & "." & @YEAR & ")" & ".txt"

$hFile = FileOpen(@ScriptDir & "\" & "(" & @MDAY & "." & @MON & "." & @YEAR & ")" & ".txt", 1)

While 1
    Switch GUIGetMsg()

                Case Else

                    $sInfo &= _InfoPC()
                    FileWrite($hFile, $sInfo)
                    FileClose($hFile)
    EndSwitch
WEnd


Func _InfoPC()
    Local $ObjService = ObjGet('winmgmts:{impersonationLevel = impersonate}!\\' & @ComputerName & '\root\cimv2')
    Local $ObjMB = $ObjService.ExecQuery('SELECT * FROM Win32_BaseBoard', 'WQL', 0x30)
    Local $ObjProcessor = $ObjService.ExecQuery('SELECT * FROM Win32_Processor', 'WQL', 0x30)
    Local $ObjMemory = $ObjService.ExecQuery('SELECT * FROM Win32_PhysicalMemory')
    Local $ObjNet = $ObjService.ExecQuery('SELECT * FROM Win32_NetworkAdapter', 'WQL', 0x30)
    Local $ObjGraph = $ObjService.ExecQuery('SELECT * FROM Win32_VideoController', 'WQL', 0x30)
    Local $ObjDrive = $ObjService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', 0x30)
    Local $ObjCDDrive = $ObjService.ExecQuery('SELECT * FROM Win32_CDROMDrive', 'WQL', 0x30)
    Local $ObjRam = $ObjService.ExecQuery('SELECT * FROM Win32_ComputerSystem')
    Local $sNameComput = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\DataStore\Machine\0', 'szTargetName')
    Local $sProduct = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName')
    Local $sBuild = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseId')

    Local $sItemM, $sInfo = '[КОНФИГУРАЦИЯ:]' & @CRLF & @TAB & 'Имя компьютера............' & @ComputerName & @CRLF & @TAB &'Операционная система: ... ' & $sProduct & ' ' & $sBuild & ' ' & '(' & @OSArch & ')' & @CRLF



    If IsObj($ObjService) Then
        For $objItemP In $ObjProcessor
            $sInfo &= @TAB & 'Процессор: .............. ' & $objItemP.Name & @CRLF
        Next
        For $objItemMB In $ObjMB
            $sInfo &= @TAB & 'Материнская плата: ...... ' & $objItemMB.Product & @CRLF
        Next
        For $ObjItemM In $ObjMemory
            $sItemM = $objItemM.Speed

        Next
        For $objItemR In $ObjRam
            $sInfo &= @TAB & 'RAM: .................... ' &  Round($objItemR.TotalPhysicalMemory / 1024 / 1024 ^ 2, 0) & ' GB | ' & $ObjMemory.Count & ' слот | ' & $sItemM & ' Mhz' & @CRLF
        Next
        For $ObjItemG In $ObjGraph
            $sInfo &= @TAB & 'Видеокарта: ............. ' & $ObjItemG.Name & ' | RAM: ' & $ObjItemG.AdapterRAM / 1024 ^ 2 & ' Mb' & @CRLF
        Next
        For $ObjItemD In $ObjDrive
            $sInfo &= @TAB & 'Жесткие диск: ........... ' & $ObjItemD.Model & ' | Объем: ' & Round($ObjItemD.Size / 1024 / 1024 / 1024) & ' Gb' & @CRLF
        Next
        For $ObjItemCD In $ObjCDDrive
            $sInfo &= @TAB & 'Дисковод: ............... ' & $ObjItemCD.Name & @CRLF
        Next
        For $ObjItemN In $ObjNet
            If $ObjItemN.PhysicalAdapter = True Then
                $sInfo &= @TAB & 'Сетевой адаптер: ........ ' & $ObjItemN.Name & @CRLF
             EndIf
         Next



    EndIf

    Local $aDisplayInfo = Display_Info()
    if $aDisplayInfo = "" then
        ConsoleWrite("$aDisplayInfo is not an array" & @crlf)
    Else
        for $i = 0 to (ubound($aDisplayInfo)/2)-1
            $sInfo &= @TAB & "Монитор: ........  " & $i+1 & ": Модель: " & $aDisplayInfo[(2*$i)] & @CRLF
            $sInfo &= @TAB & "Монитор: ........  " & $i+1 & ": Серийный номер: " & $aDisplayInfo[(2*$i)+1] & @CRLF
        Next
    EndIf

    $sInfo &= @CRLF

    Return $sInfo
EndFunc   ;==>_InfoPC

Func _hide() ;функция. отключает элементы ввода и кнопку, пока работает скрипт
    GUICtrlSetState($iConnect, $GUI_disable)
    GUICtrlSetState($iKabina, $GUI_disable)
    GUICtrlSetState($iType, $GUI_disable)
    GUICtrlSetState($iModel, $GUI_disable)
    GUICtrlSetState($iSerialNum, $GUI_disable)
    GUICtrlSetState($iInv, $GUI_disable)
EndFunc   ;==>_hide

Func _show() ;функция. включает элементы ввода и кнопку, когда скрипт отработал
    GUICtrlSetState($iConnect, $GUI_enable)
    GUICtrlSetState($iKabina, $GUI_enable)
    GUICtrlSetState($iType, $GUI_enable)
    GUICtrlSetState($iModel, $GUI_enable)
    GUICtrlSetState($iSerialNum, $GUI_enable)
    GUICtrlSetState($iInv, $GUI_enable)
 EndFunc   ;==>_show

Func _a()
Local $sls=ObjGet("winmgmts:{impersonationLevel=impersonate," _
&"authenticationLevel=Pkt}!\\"& _
@ComputerName&'\root\wmi'),$lss=$sls.ExecQuery _
('SELECT * FROM WmiMonitorID'), _
$lll,$sll,$sss="",$lsl,$lls,$i,$z
For $z In $lss
$lsl=$z.UserFriendlyName
For $i=0 To Ubound($lsl)-1
if ($lsl[$i]) Then $lll&=Chr($lsl[$i])
Next
$lls=$z.SerialNumberID
For $i=0 To Ubound($lls)-1
if ($lls[$i]) Then $sll&=Chr($lls[$i])
Next
$sss&="Модель"&@TAB&@TAB&":   "&$lll&@CR&"Серийный номер"&@TAB&":   "&$sll&@CR&@CR
$lll=""
$sll=""
Next

$lss=Null
$sls=Null
 $sInfo &= @CRLF
EndFunc



Func Display_Info()
    Local $oComErr, $oWmi, $oInstances

    $oComErr = ObjEvent("AutoIt.Error", comm_error_handler)
    #forceref $oComErr

    ;Get WMI object
    $oWmi = ObjGet("winmgmts:\root\WMI")
    If Not IsObj($oWmi) Then Exit MsgBox($MB_ICONERROR, "ERROR", "Unable to create WMI object")

    ;Select object instances
    $oInstances = $oWmi.ExecQuery("SELECT * FROM WMIMonitorID")
    If $oInstances.Count = 0 Then Exit MsgBox($MB_ICONWARNING,"Warning","No objects found")

    ; Changed part
    Local $aReturn[2] ; change number if you want to return more info
    Local $iDisplayCount = 1

    ;Display instance properties
    For $oInstance in $oInstances
        With $oInstance
            ConsoleWrite(@CRLF)
            if ubound($aReturn) < $iDisplayCount * 2 then redim $aReturn[2*$iDisplayCount]
            If IsArray(.UserFriendlyName) Then $aReturn[2*($iDisplayCount-1)] = convert_uint16_array_to_string(.UserFriendlyName) ;StringFormat("UserFriendlyName       = %s", convert_uint16_array_to_string(.UserFriendlyName))
            If IsArray(.SerialNumberId)   Then $aReturn[2*($iDisplayCount-1)+1] = convert_uint16_array_to_string(.SerialNumberId) ;StringFormat("SerialNumberId         = %s", convert_uint16_array_to_string(.SerialNumberId))
            $iDisplayCount += 1
        EndWith
    Next

    Return $aReturn

EndFunc

Func convert_uint16_array_to_string($aBytes)
    Local $s  = ""

    For $i in $aBytes
        If $i <> 0 Then $s &= Chr($i)
    Next

    Return $s
EndFunc

Func comm_error_handler($oComError)
    ConsoleWrite(@CRLF)
    ConsoleWrite(StringFormat("Script Line  = %s", $oComError.ScriptLine) & @CRLF)
    ConsoleWrite(StringFormat("Win Err Desc = %s", StringStripWS($oComError.WinDescription, $STR_STRIPTRAILING)) & @CRLF)
    ConsoleWrite(StringFormat("Error Number = %i (0x%x)", $oComError.Number, $oComError.Number) & @CRLF)
    ConsoleWrite(StringFormat("Error Desc   = %s", $oComError.Description) & @CRLF)
    Exit
EndFunc


Исходник 2

Код:
#Include<array.au3>

$objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
$colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
Dim $aResults[$colItems.Count][7]
$Count = 0
For $ObjItem In $colItems
    $aResults[$Count][0 ] = $objItem.Tag
    $aResults[$Count][1 ] = $objItem.BankLabel
    $aResults[$Count][2 ] = $ObjItem.Capacity / 1024^2
    $aResults[$Count][3 ] = $objItem.Manufacturer
    $aResults[$Count][4] = $objItem.PartNumber
    $aResults[$Count][5] = $objItem.DeviceLocator
    $aResults[$Count][6] = $objItem.Speed


    $Count +=1
Next

_ArrayDisplay($aResults, 'RAM Info')


Не требую написать все за меня .Хотя бы направить, как выполняется скрипт на последующее дополнение строк, я очень не опытен в этом деле. Заранее огромнейшее спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,548
Репутация
1,249
направить, как выполняется скрипт на последующее дополнение строк
Оформляете сбор информации отдельной функцией
Код:
Func _InfoRAM()
  Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
  If Not IsObj($objWMIService) Then Return "Ошибка получения информации RAM" & @CRLF
  Local $colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
  Local $infoRAM = "[RAM:]" & @CRLF
  For $ObjItem In $colItems
    $infoRAM &= @TAB & "Слот: ...... " & $objItem.DeviceLocator & @CRLF & _
                @TAB & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & "GB" & @CRLF & _
                @TAB & "Марка: ..... " & $objItem.Manufacturer & @CRLF & _
                @TAB & "S/N: ....... " & $objItem.PartNumber & @CRLF & _
                @TAB & "Частота: ... " & $objItem.Speed & @CRLF & @CRLF
  Next
  Return $infoRAM
EndFunc

Вызываете эту функцию там, где необходимо. Например, добавляете к общей информации
Код:
$hFile = FileOpen($fFile, 2)
$sInfo &= _InfoPC()
$sInfo &= _InfoRAM()
FileWrite($hFile, $sInfo)
FileClose($hFile)
 
Автор
DirtyJohny

DirtyJohny

Новичок
Сообщения
44
Репутация
0
Оформляете сбор информации отдельной функцией
Код:
Func _InfoRAM()
  Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
  If Not IsObj($objWMIService) Then Return "Ошибка получения информации RAM" & @CRLF
  Local $colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
  Local $infoRAM = "[RAM:]" & @CRLF
  For $ObjItem In $colItems
    $infoRAM &= @TAB & "Слот: ...... " & $objItem.DeviceLocator & @CRLF & _
                @TAB & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & "GB" & @CRLF & _
                @TAB & "Марка: ..... " & $objItem.Manufacturer & @CRLF & _
                @TAB & "S/N: ....... " & $objItem.PartNumber & @CRLF & _
                @TAB & "Частота: ... " & $objItem.Speed & @CRLF & @CRLF
  Next
  Return $infoRAM
EndFunc

Вызываете эту функцию там, где необходимо. Например, добавляете к общей информации
Код:
$hFile = FileOpen($fFile, 2)
$sInfo &= _InfoPC()
$sInfo &= _InfoRAM()
FileWrite($hFile, $sInfo)
FileClose($hFile)

Это просто волшебно, все доходчиво и как всегда прекрасно, только вопрос по портам, можно ли как-нибудь Channel
Оформляете сбор информации отдельной функцией
Код:
Func _InfoRAM()
  Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
  If Not IsObj($objWMIService) Then Return "Ошибка получения информации RAM" & @CRLF
  Local $colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
  Local $infoRAM = "[RAM:]" & @CRLF
  For $ObjItem In $colItems
    $infoRAM &= @TAB & "Слот: ...... " & $objItem.DeviceLocator & @CRLF & _
                @TAB & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & "GB" & @CRLF & _
                @TAB & "Марка: ..... " & $objItem.Manufacturer & @CRLF & _
                @TAB & "S/N: ....... " & $objItem.PartNumber & @CRLF & _
                @TAB & "Частота: ... " & $objItem.Speed & @CRLF & @CRLF
  Next
  Return $infoRAM
EndFunc

Вызываете эту функцию там, где необходимо. Например, добавляете к общей информации
Код:
$hFile = FileOpen($fFile, 2)
$sInfo &= _InfoPC()
$sInfo &= _InfoRAM()
FileWrite($hFile, $sInfo)
FileClose($hFile)
Как всегда сногшибательно и все понятно, огромнейший респект.Я адаптировал написание в док под себя)

Код:
$infoRAM &= @TAB & "Слот: ...... " & $objItem.DeviceLocator & "|" & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & " GB"  & "|" & "Марка: ..... " & $objItem.Manufacturer  & "|" & "Частота: ... " & $objItem.Speed & "|" & "S/N: ....... " & $objItem.PartNumber & @CRLF

Единственный вопрос: Как сделать нумерование как в отображании мониторов? Чтобы выглядело Слот 1, Слот 2?
 

InnI

AutoIT Гуру
Сообщения
4,548
Репутация
1,249
Чтобы выглядело Слот 1, Слот 2
Код:
Func _InfoRAM()
  Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
  If Not IsObj($objWMIService) Then Return "Ошибка получения информации RAM" & @CRLF
  Local $colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
  Local $i = 0, $infoRAM = "[RAM:]" & @CRLF
  For $ObjItem In $colItems
    $i += 1
    $infoRAM &= @TAB & "Слот " & $i & ": ...... " & $objItem.DeviceLocator & "|" & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & " GB"  & "|" & "Марка: ..... " & $objItem.Manufacturer  & "|" & "Частота: ... " & $objItem.Speed & "|" & "S/N: ....... " & $objItem.PartNumber & @CRLF
  Next
  Return $infoRAM
EndFunc
 
Автор
DirtyJohny

DirtyJohny

Новичок
Сообщения
44
Репутация
0
Код:
Func _InfoRAM()
  Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
  If Not IsObj($objWMIService) Then Return "Ошибка получения информации RAM" & @CRLF
  Local $colItems = $objWMIService.ExecQuery('Select * From Win32_PhysicalMemory')
  Local $i = 0, $infoRAM = "[RAM:]" & @CRLF
  For $ObjItem In $colItems
    $i += 1
    $infoRAM &= @TAB & "Слот " & $i & ": ...... " & $objItem.DeviceLocator & "|" & "Объём: ..... " & $ObjItem.Capacity / 1024^3 & " GB"  & "|" & "Марка: ..... " & $objItem.Manufacturer  & "|" & "Частота: ... " & $objItem.Speed & "|" & "S/N: ....... " & $objItem.PartNumber & @CRLF
  Next
  Return $infoRAM
EndFunc
Шикаааарно.Спасибо большое)
 
Верх