Я работал над 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, но я еще не смог это понять. Какие-либо предложения?
Сначала используйте
Option Explicit
заявление всегда (если используется, Option Explicit
оператор должен появляться в сценарии перед любыми другими операторами) и On Error GoTo 0
заявление хотя бы для отладки.Отладьте свой скрипт, используя 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
протокол.