Udostępnij za pośrednictwem


Używanie Instrumentacji zarządzania Windows na potrzeby diagnostyki

Program Windows Communication Foundation (WCF) uwidacznia dane inspekcji usługi w czasie wykonywania za pośrednictwem dostawcy instrumentacji zarządzania Windows (WMI, Windows Management Instrumentation).

Włączanie usługi WMI

WMI to implementacja standardu WBEM (Web-Based Enterprise Management) firmy Microsoft. Aby uzyskać więcej informacji na temat zestawu WMI SDK, zobacz Instrumentacja zarządzania Windows. WBEM jest standardem branżowym służącym do uwidaczniania instrumentacji zarządzania przez zewnętrzne narzędzia do zarządzania.

Dostawca WMI to składnik, który uwidacznia instrumentację w czasie wykonywania za pośrednictwem interfejsu zgodnego z WBEM. Składa się z zestawu obiektów WMI, które mają pary atrybutów/wartości. Pary mogą być wieloma prostymi typami. Narzędzia do zarządzania mogą łączyć się z usługami za pośrednictwem interfejsu w czasie wykonywania. Program WCF uwidacznia atrybuty usług, takie jak adresy, powiązania, zachowania i odbiorniki.

Wbudowany dostawca WMI można aktywować w pliku konfiguracji aplikacji. Odbywa się to za pomocą wmiProviderEnabled atrybutu <diagnostyki> w <sekcji system.serviceModel> , jak pokazano w poniższej przykładowej konfiguracji.

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

Ten wpis konfiguracji uwidacznia interfejs WMI. Aplikacje do zarządzania mogą teraz łączyć się za pośrednictwem tego interfejsu i uzyskiwać dostęp do instrumentacji zarządzania aplikacji.

Uzyskiwanie dostępu do danych usługi WMI

Dostęp do danych usługi WMI można uzyskać na wiele różnych sposobów. Firma Microsoft udostępnia interfejsy API WMI dla skryptów, aplikacji Języka Visual Basic, aplikacji języka C++ i platformy .NET Framework. Aby uzyskać więcej informacji, zobacz Using WMI (Korzystanie z usługi WMI).

Uwaga

Jeśli używasz metod udostępnionych przez program .NET Framework do programowego uzyskiwania dostępu do danych usługi WMI, należy pamiętać, że takie metody mogą zgłaszać wyjątki po nawiązaniu połączenia. Połączenie nie jest ustanawiane podczas budowy ManagementObject wystąpienia, ale na pierwszym żądaniu obejmującym rzeczywistą wymianę danych. W związku z tym należy użyć try..catch bloku, aby przechwycić możliwe wyjątki.

Możesz zmienić poziom rejestrowania śledzenia i komunikatów, a także opcje rejestrowania komunikatów dla System.ServiceModel źródła śledzenia w usłudze WMI. Można to zrobić, korzystając z wystąpienia AppDomainInfo, które uwidacznia następujące właściwości logiczne: LogMessagesAtServiceLevel, , LogMessagesAtTransportLevelLogMalformedMessagesi TraceLevel. W związku z tym jeśli skonfigurujesz odbiornik śledzenia na potrzeby rejestrowania komunikatów, ale ustawisz te opcje na false w konfiguracji, możesz później zmienić je na true gdy aplikacja jest uruchomiona. Spowoduje to efektywne włączenie rejestrowania komunikatów w czasie wykonywania. Podobnie, jeśli włączysz rejestrowanie komunikatów w pliku konfiguracji, możesz go wyłączyć w czasie wykonywania przy użyciu usługi WMI.

Należy pamiętać, że jeśli w pliku konfiguracji nie określono odbiorników śledzenia rejestrowania komunikatów lub żadnych System.ServiceModel odbiorników śledzenia śledzenia, żadne zmiany nie zostaną wprowadzone, mimo że zmiany są akceptowane przez usługę WMI. Aby uzyskać więcej informacji na temat prawidłowego konfigurowania odpowiednich odbiorników, zobacz Konfigurowanie rejestrowania komunikatów i konfigurowania śledzenia. Poziom śledzenia wszystkich innych źródeł śledzenia określonych przez konfigurację jest skuteczny po uruchomieniu aplikacji i nie można go zmienić.

Program WCF uwidacznia metodę GetOperationCounterInstanceName tworzenia skryptów. Ta metoda zwraca nazwę wystąpienia licznika wydajności, jeśli podasz mu nazwę operacji. Nie weryfikuje jednak danych wejściowych. W związku z tym, jeśli podasz nieprawidłową nazwę operacji, zwracana jest nieprawidłowa nazwa licznika.

Właściwość OutgoingChannelService wystąpienia nie zlicza kanałów otwartych przez usługę w celu nawiązania połączenia z inną usługą, jeśli klient WCF z usługą docelową nie zostanie utworzony w ramach Service metody .

Przestroga WMI obsługuje TimeSpan tylko wartość do 3 punktów dziesiętnych. Jeśli na przykład usługa ustawia jedną z jego właściwości na MaxValuewartość , jej wartość jest obcięta po 3 punktach dziesiętnych w przypadku wyświetlania za pośrednictwem usługi WMI.

Zabezpieczenia

Ponieważ dostawca WMI WCF umożliwia odnajdywanie usług w środowisku, należy zachować szczególną ostrożność przy udzielaniu dostępu do niego. Jeśli zrelaksujesz domyślny dostęp tylko do administratora, możesz zezwolić mniej zaufanym stronom na dostęp do poufnych danych w danym środowisku. W szczególności, jeśli poluzujesz uprawnienia dostępu zdalnego WMI, mogą wystąpić ataki powodziowe. Jeśli proces jest zalany przez nadmierne żądania usługi WMI, jego wydajność może ulec pogorszeniu.

Ponadto jeśli zrelaksujesz uprawnienia dostępu do pliku MOF, mniej zaufane strony mogą manipulować zachowaniem usługi WMI i zmieniać obiekty ładowane w schemacie usługi WMI. Na przykład pola można usunąć, tak aby dane krytyczne były ukryte przed administratorem lub pola, które nie wypełniają lub powodują dodanie wyjątków do pliku.

Domyślnie dostawca WMI programu WCF udziela uprawnień "execute method", "provider write" i "enable account" dla Administracja istrator oraz "enable account" uprawnienia dla ASP.NET, usługi lokalnej i usługi sieciowej. W szczególności na platformach innych niż Windows Vista konto ASP.NET ma dostęp do odczytu do przestrzeni nazw WMI ServiceModel. Jeśli nie chcesz udzielać tych uprawnień określonej grupie użytkowników, należy dezaktywować dostawcę usługi WMI (jest on domyślnie wyłączony) lub wyłączyć dostęp dla określonej grupy użytkowników.

Ponadto podczas próby włączenia usługi WMI za pośrednictwem konfiguracji usługa WMI może nie być włączona z powodu niewystarczających uprawnień użytkownika. Jednak żadne zdarzenie nie jest zapisywane w dzienniku zdarzeń w celu zarejestrowania tego błędu.

Aby zmodyfikować poziomy uprawnień użytkownika, wykonaj następujące kroki.

  1. Kliknij przycisk Start, a następnie uruchom i wpisz compmgmt.msc.

  2. Kliknij prawym przyciskiem myszy pozycję Usługi i kontrolki aplikacji/WMI, aby wybrać pozycję Właściwości.

  3. Wybierz kartę Zabezpieczenia i przejdź do przestrzeni nazw Root/ServiceModel. Kliknij przycisk Zabezpieczenia.

  4. Wybierz określoną grupę lub użytkownika, którego chcesz kontrolować dostęp, i użyj pola wyboru Zezwalaj lub Odmów , aby skonfigurować uprawnienia.

Udzielanie uprawnień rejestracji usługi WMI programu WCF do dodatkowych użytkowników

Program WCF uwidacznia dane zarządzania w usłudze WMI. Robi to przez hostowanie dostawcy WMI w procesie, czasami nazywanego "dostawcą oddzielonym". Aby dane zarządzania mogły zostać ujawnione, konto, które rejestruje tego dostawcę, musi mieć odpowiednie uprawnienia. W systemie Windows tylko niewielki zestaw uprzywilejowanych kont może domyślnie rejestrować wyrejestrowanych dostawców. Jest to problem, ponieważ użytkownicy często chcą uwidocznić dane usługi WMI z usługi WCF uruchomionej na koncie, które nie znajduje się w zestawie domyślnym.

Aby zapewnić ten dostęp, administrator musi udzielić następujących uprawnień do dodatkowego konta w następującej kolejności:

  1. Uprawnienie dostępu do przestrzeni nazw usługi WMI programu WCF.

  2. Uprawnienie do rejestrowania odłączonego dostawcy WMI programu WCF.

Aby udzielić uprawnienia dostępu do przestrzeni nazw usługi WMI

  1. Uruchom następujący skrypt programu 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 ""  
    

    Ten skrypt programu PowerShell używa języka definicji deskryptora zabezpieczeń (SDDL) w celu udzielenia wbudowanej grupie Użytkownicy dostępu do przestrzeni nazw WMI "root/servicemodel". Określa następujące listy ACL:

    • Wbudowany Administracja istrator (BA) — już miał dostęp.

    • Usługa sieciowa (NS) — już miał dostęp.

    • System lokalny (LS) — miał już dostęp.

    • Użytkownicy wbudowani — grupa, do których ma być udzielany dostęp.

Aby udzielić dostępu do rejestracji dostawcy

  1. Uruchom następujący skrypt programu 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 ""  
    

Udzielanie dostępu do dowolnych użytkowników lub grup

W przykładzie w tej sekcji są przyznawane uprawnienia rejestracji dostawcy usługi WMI wszystkim użytkownikom lokalnym. Jeśli chcesz udzielić dostępu do użytkownika lub grupy, która nie jest wbudowana, musisz uzyskać ten identyfikator zabezpieczeń (SID) tego użytkownika lub grupy. Nie ma prostego sposobu uzyskania identyfikatora SID dla dowolnego użytkownika. Jedną z metod jest zalogowanie się jako żądany użytkownik, a następnie wydanie następującego polecenia powłoki.

Whoami /user  

Aby uzyskać więcej informacji, zobacz Dobrze znane identyfikatory SID.

Uzyskiwanie dostępu do zdalnych wystąpień obiektów WMI

Jeśli musisz uzyskać dostęp do wystąpień usługi WMI programu WCF na maszynie zdalnej, musisz włączyć prywatność pakietów w narzędziach używanych do uzyskiwania dostępu. W poniższej sekcji opisano sposób ich osiągnięcia przy użyciu programu WMI CIM Studio, testera instrumentacji zarządzania Windows, a także zestawu .NET SDK 2.0.

WMI CIM Studio

Jeśli zainstalowano narzędzia WMI Administracja istrative Tools, możesz użyć programu WMI CIM Studio, aby uzyskać dostęp do wystąpień usługi WMI. Narzędzia znajdują się w następującym folderze:

%windir%\Program Files\WMI Tools\

  1. W oknie Połączenie do przestrzeni nazw wpiszroot\ServiceModel i kliknij przycisk OK.

  2. W oknie Logowania do programu WMI CIM Studio kliknij przycisk Opcje>>, aby rozwinąć okno. Wybierz pozycję Prywatność pakietów na poziomie uwierzytelniania, a następnie kliknij przycisk OK.

Tester instrumentacji zarządzania Windows

To narzędzie jest instalowane przez system Windows. Aby go uruchomić, uruchom konsolę poleceń, wpisując cmd.exe w oknie dialogowym Uruchamianie/uruchamianie i kliknij przycisk OK. Następnie wpisz wbemtest.exe w oknie polecenia. Następnie zostanie uruchomione narzędzie Tester instrumentacji zarządzania Windows.

  1. Kliknij przycisk Połączenie w prawym górnym rogu okna.

  2. W nowym oknie wprowadź wartość root\ServiceModel dla pola Przestrzeń nazw i wybierz pozycję Prywatność pakietów na poziomie uwierzytelniania. Kliknij Połącz.

Korzystanie z kodu zarządzanego

Dostęp do zdalnych wystąpień usługi WMI można również uzyskać programowo przy użyciu klas udostępnianych przez System.Management przestrzeń nazw. W poniższym przykładzie kodu pokazano, jak to zrobić.

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