Использование Windows Management Instrumentation для диагностики
Windows Communication Foundation (WCF) предоставляет данные проверки службы во время выполнения с помощью поставщика инструментария управления Windows (WMI) WCF.
Реализация WMI
Инструментарий WMI - это реализованный корпорацией Майкрософт стандарт управления предприятием через Интернет (WBEM). Дополнительные сведения о пакете SDK для WMI см. в статье об инструментарии управления Windows. WBEM является отраслевым стандартом предоставления приложениями инструментария управления для внешних средств управления.
Поставщик инструментария WMI — это компонент, предоставляющий инструментарий во время выполнения с помощью совместимого с WBEM интерфейса. Он состоит из набора объектов инструментария WMI, имеющих пары атрибут/значение. Пары могут быть нескольких простых типов. Средства управления могут подключаться к службам через интерфейс во время выполнения. WCF предоставляет атрибуты служб, такие как адреса, привязки, поведения и прослушиватели.
Встроенный поставщик инструментария WMI может быть активирован в файле конфигурации приложения. Это делается с помощью wmiProviderEnabled
атрибута< диагностика> в< разделе system.serviceModel>, как показано в следующем примере конфигурации.
<system.serviceModel>
…
<diagnostics wmiProviderEnabled="true" />
…
</system.serviceModel>
Эта запись конфигурации предоставляет интерфейс инструментария WMI. Теперь приложения управления могут подключаться через этот интерфейс и обращаться к инструментарию управления приложения.
Доступ к данным WMI
Доступ к данным инструментария WMI может осуществляться несколькими различными способами. Корпорация Майкрософт предоставляет API-интерфейсы WMI для скриптов, приложений Visual Basic, приложений C++ и платформы .NET Framework. Дополнительные сведения см. в статье Использование инструментария WMI.
Внимание
При использовании предоставляемых .NET Framework методов для программного доступа к данным WMI следует помнить о том, что при установке подключения эти методы могут вызывать исключения. Подключение устанавливается не во время создания экземпляра ManagementObject, а при получении первого запроса, при котором происходит реальный обмен данными. Следовательно, следует использовать блок try..catch
для перехвата возможных исключений.
Можно изменить уровень ведения журнала сообщений и трассировок, а также параметры журнала сообщений для источника трассировки System.ServiceModel
в инструментарии WMI. Для этого необходимо обратиться к экземпляру AppDomainInfo, который предоставляет доступ к следующим логическим свойствам: LogMessagesAtServiceLevel
, LogMessagesAtTransportLevel
, LogMalformedMessages
и TraceLevel
. Поэтому, если в файле конфигурации прослушиватель трассировки настроен на ведение журнала, но эти параметры имеют значение false
, можно впоследствии изменить их значения на true
, когда приложение будет выполняться. В результате ведение журнала будет включено во время выполнения. Аналогично, если ведение журнала было включено в файле конфигурации, его можно отключить во время выполнения с помощью инструментария WMI.
Необходимо помнить, что если прослушиватели трассировок журнала сообщений для журнала сообщений или прослушиватели трассировок System.ServiceModel
для трассировок не заданы в файле конфигурации, ни одно из изменений не будет применено, даже если эти изменения принимаются инструментарием WMI. Дополнительные сведения о правильной настройке соответствующих прослушивателей см. в статьях Настройка ведения журналов сообщений и Настройка трассировки. Уровень трассировки всех остальных источников трассировки, заданных конфигурацией, действителен только при запуске приложения и не может быть изменен.
WCF предоставляет метод GetOperationCounterInstanceName
для создания скриптов. Если передать этому методу имя операции, он возвращает имя экземпляра счетчика производительности. Однако он не проверяет входные данные. Таким образом, если передать ему неправильное имя операции, возвращается неверное имя счетчика.
Свойство OutgoingChannel
экземпляра Service
не выполняет подсчет каналов, открытых службой для подключения к другой службе, если клиент WCF для службы назначения не создается в методе Service
.
Внимание. Инструментарий WMI поддерживает значение TimeSpan с максимум 3 знаками после десятичного разделителя. Например, если одному из свойств служба присваивает значение MaxValue, при просмотре через WMI это значение усекается до 3 знаков после десятичного разделителя.
Безопасность
Так как поставщик инструментария WMI WCF разрешает обнаружение служб в среде, необходимо проявлять предельную осторожность при предоставлении к нему доступа. При изменении настроек по умолчанию, при которых доступ предоставляется только администратору, третьи лица с более низкой степенью доверия могут получить доступ к конфиденциальным данным в среде. В частности, при расширении разрешений для удаленного доступа к WMI могут возникнуть атаки на переполнение. При переполнении процесса избыточными запросами WMI производительность процесса может снизится.
Кроме того, при расширении прав доступа к файлу MOF третьи лица с более низкой степенью доверия могут управлять поведением WMI и изменять объекты, находящиеся в схеме WMI. Например, поля могут быть удалены таким образом, что критические данные скрыты от администратора; или поля, которые не заполняются или вызывают исключения, добавляются в файл.
По умолчанию поставщик инструментария WMI WCF гарантирует право доступа администратора к инструментам "Выполнить метод", "Запись поставщика" и "Включить учетную запись", а также к инструменту "Включить учетную запись" для службы ASP.NET, локальной службы и сетевой службы. В частности, на платформах, отличных от Windows Vista, учетная запись ASP.NET имеет доступ на чтение в пространстве имен ServiceModel инструментария WMI. Если требуется не предоставлять эти привилегии определенной группе пользователей, нужно либо деактивировать поставщика инструментария WMI (по умолчанию он отключен), либо запретить доступ указанной группы пользователей.
Возможно, поставщик инструментария WMI не удастся включить через конфигурацию по причине недостаточных привилегий пользователя. Однако при возникновении этого сбоя никакой записи в журнале событий не делается.
Для изменения уровней привилегий пользователя выполните следующие шаги.
Нажмите "Пуск", затем — "Выполнить" и введите compmgmt.msc.
Щелкните правой кнопкой мыши Службы и приложения/Управляющий элемент WMI и выберите Свойства.
Откройте вкладку Безопасность и перейдите в пространство имен Root/ServiceModel. Нажмите кнопку Безопасность.
Выберите группу или пользователя, доступом которых требуется управлять, и установите флажок Разрешить или Запретить, чтобы задать разрешения.
Предоставление дополнительным пользователям разрешений на регистрацию WCF WMI
WCF предоставляет доступ к данным управления для WMI. Для этого размещается внутрипроцессный поставщик WMI, который иногда называется "несвязанным поставщиком". Для предоставления доступа к данным управления учетная запись, которая регистрирует этот поставщик, должна иметь необходимые разрешения. В Windows регистрация несвязанных поставщиков по умолчанию доступна только небольшому числу привилегированных учетных записей. Это обстоятельство вызывает затруднения, поскольку пользователям обычно нужно предоставлять доступ к данным WMI из службы WCF, которая работает с учетной записью, не входящей в набор по умолчанию.
Чтобы предоставить такой доступ, администратор должен предоставить дополнительной учетной записи следующие разрешения в указанном порядке:
разрешение на доступ к пространству имен WCF WMI;
разрешение на регистрацию несвязанного поставщика WMI для WCF.
Предоставление разрешения на доступ к пространству имен WMI
Запустите следующий сценарий PowerShell.
write-host "" write-host "Granting Access to root/servicemodel WMI namespace to built in users group" write-host "" # Create the binary representation of the permissions to grant in SDDL $newPermissions = "O:BAG:BAD:P(A;CI;CCDCLCSWRPWPRCWD;;;BA)(A;CI;CC;;;NS)(A;CI;CC;;;LS)(A;CI;CC;;;BU)" $converter = new-object system.management.ManagementClass Win32_SecurityDescriptorHelper $binarySD = $converter.SDDLToBinarySD($newPermissions) $convertedPermissions = ,$binarySD.BinarySD # Get the object used to set the permissions $security = gwmi -namespace root/servicemodel -class __SystemSecurity # Get and output the current settings $binarySD = @($null) $result = $security.PsBase.InvokeMethod("GetSD",$binarySD) $outsddl = $converter.BinarySDToSDDL($binarySD[0]) write-host "Previous ACL: "$outsddl.SDDL # Change the Access Control List (ACL) using SDDL $result = $security.PsBase.InvokeMethod("SetSD",$convertedPermissions) # Get and output the current settings $binarySD = @($null) $result = $security.PsBase.InvokeMethod("GetSD",$binarySD) $outsddl = $converter.BinarySDToSDDL($binarySD[0]) write-host "New ACL: "$outsddl.SDDL write-host ""
В этом скрипте PowerShell с помощью языка SDDL встроенной группе "Пользователи" предоставляется доступ к пространству имен WMI "root/servicemodel". В нем указываются следующие списки управления доступом.
Встроенная учетная запись администратора (BA) - уже имеет доступ.
Сетевая служба (NS) - уже имеет доступ.
Локальная система (LS) - уже имеет доступ.
Встроенные пользователи - группа, которой предоставляется доступ.
Предоставление доступа к регистрации поставщика
Запустите следующий сценарий PowerShell.
write-host "" write-host "Granting WCF provider registration access to built in users group" write-host "" # Set security on ServiceModel provider $provider = get-WmiObject -namespace "root\servicemodel" __Win32Provider write-host "Previous ACL: "$provider.SecurityDescriptor $result = $provider.SecurityDescriptor = "O:BUG:BUD:(A;;0x1;;;BA)(A;;0x1;;;NS)(A;;0x1;;;LS)(A;;0x1;;;BU)" # Commit the changes and display it to the console $result = $provider.Put() write-host "New ACL: "$provider.SecurityDescriptor write-host ""
Предоставление доступа произвольным пользователям или группам
В примере из этого раздела всем локальным пользователям предоставляются права доступа к регистрации поставщика WMI. Если нужно предоставить доступ пользователю или группе, которые не являются встроенными, необходимо получить идентификатор безопасности этого пользователя или группы. Нет общего метода для получения идентификатора безопасности любого пользователя. В качестве одного из решений можно выполнить вход от имени нужного пользователя, а затем выполнить следующую команду в командной оболочке.
Whoami /user
Дополнительные сведения см. в статье Идентификаторы безопасности.
Доступ к экземплярам удаленных объектов WMI
Если требуется получить доступ к экземплярам инструментария WMI WCF с удаленного компьютера, необходимо разрешить конфиденциальность пакета в используемых для доступа средствах. В следующем разделе описывается, как это можно сделать с помощью WMI CIM Studio, тестера инструментария управления Windows или .NET SDK 2.0.
WMI CIM Studio
Если установлены Средства управления WMI, для доступа к экземплярам WMI можно использовать WMI CIM Studio. Средства расположены в следующей папке:
%windir%\Program Files\WMI Tools\
В окне Подключиться к пространству имен: введите root\ServiceModel и нажмите кнопку ОК.
В окне входа WMI CIM Studio нажмите кнопку "Параметры>>", чтобы развернуть окно. Выберите Конфиденциальность пакетов для элемента Уровень проверки подлинности и нажмите кнопку ОК.
Тестер инструментария управления Windows
Это средство установлено Windows. Для запуска в диалоговом окне "Пуск" или "Выполнить" откройте программу командной строки, введя cmd.exe и нажав ОК. Затем в командном окне введите wbemtest.exe. Запустится средство Тестер инструментария управления Windows.
В правом верхнем углу окна нажмите кнопку Подключить.
В новом окне в поле Пространство имен введите root\ServiceModel и выберите Конфиденциальность пакетов для элемента Уровень проверки подлинности. Щелкните Подключить.
Использование управляемого кода
Доступ к удаленным экземплярам WMI также может осуществляться программно с помощью классов, предоставляемых пространством имен System.Management. В следующем образце кода показано, как это сделать.
String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);