Использование Windows Management Instrumentation для диагностикиUsing Windows Management Instrumentation for Diagnostics

Windows Communication Foundation (WCF) предоставляет данные проверки службы во время выполнения через поставщика WCF инструментария управления Windows (WMI).Windows Communication Foundation (WCF) exposes inspection data of a service at runtime through a WCF Windows Management Instrumentation (WMI) provider.

Реализация WMIEnabling WMI

Инструментарий WMI - это реализованный корпорацией Майкрософт стандарт управления предприятием через Интернет (WBEM).WMI is Microsoft's implementation of the Web-Based Enterprise Management (WBEM) standard. Дополнительные сведения о пакете WMI SDK см. в разделе инструментария управления Windows.For more information about the WMI SDK, see Windows Management Instrumentation. WBEM является отраслевым стандартом предоставления приложениями инструментария управления для внешних средств управления.WBEM is an industry standard for how applications expose management instrumentation to external management tools.

Поставщик инструментария WMI - это компонент, предоставляющий инструментарий в среде выполнения с помощью совместимого с WBEM интерфейса.A WMI provider is a component that exposes instrumentation at runtime through a WBEM-compatible interface. Он состоит из набора объектов инструментария WMI, имеющих пары атрибут/значение.It consists of a set of WMI objects that have attribute/value pairs. Пары могут быть нескольких простых типов.Pairs can be of a number of simple types. Средства управления могут подключаться к службам через интерфейс во время выполнения.Management tools can connect to the services through the interface at runtime. WCF предоставляет атрибуты служб, таких как адреса, привязки, поведения и прослушиватели.WCF exposes attributes of services such as addresses, bindings, behaviors, and listeners.

Встроенный поставщик инструментария WMI может быть активирован в файле конфигурации приложения.The built-in WMI provider can be activated in the configuration file of the application. Это осуществляется посредством wmiProviderEnabled атрибут <диагностики > в <system.serviceModel > разделе, как показано в следующем примере Конфигурация.This is done through the wmiProviderEnabled attribute of the <diagnostics> in the <system.serviceModel> section, as shown in the following sample configuration.

<system.serviceModel>  
    …  
    <diagnostics wmiProviderEnabled="true" />  
    …  
</system.serviceModel>  

Эта запись конфигурации предоставляет интерфейс инструментария WMI.This configuration entry exposes a WMI interface. Теперь приложения управления могут подключаться через этот интерфейс и обращаться к инструментарию управления приложения.Management applications can now connect through this interface and access the management instrumentation of the application.

Доступ к данным WMIAccessing WMI Data

Доступ к данным инструментария WMI может осуществляться несколькими различными способами.WMI data can be accessed in many different ways. Microsoft предоставляет программные интерфейсы WMI для скриптов, приложений Visual Basic, C++ приложения и платформы .NET Framework.Microsoft provides WMI APIs for scripts, Visual Basic applications, C++ applications, and the .NET Framework. Дополнительные сведения см. в разделе использование инструментария WMI.For more information, see Using WMI.

Внимание!

При использовании предоставляемых .NET Framework методов для программного доступа к данным WMI следует помнить о том, что при установке подключения эти методы могут вызывать исключения.If you use the .NET Framework provided methods to programmatically access WMI data, you should be aware that such methods may throw exceptions when the connection is established. Подключение устанавливается не во время создания экземпляра ManagementObject, а при получении первого запроса, при котором происходит реальный обмен данными.The connection is not established during the construction of the ManagementObject instance, but on the first request involving actual data exchange. Следовательно, следует использовать блок try..catch для перехвата возможных исключений.Therefore, you should use a try..catch block to catch the possible exceptions.

Можно изменить уровень ведения журнала сообщений и трассировок, а также параметры журнала сообщений для источника трассировки System.ServiceModel в инструментарии WMI.You can change the trace and message logging level, as well as message logging options for the System.ServiceModel trace source in WMI. Это можно сделать путем доступа к AppDomainInfo экземпляр, который предоставляет следующим логическим свойствам: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, и TraceLevel.This can be done by accessing the AppDomainInfo instance, which exposes these Boolean properties: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, and TraceLevel. Поэтому, если в файле конфигурации прослушиватель трассировки настроен на ведение журнала, но эти параметры имеют значение false, можно впоследствии изменить их значения на true, когда приложение будет выполняться.Therefore, if you configure a trace listener for message logging, but set these options to false in configuration, you can later change them to true when the application is running. В результате ведение журнала будет включено во время выполнения.This will effectively enable message logging at runtime. Аналогично, если ведение журнала было включено в файле конфигурации, его можно отключить во время выполнения с помощью инструментария WMI.Similarly, if you enable message logging in your configuration file, you can disable it at runtime using WMI.

Необходимо помнить, что если прослушиватели трассировок журнала сообщений для журнала сообщений или прослушиватели трассировок System.ServiceModel для трассировок не заданы в файле конфигурации, ни одно из изменений не будет применено, даже если эти изменения принимаются инструментарием WMI.You should be aware that if no message logging trace listeners for message logging, or no System.ServiceModel trace listeners for tracing are specified in the configuration file, none of your changes are taken into effect, even though the changes are accepted by WMI. Дополнительные сведения о правильной настройке соответствующих прослушивателей см. в разделе Настройка ведения журнала сообщений и Настройка трассировки.For more information on properly setting up the respective listeners, see Configuring Message Logging and Configuring Tracing. Уровень трассировки всех остальных источников трассировки, заданных конфигурацией, действителен только при запуске приложения и не может быть изменен.The trace level of all other trace sources specified by configuration is effective when the application starts, and cannot be changed.

WCF предоставляет GetOperationCounterInstanceName метод для создания сценариев.WCF exposes a GetOperationCounterInstanceName method for scripting. Если передать этому методу имя операции, он возвращает имя экземпляра счетчика производительности.This method returns a performance counter instance name if you provide it with an operation name. Однако он не проверяет входные данные.However, it does not validate your input. Таким образом, если передать ему неправильное имя операции, возвращается неверное имя счетчика.Therefore, if you provide an incorrect operation name, an incorrect counter name is returned.

OutgoingChannel Свойство Service экземпляр не выполняет подсчет каналов, открытых службой для подключения к другой службе, если клиент WCF для целевой службы не создается в Service метод.The OutgoingChannel property of the Service instance does not count channels opened by a service to connect to another service, if the WCF client to the destination service is not created within the Service method.

Внимание WMI поддерживает только TimeSpan значение до 3 десятичных запятых.Caution WMI only supports a TimeSpan value up to 3 decimal points. Например, если одному из свойств служба присваивает значение MaxValue, при просмотре через WMI это значение усекается до 3 знаков после десятичного разделителя.For example, if your service sets one of its properties to MaxValue, its value is truncated after 3 decimal points when viewed through WMI.

БезопасностьSecurity

Так как поставщик инструментария WMI для WCF разрешает обнаружение служб в среде, вы должны быть предельно осторожными для предоставления доступа к нему.Because the WCF WMI provider allows the discovery of services in an environment, you should exercise extreme caution for granting access to it. При изменении настроек по умолчанию, при которых доступ предоставляется только администратору, третьи лица с более низкой степенью доверия могут получить доступ к конфиденциальным данным в среде.If you relax the default administrator-only access, you may allow less-trusted parties access to sensitive data in your environment. В частности, при расширении разрешений для удаленного доступа к WMI могут возникнуть атаки на переполнение.Specifically, if you loosen permissions on remote WMI access, flooding attacks can occur. При переполнении процесса избыточными запросами WMI производительность процесса может снизится.If a process is flooded by excessive WMI requests, its performance can be degraded.

Кроме того, при расширении прав доступа к файлу MOF третьи лица с более низкой степенью доверия могут управлять поведением WMI и изменять объекты, находящиеся в схеме WMI.In addition, if you relax access permissions for the MOF file, less-trusted parties can manipulate the behavior of WMI and alter the objects that are loaded in the WMI schema. Например, поля могут быть удалены таким образом, что критические данные скрыты от администратора; или поля, которые не заполняются или вызывают исключения, добавляются в файл.For example, fields can be removed such that critical data is concealed from the administrator or that fields that do not populate or cause exceptions are added to the file.

По умолчанию поставщик инструментария WMI для WCF предоставляет «выполнить метод», «запись поставщика» и «включить учетную запись» Администратор и «включить учетную запись» разрешение для ASP.NET, Local Service и Network Service.By default, the WCF WMI provider grants "execute method", "provider write", and "enable account" permission for Administrator, and "enable account" permission for ASP.NET, Local Service and Network Service. В частности, на платформах, отличных от Windows VistaWindows Vista, учетная запись ASP.NET имеет доступ на чтение в пространстве имен ServiceModel инструментария WMI.In particular, on non-Windows VistaWindows Vista platforms, the ASP.NET account has read access to the WMI ServiceModel namespace. Если требуется не предоставлять эти привилегии определенной группе пользователей, нужно либо деактивировать поставщика инструментария WMI (по умолчанию он отключен), либо запретить доступ указанной группы пользователей.If you do not want to grant these privileges to a particular user group, you should either deactivate the WMI provider (it is disabled by default), or disable access for the specific user group.

Возможно, поставщик инструментария WMI не удастся включить через конфигурацию по причине недостаточных привилегий пользователя.In addition, when you attempt to enable WMI through configuration, WMI may not be enabled due to insufficient user privilege. Однако при возникновении этого сбоя никакой записи в журнале событий не делается.However, no event is written to the event log to record this failure.

Для изменения уровней привилегий пользователя выполните следующие шаги.To modify user privilege levels, use the following steps.

  1. Нажмите кнопку Пуск и затем запустите введите compmgmt.msc.Click Start and then Run and type compmgmt.msc.

  2. Щелкните правой кнопкой мыши службы и приложения/управляющий элемент WMI для выбора свойства.Right-click Services and Application/WMI Controls to select Properties.

  3. Выберите безопасности вкладки и перейдите к Root/ServiceModel пространства имен.Select the Security Tab, and navigate to the Root/ServiceModel namespace. Нажмите кнопку безопасности кнопки.Click the Security button.

  4. Выберите определенную группу или пользователя, который вы хотите управлять доступом и использовать Разрешить или Deny флажок, чтобы настроить разрешения.Select the specific group or user that you want to control access and use the Allow or Deny checkbox to configure permissions.

Предоставление дополнительным пользователям разрешений на регистрацию WCF WMIGranting WCF WMI Registration Permissions to Additional Users

WCF предоставляет доступ к данным управления для WMI.WCF exposes management data to WMI. Это достигается путем размещения внутрипроцессного поставщика WMI, иногда называется «несвязанным поставщиком».It does so by hosting an in-process WMI provider, sometimes called a "decoupled provider". Для предоставления доступа к данным управления учетная запись, которая регистрирует этот поставщик, должна иметь необходимые разрешения.For the management data to be exposed, the account that registers this provider must have the appropriate permissions. В Windows регистрация несвязанных поставщиков по умолчанию доступна только небольшому числу привилегированных учетных записей.In Windows, only a small set of privileged accounts can register decoupled providers by default. Это обстоятельство вызывает затруднения, поскольку пользователям обычно нужно предоставлять доступ к данным WMI из службы WCF, которая работает с учетной записью, не входящей в набор по умолчанию.This is a problem because users commonly want to expose WMI data from a WCF service running under an account that is not in the default set.

Чтобы предоставить такой доступ, администратор должен предоставить дополнительной учетной записи следующие разрешения в указанном порядке:To provide this access, an administrator must grant the following permissions to the additional account in the following order:

  1. разрешение на доступ к пространству имен WCF WMI;Permission to access to the WCF WMI Namespace.

  2. разрешение на регистрацию несвязанного поставщика WMI для WCF.Permission to register the WCF Decoupled WMI Provider.

Предоставление разрешения на доступ к пространству имен WMITo grant WMI namespace access permission

  1. Выполните следующий скрипт PowerShell.Run the following PowerShell script.

    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».This PowerShell script uses Security Descriptor Definition Language (SDDL) to grant the Built-In Users group access to the "root/servicemodel" WMI namespace. В нем указываются следующие списки управления доступом.It specifies the following ACLs:

    • Встроенная учетная запись администратора (BA) - уже имеет доступ.Built-In Administrator (BA) - Already Had Access.

    • Сетевая служба (NS) - уже имеет доступ.Network Service (NS) - Already Had Access.

    • Локальная система (LS) - уже имеет доступ.Local System (LS) - Already Had Access.

    • Встроенные пользователи - группа, которой предоставляется доступ.Built-In Users - The group to grant access to.

Предоставление доступа к регистрации поставщикаTo grant provider registration access

  1. Выполните следующий скрипт PowerShell.Run the following PowerShell script.

    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 ""  
    

Предоставление доступа произвольным пользователям или группамGranting Access to Arbitrary Users or Groups

В примере из этого раздела всем локальным пользователям предоставляются права доступа к регистрации поставщика WMI.The example in this section grants WMI Provider registration privileges to all local users. Если нужно предоставить доступ пользователю или группе, которые не являются встроенными, необходимо получить идентификатор безопасности этого пользователя или группы.If you want to grant access to a user or group that is not built in, then you must obtain that user or group’s Security Identifier (SID). Нет общего метода для получения идентификатора безопасности любого пользователя.There is no simple way to get the SID for an arbitrary user. В качестве одного из решений можно выполнить вход от имени нужного пользователя, а затем выполнить следующую команду в командной оболочке.One method is to log on as the desired user and then issue the following shell command.

Whoami /user  

Это позволит получить идентификатор безопасности текущего пользователя, однако такой метод нельзя использовать, чтобы получить идентификатор безопасности любого пользователя.This provides the SID of the current user, but this method cannot be used to get the SID on any arbitrary user. Другой способ получения идентификатора безопасности является использование getsid.exe средство из Windows 2000 Resource Kit Tools для выполнения административных задач.Another method to get the SID is to use the getsid.exe tool from the Windows 2000 Resource Kit Tools for administrative tasks. Эта программа сравнивает идентификаторы безопасности двух пользователей (локальных или пользователей домена) и помимо прочего выводит два идентификатора в командную строку.This tool compares the SID of two users (local or domain), and as a side effect prints the two SIDs to the command line. Дополнительные сведения см. в разделе хорошо известные идентификаторы безопасности.For more information, see Well Known SIDs.

Доступ к экземплярам удаленных объектов WMIAccessing Remote WMI Object Instances

Если вам нужно получить доступ к экземплярам инструментария WMI для WCF на удаленном компьютере, необходимо разрешить конфиденциальность пакета средств, которые используются для доступа.If you need to access WCF WMI instances on a remote machine, you must enable packet privacy on the tools that you use for access. В следующем разделе описывается, как это можно сделать с помощью WMI CIM Studio, тестера инструментария управления Windows или .NET SDK 2.0.The following section describes how to achieve these using the WMI CIM Studio, Windows Management Instrumentation Tester, as well as .NET SDK 2.0.

WMI CIM StudioWMI CIM Studio

Если вы установили Администрирование WMI, можно использовать WMI CIM Studio, для доступа к экземплярам WMI.If you have installed WMI Administrative Tools, you can use the WMI CIM Studio to access WMI instances. Средства расположены в следующей папке:The tools are in the following folder

%windir%\Program Files\WMI средства\%windir%\Program Files\WMI Tools\

  1. В подключиться к пространству имен: введите root\ServiceModel и нажмите кнопку ОК.In the Connect to namespace: window, type root\ServiceModel and click OK.

  2. В WMI CIM Studio входа окно, нажмите кнопку параметры >> кнопку, чтобы развернуть окно.In the WMI CIM Studio Login window, click the Options >> button to expand the window. Выберите конфиденциальности пакетов для уровень проверки подлинностии нажмите кнопку ОК.Select Packet privacy for Authentication level, and click OK.

Тестер инструментария управления WindowsWindows Management Instrumentation Tester

Это средство установлено Windows.This tool is installed by Windows. Чтобы запустить его, запустите консоль командной строки, введя cmd.exe в Пуск/Выполнить диалоговое окно и нажмите кнопку ОК.To run it, launch a command console by typing cmd.exe in the Start/Run dialog box and click OK. Введите wbemtest.exe в окне командной строки.Then, type wbemtest.exe in the command window. Запустится средство Тестер инструментария управления Windows.The Windows Management Instrumentation Tester tool is then launched.

  1. Нажмите кнопку Connect кнопки в правом верхнем углу окна.Click the Connect button on the top right corner of the window.

  2. В новом окне введите root\ServiceModel для пространства имен и выберите конфиденциальности пакетов для уровень проверки подлинности.In the new window, enter root\ServiceModel for the Namespace field, and select Packet privacy for Authentication level. Нажмите кнопку Подключиться.Click Connect.

Использование управляемого кодаUsing Managed Code

Доступ к удаленным экземплярам WMI также может осуществляться программно с помощью классов, предоставляемых пространством имен System.Management.You can also access remote WMI instances programmatically by using classes provided by the System.Management namespace. В следующем образце кода показано, как это сделать.The following code sample demonstrates how to do this.

String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");
  
ConnectionOptions connection = new ConnectionOptions();  
connection.Authentication = AuthenticationLevel.PacketPrivacy;  
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);