Провайдер WMI Trustmon для мониторинга доверительных отношений в Windows 2003
Управление доверительными отношениями в Windows - дело непростое. Утилита nltest.exe из Windows Resource Kit позволяет только удостовериться, что доверительные отношения установлены. Новый провайдер Trustmon, появившийся в Windows Server 2003, позволяет получать информацию о доверительных отношениях через интерфейс WMI. Таким образом пользовательское приложение, сценарий WSH, приложение Windows .NET Framework или система управления ИТ ресурсами предприятия, могут использовать классы Trustmon и получать информацию о существующих доверительных отношениях. Применяя язык запросов WQL (WMI Query Language) для событий WMI, можно осуществлять мониторинг и создавать триггеры для оповещения об изменениях доверительных отношений.
Провайдер Trustmon
Провайдер WMI Trustmon поддерживает три класса WMI в пространстве имен rootmicrosoftactivedirectory: Microsoft_TrustProvider, Microsoft_DomainTrustStatus и Microsoft_LocalDomainInfo. Эти три класса обеспечивают доступ к информации о существующих доверительных отношениях между доменами.
Одноэлементный класс Microsoft_TrustProvider содержит свойства, позволяющие управлять тем, как класс Microsoft_DomainTrustStatus будет выполнять перебор состояний доверительных отношений между доменами. Одноэлементный класс - это класс, имеющий только один экземпляр управляемого объекта на исследуемой системе. Например, класс Win32_WMISetting является одноэлементным классом WMI, поскольку компьютер имеет только один экземпляр настроек WMI. Провайдер Trustmon выполняет проверку доверительных отношений во время перечисления классом Microsoft_DomainTrustStatus в соответствии с параметрами, заданными в экземпляре класса Microsoft_TrustProvider. Класс Microsoft_LocalDomainInfo (также одноэлементный класс) выполняет сбор информации о локальном домене.
Исчерпывающие сведения о провайдере Trustmon, предлагаемых им классах и их свойствах можно найти в статье "Trustmon Proveider" по адресу (http://msdn.microsoft.com/library/en-us/wmisdk/wmi/trustmon_provider.asp).
Сценарий WMITrust
С помощью провайдера Trustmon я разработал сценарий WMITrust.wsf, позволяющий администраторам Windows 2003 управлять доверительными отношениями из командной строки. Предлагаемый сценарий также иллюстрирует некоторые приемы создания сценариев, необходимые для работы с классами провайдера Trustmon. Сценарий воспринимает параметры командной строки, соответствующие возможностям классов Trustmon. Обратите внимание на то, что ни один из этих классов не содержит методов WMI, поэтому сценарий только обеспечивает доступ из командной строки к свойствам.
В процессе инициализации сценарий WMITrust использует вспомогательные функции, содержащиеся в трех дополнительных файлах VBScript. Файл DecodeTrustsFunction.vbs содержит три функции для расшифровки значений свойств класса Microsoft_DomainTrustStatus:
- DecodeTrustsFunction() расшифровывает значения свойства TrustDirection.
- DecodeTrustType() расшифровывает значения свойства TrustType.
- DecodeTrustAttributes()расшифровывает значения свойства TrustAttributes.
Файл DisplayFormattedPropertyFunction.vbs содержит функцию DisplayFormattedProperty(), которая выводит на экран информацию WMI. Файл TinyErrorHandler.vbs содержит функцию ErrorHandler(), отвечающую за обработку ошибок. Эти файлы VBScript загружаются с сайта вместе со сценарием WMITrust.
Во время выполнения инициализации сценарием создается объект SWbemLocator, необходимый для исполнения соединения WMI, и объект SWbemDateTime для управления свойствами, содержащими значения даты и времени. Более подробно об использовании этих объектов см. "SWbemLocator", http://msdn.microsoft.com/library/en-us/wmisdk/wmi/swbemlocator.asp и "SWbemDateTime", http://msdn.microsoft.com/library/en-us/wmisdk/wmi/swbemdatetime.asp. Перед началом разбора параметров командной строки сценарий также определяет некоторые константы для компьютера по умолчанию и пространства имен. При этом используются средства разбора XML WSH 5.6.
После инициализации сценарий WMITrust подключается к службе WMI локального или удаленного компьютера. Обратите внимание, что необходимо подключаться к контроллеру домена, поскольку только контроллеры домена обрабатывают информацию о доверительных отношениях между доменами. Для запуска сценария на удаленном компьютере следует использовать ключ /Machine, указывающий имя удаленного контроллера домена, а также ключи /User и /Password для указания пользователя, от имени которого будет выполнено подключение.
WMITrust /DomainInfo+ /Machine:MyRemoteDC /User:ALissoir /Password:MyPassword
При запуске WMITrust с указанием параметра /DomainInfo+ сценарий получит информацию о локальном домене. На рисунке 1 приведен пример результата, полученного при указании ключа /DomainInfo+ для домена LissWare.Net. Здесь присутствуют имя используемого соединением WMI контроллера домена (свойство DCname), DNS имя домена (свойство DNSname) и имя дерева леса (свойство TreeName).
При запросе информации о домене также будут выданы значения свойств экземпляра класса Microsoft_TrustProvider. Свойство TrustListLifetime указывает время в минутах, прошедшее с момента последнего кэширования доверительных связей (значение по умолчанию - 20 минут). Свойство TrustStatusLifetime означает интервал в минутах для повторного запроса состояния доверительных связей (по умолчанию - 3 минуты). Свойство TrustCheckLevel позволяет задать один из четырех типов перечисления при перечислении доменов (по умолчанию - 1). Булевское значение ReturnAll определяет при операции просмотра и доверяющие, и доверенные домены (значение True, режим по умолчанию), или только доверенные домены (значение False).
Фрагмент А листинга 1 показывает код, с помощью которого получен результат, представленный на рисунке 1. Сценарий создает объекты Microsoft_LocalDomainInfo и Microsoft_TrustProvider. Доступ к экземплярам одноэлементных классов всегда осуществляется с использованием символа '@'. Далее сценарий выполняет два цикла For Each для перечисления и вывода на экран значений свойств экземпляров каждого класса.
Рисунок 2. Модель доверительных отношений между доменами
На рисунке 2 изображен домен LissWare.Net, для которого установлены две доверительных связи - транзитивное доверие внутри леса с доменом Emea.LissWare.Net и доверие c другим лесом ForeignForest.com. В последнем случае LissWare.Net выступает в роли доверенного (пользовательского) леса, а ForeignForest.com - в роли доверяющего (ресурсного домена). При запуске WMITrust с ключом /Check на контроллере домена, сценарий выдает информацию, приведенную на рисунке 3. Обратите внимание, что сценарий выводит все доверительные отношения домена LissWare.Net - и двунаправленную доверительную связь с доменом Emea.LissWare.Net и однонаправленную входящую связь из ForeignForest.Com.
Рисунок 3. Выдача сценария WMITrust c ключом /Check
Рисунок 4. Выдача мониторинга состояния доверительных связей.
Если при запуске указать ключ /Check, можно будет обновить значения свойств экземпляра класса Microsoft_TrustProvider. Для обновления значения свойства TrustStatusLifetime следует указать ключ /StatusLife, для свойства TrustListLifetime требуется указать ключ /ListLife, а для обновления ReturnAll - ключ /TrustedOnly. Ниже приведен пример командной строки для запуска сценария:
WMITrust /Check:EnumOnly /StatusLifeTime:6 /ListLifeTime:40 /TrustedOnly-
Чтобы изменения немедленно вступили в силу, после выполнения сценария необходимо перезапустить службу WMI.
Приведенный в листинге 1 фрагмент B выполняет обработку класса Microsoft_TrustProvider. Сценарий сначала создает экземпляр одноэлементного класса Microsoft_TrustProvider. Если в командной строке указаны ключи, модифицирующие класс Microsoft_TrustProvider, сценарий присваивает указанные значения соответствующим свойствам класса. Если включен ключ /TurstedOnly+, свойству ReturnAll присваивается значение False, чтобы провайдер WMI вернул только имена доверенных доменов без имен доверяющих. Далее сценарий сохраняет экземпляр класса Microsoft_TrustProvider обратно в систему - для этого используется метод Put_, предоставляемый объектом SWbemObject (более подробные сведения об объекте SWbemObject можно найти в одноименной статье базы знаний Microsoft, доступной по ссылке http://msdn.microsoft.com/library/en-us/wmisdk/wmi/swbemobject.asp).
После завершения обновления выполняется перечисление доверительных отношений (см. фрагмент С). Для этого сценарий получает коллекцию экземпляров класса Microsoft_DomainTrustStatus. Если коллекция содержит хотя бы один экземпляр класса, сценарий выполняет перебор свойств найденных экземпляров. Предложение Select Case осуществляет необходимые операции по расшифровке имени свойства.
Мониторинг доверительных отношений Windows 2003
Сценарий WMITrust получает информацию о доверительных отношениях и может изменять свойства провайдера Trustmon, но не предоставляет средства мониторинга состояния доверительных отношений. Для обнаружения изменения состояния доверительных отношений необходимо использовать запросы событий WQL
Select * FROM __InstanceModificationEvent Within 5 Where TargetInstance ISA 'Microsoft_DomainTrustStatus'
Для выполнения этого запроса можно воспользоваться сценарием GenericEventAsyncConsumer.wsf, который был разработан специально для подобных запросов. При использовании этого сценария запрос события WQL отображает обнаружение изменения состояния доверительного отношения, как показано на рисунке 4. Сценарий GenericEventAsyncConsumer выводит информацию экземпляра Microsoft_DomainTrustStatus по состоянию до того, как контроллер домена стал недоступен (из-за неисправности или штатного отключения), и после этого. Второй набор значений свойств TrustIsOk, TrustStatus и TrustStatusString показывает, что доверительное отношение было разорвано.
Все под контролем
В Windows 2003 значительно усовершенствованы возможности управления. Так, количество провайдеров WMI возросло до 80 (в Windows 2000 Server их было 29). Провайдер WMI Trustmon - это только один из новых провайдеров. В Windows 2003 появились новые типы доверительных отношений для объединения многих лесов, так что управление этими доверительными отношениями стало еще одной важной задачей, которую системные администраторы могут решить с помощью современных средств мониторинга.
Листинг 1: Фрагменты сценария WMITrust
В… Callout A - BEGIN WScript.Echo "- Local Domain information " & String (60, "-") Set objWMIInstance = objWMIServices.Get _ ("Microsoft_LocalDomainInfo=@") If Err.Number Then ErrorHandler (Err) Set objWMIPropertySet = objWMIInstance.Properties_ For Each objWMIProperty In objWMIPropertySet DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ objWMIProperty.Name, _ Null Next WScript.Echo WScript.Echo "- Trust provider parameters " & String (60, "-") Set objWMIInstance = objWMIServices.Get _ ("Microsoft_TrustProvider=@") If Err.Number Then ErrorHandler (Err) Set objWMIPropertySet = objWMIInstance.Properties_ For Each objWMIProperty In objWMIPropertySet DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ objWMIProperty.Name, _ Null Next Callout A - END В… Callout B - BEGIN Set objWMIInstance = objWMIServices.Get _ ("Microsoft_TrustProvider=@") If Err.Number Then ErrorHandler (Err) objWMIInstance.TrustCheckLevel = intCheckLevel If intStatusLifeTime <> - 1 Then objWMIInstance.TrustStatusLifetime = intStatusLifeTime End If If intListLifeTime <> - 1 Then objWMIInstance.TrustListLifetime = intListLifeTime End If If boolDoTrustedOnly = True Then objWMIInstance.ReturnAll = Not boolTrustedOnly End If objWMIInstance.Put_ (wbemChangeFlagUpdateOnly Or _ wbemFlagReturnWhenComplete) Callout B - END В… Callout C - BEGIN Set objWMIInstances = objWMIServices.InstancesOf _ ("Microsoft_DomainTrustStatus") If Err.Number Then ErrorHandler (Err) For Each objWMIInstance in objWMIInstances Set objWMIPropertySet = objWMIInstance.Properties_ For Each objWMIProperty In objWMIPropertySet Select Case objWMIProperty.Name Case "TrustDirection" DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ DecodeTrustDirection (objWMIProperty.Value), _ Null Case "TrustType" DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ DecodeTrustType (objWMIProperty.Value), _ Null Case "TrustAttributes" DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ DecodeTrustAttributes (objWMIProperty.Value), _ Null Case Else DisplayFormattedProperty objWMIInstance, _ " " & objWMIProperty.Name, _ objWMIProperty.Value, _ Null End Select Next В… Next В… Callout C - END