Назад | Перейти на главную страницу

Inventory VBScript не загружает атрибуты процессора или RAM

Я работал над VBscript, вдохновленным этими сообщениями: http://deployhappiness.com/series/creating-an-inventory-with-active-directory/ и я обнаружил приличный успех в моих тестовых машинах с записями «Производитель», «Модельный ряд», «MTM» и «Серийный номер». При этом я наткнулся на кирпичную стену при загрузке имени процессора и установке физической памяти в настраиваемые атрибуты (атрибуты AD, такие как «RAM», «процессор» и т. Д.), Которые я настроил. Всем машинам, используемым для тестирования этих сценариев, были предоставлены соответствующие разрешения SELF для записи в эти атрибуты с использованием сценариев, и я тестирую их локально на каждой машине, прежде чем помещать их в сценарий входа в сеть.

Код, который я пытался использовать для обоих, выглядит примерно так, и я проконсультировался с WMIExplorer для получения рекомендаций, но без особого успеха в том, чтобы заставить эти два сценария работать:

strprocessor= GetCPU
updatecpu(strprocessor)
Function GetCPU
strcomputer = "."
set objWMIService = GetObject("winmgmts:" _
                & "{impersonationLevel=impersonate}!\\" & strcomputer & "root\cimv2")
                set colprocessors = objWMIservice.ExecQuery _
                ("Select * from Win32_Processor")
                For each objprocessor in colprocessors
                GetCPU= objprocessor.name
                Next
End Function
Sub Updatecpu(strprocessor)
Set objSysInfo = CreateObject("ADSystemInfo")
On Error Resume Next
Set objComputer = GetObject ("LDAP://" & objSysInfo.ComputerName)
objProcessor.name = strprocessor
objComputer.SetInfo
End Sub

И функция памяти:

   strRAM= GetRAM
    updateRAM(strRAM)

    Function GetRAM
    strComputer = "*"
        Set objWMIService = GetObject("winmgmts:" _ 
        & "{impersonationLevel=impersonate} !\\" & strcomputer & "root\cimv2")
        set colcomputersystem = objWMIService.ExecQuery _ 
        ("Select * from Win32_Computersystem")
        For each objcomputersystem in colcomputersystem
        GetRAM= objcomputersystem.totalphysicalmemory
        Next
    End Function        
Sub UpdateRAM(strRAM)
            Set objSysInfo = CreateObject ("ADSystemInfo")
            On Error Resume Next
            Set objComputer = GetObject ("LDAP://" & objSysInfo.ComputerName)
            objcomputersystem.totalphysicalmemory = strRAM
            objComputer.SetInfo
        End Sub

В отличие от этого компонент производителя, который работал, был отформатирован почти идентично:

Strmanufacturer = getmanufacturer
updatemanufacturer(strmanufacturer)
Function Getmanufacturer   
        strComputer = "."   
        Set objWMIService = GetObject("winmgmts:" _   
            & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")   
        Set colcomputersystem = objWMIService.ExecQuery _   
            ("Select * from Win32_computersystem")   
        For each objcomputersystem in colcomputersystem   
                Getmanufacturer = objcomputersystem.manufacturer 
        Next   
End Function   
Sub Updatemanufacturer(strmanufacturer)
Set objSysInfo = CreateObject("ADSystemInfo")
On Error Resume Next
Set objComputer = GetObject("LDAP://" & objSysInfo.ComputerName)
objComputer.manufacturer = strmanufacturer
objComputer.SetInfo
End Sub

я знать Мне пришлось испортить здесь категорию obj или col, но я еще не смог это понять. Какие-либо предложения?

Сначала используйте

Отладьте свой скрипт, используя On Error GoTo 0 следующим образом:

Sub Updatecpu(strprocessor)
On Error GoTo 0          ' don't continue in case of severe error
Set objSysInfo = CreateObject("ADSystemInfo")
''' On Error Resume Next
Set objComputer = GetObject ("LDAP://" & objSysInfo.ComputerName)
objProcessor.name = strprocessor
objComputer.SetInfo
End Sub

С участием On Error Resume Next вы должны установить хотя бы базовую обработку ошибок, чтобы сделать общедоступными коды и сообщения о случайных ошибках:

Sub Updatecpu(strprocessor)
On Error GoTo 0          ' don't continue in case of severe error
Set objSysInfo = CreateObject("ADSystemInfo")
Set objComputer = GetObject ("LDAP://" & objSysInfo.ComputerName)

On Error Resume Next     ' continue, I use my own error handling approach
objProcessor.name = strprocessor
If Err.Number <> 0  Then
    msgbox "error 0x" & Hex( Err.Number) & " " & CStr( Err.Number) _
         & " >" & Err.Description & "< " & Err.Source
End If

Err.Clear                ' clear the Err object after an error has been handled
objComputer.SetInfo
If Err.Number <> 0  Then
    msgbox "error 0x" & Hex( Err.Number) & " " & CStr( Err.Number) _
       & " >" & Err.Description & "< " & Err.Source
End If

On Error Goto 0         ' return back to system error handling
End Sub

Например, на первый взгляд: objcomputersystem переменная имеет свою локальную область видимости в Getmanufacturer функция и не определена в Updatemanufacturer процедура; аналогично, objProcessor переменная имеет свою локальную область видимости в GetCPU функция и не определена в Updatecpu процедура ... Читать Переменные VBScript Статья MSDN.

Другой вопрос: ваш GetCPU функция вернет уникальное значение в случае мультипроцессор машина (последний элемент в colprocessors коллекция).

Обратите внимание, что я сохраняю свой ответ в VBScript тема; Я знаю ничего около ADSystemInfo свойства объекта и LDAP протокол.