WMI и VBScript - PullRequest
       1

WMI и VBScript

0 голосов
/ 19 декабря 2018

Редактирование исходного поста после многих попыток исправить скрипт.Последний сценарий в соответствии с Symantec по-прежнему не устраняет проблему с компьютером с TPM, не включенным в BIOS.Скрипт не выводит то, что было / сейчас в операторе if / else.Есть выход для ПК с включенным TPM и ничего для ПК, где он не включен.Все ссылки на сервер Altiris и запись в БД удалены.Это сейчас тестирование самого скрипта.

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer &    "\root\CIMV2    \Security\MicrosoftTpm")

If Err.number <> 0 Then
WScript.Echo "Error connecting to: " & strComputer
WScript.Echo "Setting Not Applicable when necessary"
Else
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Tpm", "WQL",     wbemFlagReturnImmediately + wbemFlagForwardOnly)

If Err.number <> 0 Then
WScript.Echo "Another Error"
End If

For each objInfo in colItems

WScript.Echo objInfo.IsActivated_InitialValue
WScript.Echo objInfo.IsEnabled_InitialValue
WScript.Echo objInfo.IsOwned_InitialValue
WScript.Echo objInfo.ManufacturerId
WScript.Echo objInfo.ManufacturerVersion
WScript.Echo objInfo.ManufacturerVersionInfo
WScript.Echo objInfo.PhysicalPresenceVersionInfo
WScript.Echo objInfo.SpecVersion
Next
End If

1 Ответ

0 голосов
/ 20 декабря 2018

Отредактировано: изменен ответ для соответствия отредактированному вопросу.Удаление кода Altiris.

Эй, я бы использовал следующий скрипт для получения необходимой информации.Это будет игнорировать ошибки при попытке получить информацию TPM через WMI.Поскольку класс Win32_Tpm является одноэлементным классом, он может иметь только один экземпляр (имя WMI для результатов в классе).Вы заметите, что указано с помощью Win32_Tpm=@.Когда этот код используется после имени класса, это означает возврат единственного экземпляра из этого класса.Когда вы это делаете, вам больше не нужен цикл For..Next, потому что может быть возвращен только один объект.

On Error Resume Next
Dim TPMProvider : Set TPMProvider = GetObject("winmgmts:\\.\root\cimv2\Security\MicrosoftTpm:Win32_Tpm=@")
Wscript.Echo "Error: " & Err.number
On Error Goto 0 'This is optional and turns errors back on

Wscript.Echo "VarType: " & VarType(TPMProvider)

If VarType(TPMProvider) <> 9 Then
    WScript.Echo "Setting Not Applicable when necessary"
Else
    WScript.Echo TPMProvider.IsActivated_InitialValue
    WScript.Echo TPMProvider.IsEnabled_InitialValue
    WScript.Echo TPMProvider.IsOwned_InitialValue
    WScript.Echo TPMProvider.ManufacturerId
    WScript.Echo TPMProvider.ManufacturerVersion
    WScript.Echo TPMProvider.ManufacturerVersionInfo
    WScript.Echo TPMProvider.PhysicalPresenceVersionInfo
    WScript.Echo TPMProvider.SpecVersion
End If

Некоторая дополнительная информация, которая может вам помочь, - это результаты err.number, которые наиболее вероятнои что означают эти ошибки.

Коды ошибок WMI (из https://docs.microsoft.com/en-us/windows/desktop/wmisdk/wmi-error-constants)

  • -2147217405 = WBEM_E_ACCESS_DENIED - Доступ запрещен: текущий пользователь не имеет разрешениядля выполнения действия.
  • -2147217406 = WBEM_E_NOT_FOUND - Невозможно найти объект
  • -2147217394 = WBEM_E_INVALID_NAMESPACE - Указанное пространство имен не найдено.
  • -2147217392_INAL_ID_ID_ID_WB =недопустимо
  • -2147217375 = WBEM_E_INVALID_SYNTAX - запрос синтаксически недопустим

Вы также заметите, что я использую VarType в сценарии.данные переменная TPMProvider. Мы хотим, чтобы это был «тип объекта» (номер 9), чтобы продолжить, потому что это то, что успешный WMЯ бы возражал как.Если VarType равен 0 или 1, то установка переменной была неудачной.

Функция VarType (из https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function)

vbEmpty             0       Empty (uninitialized)
vbNull              1       Null (no valid data)
vbInteger           2       Integer
vbLong              3       Long integer
vbSingle            4       Single-precision floating-point number
vbDouble            5       Double-precision floating-point number
vbCurrency          6       Currency value
vbDate              7       Date value
vbString            8       String
vbObject            9       Object
vbError             10      Error value
vbBoolean           11      Boolean value
vbVariant           12      Variant (used only with arrays of variants)
vbDataObject        13      A data access object
vbDecimal           14      Decimal value
vbByte              17      Byte value
vbLongLong          20      LongLong integer (valid on 64-bit platforms only)
vbUserDefinedType   36      Variants that contain user-defined types
vbArray             8192    Array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...