Что нового

Получение информации о компьютере.

Detre

Новичок
Сообщения
70
Репутация
0
Код:
Всем привет товарищи. Возникла необходимость в написании программы для записи конфигурации компьютера в текстовый файл. Возникла проблема в исполнении скрипта(Первая часть работает по запуску кнопки, вторая часть при закрытии скрипта).Как сделать корректно?

Исходник:
Код:
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#RequireAdmin
#NoTrayIcon

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

Global $iKabina, $iType, $iKabina, $iModel, $iSerialNum, $iInv,  $sProcessor, $sMotherBoardManufacturer, $sMotherBoardModel, $sNameComput, $sProduct, $sBuild ;объявляем переменные, которые будут использоваться в цикле

$Main = GUICreate('Инвентаризация', 315, 352, 318, 213) ;рисуем главное окно
GUISetBkColor(0x02101B)
WinSetTrans($Main, "", 0)

For $i = 0 To 230 Step 2
    WinSetTrans($Main, "", $i) ;Прозрачность 0-255
Next

$iConnect = GUICtrlCreateButton("Передать", 23, 305, 267, 33) ;создаем кнопку подключения
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше

$iKabina = GUICtrlCreateInput("", 20, 30, 272, 21)
GUICtrlCreateLabel('Кабинет', 20, 10, 150, 17)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше
GUICtrlSetColor(-1, 0xDEDEDE)

$iType = GUICtrlCreateInput("", 20, 75, 272, 21)
GUICtrlCreateLabel('Тип', 20, 55, 150, 17)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше
GUICtrlSetColor(-1, 0xDEDEDE)

$iModel = GUICtrlCreateInput("", 20, 120, 272, 21)
GUICtrlCreateLabel('Модель', 20, 100, 150, 17)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше
GUICtrlSetColor(-1, 0xDEDEDE)

$iSerialNum = GUICtrlCreateInput("", 20, 165, 272, 21)
GUICtrlCreateLabel('Серийный номер', 20, 145, 150, 17)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше
GUICtrlSetColor(-1, 0xDEDEDE)

$iInv = GUICtrlCreateInput("", 20, 210, 272, 21)
GUICtrlCreateLabel('Инвентарник', 20, 190, 150, 17)
GUICtrlSetFont(-1, 10, 800, 0, "Tahoma") ;задаем стиль элементу выше
GUICtrlSetColor(-1, 0xDEDEDE)

$hFile = FileOpen(@ScriptDir & "\Inventarisation.txt" , 1)

GUISetState(@SW_SHOW)

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

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



While 1
   Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $iConnect
         $rKabina = GUICtrlRead($iKabina)
         $rType = GUICtrlRead($iType)
         $rModel = GUICtrlRead($iModel)
         $rSerialNum = GUICtrlRead($iSerialNum)
         $rInv = GUICtrlRead($iInv)



         If $rKabina = "" Then ;защита от пустого поля имени пк
            MsgBox(16+8192+262144,"Error","Поле Кабинет - пустое")
         Else
         If $rType = "" Then ;защита от пустого поля логина
            MsgBox(16+8192+262144,"Error","Поле Тип - пустое")
         Else
         If $rModel = "" Then ;защита от пустого поля логина
            MsgBox(16+8192+262144,"Error","Поле Модель - пустое")
         Else
         If $rSerialNum = "" Then ;защита от пустого поля логина
            MsgBox(16+8192+262144,"Error","Поле Серийный номер - пустое")
         Else
         If $rInv = "" Then ;защита от пустого поля логина
            MsgBox(16+8192+262144,"Error","Поле Инвентарник - пустое")
         Else
         If $hFile = -1 Then
            MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
                Else
                _hide() ;отключает все элементы ввода и кнопку
                FileWriteLine($hFile, "----------------------------------------------------------------------------------------------")
                FileWriteLine($hFile, "--------------------------------------МЕСТОПОЛОЖЕНИЕ------------------------------------------")
                FileWriteLine($hFile, "----------------------------------------------------------------------------------------------")
                FileWriteLine($hFile, "Кабинет:" & ' ' & $rKabina)
                FileWriteLine($hFile, "Тип:" & ' ' & $rType)
                FileWriteLine($hFile, "Модель:" & ' ' & $rModel)
                FileWriteLine($hFile, "Серийный номер:" & ' ' & $rSerialNum)
                FileWriteLine($hFile, "Инвентарный номер:" & ' ' & $rInv)
                FileWriteLine($hFile, "Учетная запись:" & ' ' & @UserName)
                FileWriteLine($hFile, "----------------------------------------------------------------------------------------------")
                FileWriteLine($hFile, "---------------------------------------КОНФИГУРАЦИЯ-------------------------------------------")
                FileWriteLine($hFile, "----------------------------------------------------------------------------------------------")
                FileClose($hFile)
                _show() ;включает все элементы ввода и кнопку
            EndIf
         EndIf
      EndIf
   EndIf
EndIf
   EndIf
   EndSwitch
WEnd


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

For $objItemMB In $ObjMB
   $MB = $objItemMB.Product
Next

For $objItemR In $ObjRam
   $RamTotal = $objItemR.TotalPhysicalMemory
Next

Dim $Proc[1][0], $i = 1
If IsObj($ObjProcessor) Then
   For $objItemP In $ObjProcessor
      ReDim $Proc[UBound($Proc) + 1][1]
      $Proc[$i][0] = "Процессор: " & $objItemP.Name
      $i += 1
   Next
   $Proc[0][0] = UBound($Proc) - 1
   If $Proc[0][0] < 1 Then
      SetError(1, 1, 0)
   EndIf
EndIf

Dim $aResults[$ObjMemory.Count][99]
$Count = 0
For $ObjItemM In $ObjMemory
   $aResultsS = $objItemM.Speed
   $Count += 1
Next

Dim $NetAdap[1][0], $i = 1
If IsObj($ObjNet) Then
   For $ObjItemN In $ObjNet
   If $ObjItemN.PhysicalAdapter = True Then
      ReDim $NetAdap[UBound($NetAdap) + 1][1]
      $NetAdap[$i][0] = "Сетевой адаптер: " & $ObjItemN.Name
      $i += 1
   EndIf
   Next
   $NetAdap[0][0] = UBound($NetAdap) - 1
   If $NetAdap[0][0] < 1 Then
      SetError(1, 1, 0)
   EndIf
EndIf

Dim $GraphAdap[1][0], $i = 1
If IsObj($ObjGraph) Then
   For $ObjItemG In $ObjGraph
      ReDim $GraphAdap[UBound($GraphAdap) + 1][1]
      $GraphAdap[$i][0] = 'Видеокарта: ' & $ObjItemG.Name & " | RAM: " & $ObjItemG.AdapterRAM /1024 ^2 & " Mb"
      $i += 1
   Next
   $GraphAdap[0][0] = UBound($GraphAdap) - 1
   If $GraphAdap[0][0] < 1 Then
      SetError(1, 1, 0)
   EndIf
EndIf

Dim $Drive[1][0], $i = 1
If IsObj($ObjDrive) Then
   For $ObjItemD In $ObjDrive
      ReDim $Drive[UBound($Drive) + 1][1]
      $Drive[$i][0] = "Жесткие диск: " & $ObjItemD.Model & " | Size: " & Round($ObjItemD.Size /1024 /1024 /1024) & " Gb"
      $i += 1
   Next
   $Drive[0][0] = UBound($Drive) - 1
   If $Drive[0][0] < 1 Then
      SetError(1, 1, 0)
   EndIf
EndIf

For $i = 1 To $Proc[0][0]
   LogIt($Proc[$i][0])
Next
LogIt("Материнская плата: " & $mb)
LogIt("RAM: " & Round($RamTotal / 1024 /1024 ^2, 0) & " GB | " & $ObjMemory.Count & " pieces | " & $aResultsS & " Mhz")
For $i = 1 To $GraphAdap[0][0]
   LogIt($GraphAdap[$i][0])
Next
For $i = 1 To $Drive[0][0]
   LogIt($Drive[$i][0])
Next
For $i = 1 To $NetAdap[0][0]
   LogIt($NetAdap[$i][0])
Next
Local $file = FileOpen($fFile, 1)
If $file = -1 Then Exit  MsgBox(0, "Error", "Unable to open file " & @ScriptDir & "\report.log")
FileWriteLine($file, "Имя компьютера:" & $sNameComput & @CRLF)
FileWriteLine($file, "Операционная система: " & $sProduct & " " & $sBuild & " " & @OsArch)
FileWriteLine($file, $sInfo)
FileWriteLine($file, "==============================================================================================")
FileClose($file)
$smail = 'Имя компьютера: ' & @ComputerName & @CRLF & FileRead($fFile)

Func LogIt($sText)
    $sInfo &= $sText & @CRLF
EndFunc
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Как сделать корректно?
Понятие "корректно" у всех разное, у меня к примеру такое:
Код:
#RequireAdmin
#NoTrayIcon

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

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

Global $iKabina, $iType, $iKabina, $iModel, $iSerialNum, $iInv ;объявляем переменные, которые будут использоваться в цикле
Global $rKabina, $rType, $rModel, $rSerialNum, $rInv, $Main, $iConnect, $hFile, $sInfo, $fFile = @ScriptDir & '\Inventarisation.txt'

$Main = GUICreate('Инвентаризация', 315, 352) ;рисуем главное окно
GUISetBkColor(0x02101B)

$iKabina = GUICtrlCreateInput('', 20, 30, 272, 21)
$iType = GUICtrlCreateInput('', 20, 75, 272, 21)
$iModel = GUICtrlCreateInput('', 20, 120, 272, 21)
$iSerialNum = GUICtrlCreateInput('', 20, 165, 272, 21)
$iInv = GUICtrlCreateInput('', 20, 210, 272, 21)

GUISetFont(10, 800, 0, 'Tahoma'); Устанавливает шрифт по умолчанию для последующих элементов GUI-окна.
$iConnect = GUICtrlCreateButton('Передать', 23, 305, 267, 33) ;создаем кнопку подключения

GUICtrlSetDefColor(0xDEDEDE); Устанавливает цвет текста по умолчанию для последующих элементов GUI-окна.
GUICtrlCreateLabel('Кабинет', 20, 10, 150, 17)
GUICtrlCreateLabel('Тип', 20, 55, 150, 17)
GUICtrlCreateLabel('Модель', 20, 100, 150, 17)
GUICtrlCreateLabel('Серийный номер', 20, 145, 150, 17)
GUICtrlCreateLabel('Инвентарник', 20, 190, 150, 17)

WinSetTrans($Main, '', 0)
GUISetState(@SW_SHOW)

For $i = 0 To 230 Step 9
    Sleep(10)
    WinSetTrans($Main, '', $i) ;Прозрачность 0-255
Next

$hFile = FileOpen(@ScriptDir & '\Inventarisation.txt', 1)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iConnect
            $rKabina = GUICtrlRead($iKabina)
            $rType = GUICtrlRead($iType)
            $rModel = GUICtrlRead($iModel)
            $rSerialNum = GUICtrlRead($iSerialNum)
            $rInv = GUICtrlRead($iInv)

            Select
                Case (Not StringStripWS($rKabina, 8))
                    MsgBox(16 + 8192 + 262144, 'Error', 'Поле Кабинет - пустое')
                Case (Not StringStripWS($rType, 8))
                    MsgBox(16 + 8192 + 262144, 'Error', 'Поле Тип - пустое')
                Case (Not StringStripWS($rModel, 8))
                    MsgBox(16 + 8192 + 262144, 'Error', 'Поле Модель - пустое')
                Case (Not StringStripWS($rSerialNum, 8))
                    MsgBox(16 + 8192 + 262144, 'Error', 'Поле Серийный номер - пустое')
                Case (Not StringStripWS($rInv, 8))
                    MsgBox(16 + 8192 + 262144, 'Error', 'Поле Инвентарник - пустое')
                Case $hFile = -1
                    MsgBox(4096, 'Ошибка', 'Невозможно открыть файл.')
                Case Else
                    _hide() ;отключает все элементы ввода и кнопку
                    $sInfo = '[МЕСТОПОЛОЖЕНИЕ:]' & @CRLF & _
                            @TAB & 'Время: .................. ' & @YEAR & '.' & @MON & '.' & @MDAY & ' ' & @HOUR & ':' & @MIN & ':'& @MSEC & @CRLF & _
                            @TAB & 'Кабинет: ................ ' & $rKabina & @CRLF & _
                            @TAB & 'Тип: .................... ' & $rType & @CRLF & _
                            @TAB & 'Модель: ................. ' & $rModel & @CRLF & _
                            @TAB & 'Серийный номер: ......... ' & $rSerialNum & @CRLF & _
                            @TAB & 'Инвентарный номер: ...... ' & $rInv & @CRLF & _
                            @TAB & 'Учетная запись: ......... ' & @UserName & @CRLF & @CRLF
                    $sInfo &= _InfoPC()
                    FileWrite($hFile, $sInfo)
                    FileClose($hFile)
                    _show() ;включает все элементы ввода и кнопку
            EndSelect
    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 $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 & 'Имя компьютера: ......... ' & $sNameComput & @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 & ' pieces | ' & $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 & ' | Size: ' & Round($ObjItemD.Size / 1024 / 1024 / 1024) & ' Gb' & @CRLF
        Next
        For $ObjItemN In $ObjNet
            If $ObjItemN.PhysicalAdapter = True Then
                $sInfo &= @TAB & 'Сетевой адаптер: ........ ' & $ObjItemN.Name & @CRLF
            EndIf
        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
 
Автор
Detre

Detre

Новичок
Сообщения
70
Репутация
0
Вот это я понимаю "причесанный" код, браво)
 
Верх