Что нового

Создание отчета конфигурации ПК

Detre

Новичок
Сообщения
69
Репутация
0
Доброго времени суток, хотел бы как поделиться скриптом(Помогали всем двором собирать на этом форуме :rofl:), так и с просьбой добавить новую фишку. Прикрутить отчет о подключенных принтерах как в команде PS Get-Printer | Format-List Name, PortName (Пытался аналогчно как с ОЗУ и мониторами, не получается....Решил снова обратиться к профессионалам). Заранее сердечно благодарю)

Исходник:
Код:
#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 & "\" & "(" & @ComputerName & ")" & ".txt"
$hFile = FileOpen(@ScriptDir & "\" & "(" & @ComputerName & ")" & ".txt", 1)

                    $sInfo &= _InfoPC()
                    $sInfo &= _InfoRAM()
                    FileWrite($hFile, $sInfo)
                    FileClose($hFile)


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 $ObjModel = $ObjService.ExecQuery('SELECT * FROM Win32_ComputerSystem')
    Local $ObjBIOS = $ObjService.ExecQuery('SELECT * FROM Win32_BIOS')
    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 $sVersion = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'DisplayVersion')
    Local $sBuild = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ReleaseId')
    Local $sItemM, $sItemMa, $sInfo = ''& @CRLF & '[КОНФИГУРАЦИЯ:] (' & @MDAY & "." & @MON & "." & @YEAR & ' - ' & @HOUR & ":" & @MIN & ":" & @SEC & ')' & @CRLF & @TAB & 'Имя компьютера............' & @ComputerName & @CRLF & @TAB &'Операционная система: ... ' & $sProduct & ' ' & $sVersion & ' ' & $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
            $sItemMa = $objItemM.Manufacturer
        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 | S\N:' & $ObjItemD.SerialNumber & '' & @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
         For $i = 0 to (ubound($ObjRam)/2)-1
            $sInfo &= @TAB & "1: ........  " & $i+1 & ": 1: " & $ObjRam[(2*$i)] & @CRLF
            $sInfo &= @TAB & "1: ........  " & $i+1 & ": 1: " & $ObjRam[(2*$i)+1] & @CRLF
        
         Next
          For $ObjItemModel In $ObjModel
             $sInfo &= @CRLF &'[Модель и серийный номер устройства:]' & @CRLF  
             $sInfo &= @TAB & 'Модель: ............... ' & $ObjItemModel.Model & @CRLF
         Next
         For $ObjItemBIOS In $ObjBIOS  
             $sInfo &= @TAB & 'Серийный номер: ............... ' & $ObjItemBIOS.SerialNumber & @CRLF
             $sInfo &= @CRLF &'[Мониторы:]' & @CRLF
         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)] & " |" & " Серийный номер: " & $aDisplayInfo[(2*$i)+1] & @CRLF
        Next
    EndIf
    $sInfo &= @CRLF
    Return $sInfo
EndFunc   ;==>_InfoPC


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 _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 = "[ОЗУ:]" & @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
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
 

Alecsis

Осваивающий
Сообщения
76
Репутация
29
Чисто для иллюстрации, без лишних наворотов как-то так:
Код:
Opt('MustDeclareVars', True)
Local _
  $oWMI,    _ ; объект WMI
  $oPrint,  _ ; коллекция объектов Printer
  $oItem,   _ ; тек. эоемент коллекции
  $iCount,  _ ; сч-к найденных принтеров
  $vTemp      ;
;
$oWMI   = ObjGet('winmgmts:\\.\root\cimv2')
$oPrint = $oWMI.ExecQuery('SELECT * FROM Win32_Printer', 'WQL', 0x30)
$iCount = 0
For $oItem In $oPrint
  $iCount += 1
  $vTemp = StringFormat("Printer #%u = '%s'\n", $iCount, $oItem.Name)
  ConsoleWrite($vTemp)
Next
If ($iCount = 0) Then ConsoleWrite('No printer installed')
Exit

Протокол запуска:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\_Debug\t.au3"     
Printer #1 = 'Microsoft XPS Document Writer'
Printer #2 = 'HP LaserJet P1006'
Printer #3 = 'HP Color LaserJet M750 PCL 6'
Printer #4 = 'Fax'
Printer #5 = 'Epson Stylus Pro 7890'
Printer #6 = 'EPSON Stylus Photo R800'
Printer #7 = 'doPDF v7'
Printer #8 = 'AnyDesk Printer'
>Exit code: 0    Time: 0.5978
 
Автор
Detre

Detre

Новичок
Сообщения
69
Репутация
0
Чисто для иллюстрации, без лишних наворотов как-то так:
Код:
Opt('MustDeclareVars', True)
Local _
  $oWMI,    _ ; объект WMI
  $oPrint,  _ ; коллекция объектов Printer
  $oItem,   _ ; тек. эоемент коллекции
  $iCount,  _ ; сч-к найденных принтеров
  $vTemp      ;
;
$oWMI   = ObjGet('winmgmts:\\.\root\cimv2')
$oPrint = $oWMI.ExecQuery('SELECT * FROM Win32_Printer', 'WQL', 0x30)
$iCount = 0
For $oItem In $oPrint
  $iCount += 1
  $vTemp = StringFormat("Printer #%u = '%s'\n", $iCount, $oItem.Name)
  ConsoleWrite($vTemp)
Next
If ($iCount = 0) Then ConsoleWrite('No printer installed')
Exit

Протокол запуска:
>"C:\DevTools\AutoIt3\SciTE\..\AutoIt3.exe"       /ErrorStdOut "D:\Alecsis\Prog\AutoIt\_Debug\t.au3"    
Printer #1 = 'Microsoft XPS Document Writer'
Printer #2 = 'HP LaserJet P1006'
Printer #3 = 'HP Color LaserJet M750 PCL 6'
Printer #4 = 'Fax'
Printer #5 = 'Epson Stylus Pro 7890'
Printer #6 = 'EPSON Stylus Photo R800'
Printer #7 = 'doPDF v7'
Printer #8 = 'AnyDesk Printer'
>Exit code: 0    Time: 0.5978
Доброго дня и огромное спасибо за Ваш труд и время. Я клянусь, пытался с умным видом впихнуть и адаптировать как под RAM или Display, притерпел фиаско. Я понимаю как работают все остальные пункты для выгрузки, но как Вы выстраиваете на повторное обращение объекта и как в конечном итоге правильно все совместить, вообще не понимаю :rofl:
 
Верх