Udostępnij za pośrednictwem


Używanie Instrumentacji zarządzania Windows do diagnostyki

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

Włączanie usługi WMI

WMI to implementacja standardu Web-Based Enterprise Management (WBEM) 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 dla zewnętrznych narzędzi 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/wartość. Pary mogą być wielu prostych typów. Narzędzia do zarządzania mogą łączyć się z usługami za pośrednictwem interfejsu w trakcie działania. Program WCF uwidacznia atrybuty usług, takie jak adresy, powiązania, zachowania i odbiorniki.

Wbudowany dostawca WMI można aktywować w pliku konfiguracyjnym aplikacji. Odbywa się to za pomocą atrybutu wmiProviderEnableddiagnostyki<> 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 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.

Ostrzeżenie

W przypadku korzystania z metod dostarczonych przez program .NET Framework w celu 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 nawiązywane podczas budowy instancji ManagementObject , ale na pierwszym żądaniu obejmującym rzeczywistą wymianę danych. W związku z tym należy użyć bloku try..catch , aby przechwycić możliwe wyjątki.

Można zmienić poziom rejestrowania śledzenia i komunikatów, a także opcje rejestrowania komunikatów System.ServiceModel dla źródła śledzenia w usłudze WMI. Można to zrobić, uzyskując dostęp do instancji AppDomainInfo , która uwidacznia następujące właściwości logiczne: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, i 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. Umożliwi to skuteczne rejestrowanie 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 żadnych odbiorników śledzenia rejestrowania komunikatów na potrzeby rejestrowania komunikatów lub żadnych System.ServiceModel odbiorników śledzenia na potrzeby rejestrowania, żadne zmiany nie zostaną uwzględnione, nawet jeśli zostaną zaakceptowane przez usługę WMI. Aby uzyskać więcej informacji na temat prawidłowego konfigurowania odpowiednich odbiorników, zobacz Konfigurowanie rejestrowania wiadomości i Konfigurowanie śledzenia. Poziom śledzenia wszystkich innych źródeł śledzenia określony przez konfigurację obowiązuje podczas uruchamiania aplikacji i nie można go zmienić.

Program WCF uwidacznia GetOperationCounterInstanceName metodę skryptowania. Ta metoda zwraca nazwę wystąpienia licznika wydajności, jeśli podasz mu nazwę operacji. Nie weryfikuje jednak wprowadzonych danych. W związku z tym, jeśli podasz niepoprawną nazwę operacji, zostanie zwrócona 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 do usługi docelowej nie jest tworzony w Service ramach metody.

Ostrożność Usługa WMI obsługuje TimeSpan tylko wartość do 3 miejsc dziesiętnych. Jeśli na przykład usługa ustawi jedną z jej właściwości na MaxValue, jej wartość jest obcinana po 3 miejscach dziesiętnych podczas przeglądania za pośrednictwem usługi WMI.

Bezpieczeństwo

Ponieważ dostawca WMI WCF umożliwia odnajdywanie usług w środowisku, należy zachować szczególną ostrożność przy udzielaniu do niego dostępu. Jeśli złagodzisz domyślny dostęp tylko dla administratora, możesz zezwolić mniej zaufanym stronom na dostęp do poufnych danych w swoim środowisku. W szczególności w przypadku poluzowania uprawnień do zdalnego dostępu do usługi WMI mogą wystąpić ataki typu flooding. Jeśli proces zostanie zalany przez nadmierną liczbę żądań WMI, jego wydajność może ulec pogorszeniu.

Ponadto, jeśli złagodzisz 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 mogą zostać usunięte w taki sposób, aby krytyczne dane zostały ukryte przed administratorem lub aby pola, które nie są wypełniane lub powodują wyjątki, zostały dodane do pliku.

Domyślnie dostawca WMI WCF udziela uprawnienia "execute method", "provider write" i "enable account" dla administratora oraz uprawnienia "enable account" 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 przyznawać tych uprawnień określonej grupie użytkowników, powinieneś albo dezaktywować dostawcę WMI (jest on domyślnie wyłączony), albo wyłączyć dostęp dla określonej grupy użytkowników.

Ponadto przy próbie włączenia usługi WMI za pomocą konfiguracji usługa WMI może nie zostać 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 czynności.

  1. Kliknij 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, do którego chcesz kontrolować dostęp, i użyj pola wyboru Zezwalaj lub Odmów , aby skonfigurować uprawnienia.

Udzielanie uprawnień do rejestracji usługi WCF WMI dodatkowym użytkownikom

Program WCF uwidacznia dane zarządzania w usłudze WMI. Jest to możliwe dzięki hostowaniu dostawcy usługi WMI w procesie, czasami nazywanego "dostawcą odsprzężonym". Aby dane zarządzania zostały uwidocznione, konto, które rejestruje tego dostawcę, musi mieć odpowiednie uprawnienia. W systemie Windows tylko niewielki zestaw kont uprzywilejowanych może domyślnie rejestrować odłączonych dostawców. Jest to problem, ponieważ użytkownicy często chcą uwidocznić dane WMI z usługi WCF działającej w ramach konta, które nie znajduje się w zestawie domyślnym.

Aby zapewnić ten dostęp, administrator musi przyznać następujące uprawnienia dodatkowemu kontu w następującej kolejności:

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

  2. Uprawnienie do zarejestrowania dostawcy WMI odłączonego 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 SDDL (Security Descriptor Definition Language) w celu udzielenia grupie Built-In Users dostępu do przestrzeni nazw WMI "root/servicemodel". Określa on następujące listy ACL:

    • Built-In Administrator (BA) - Już miał dostęp.

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

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

    • Built-In Users (Użytkownicy) — grupa, do której ma zostać udzielony 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 dowolnym użytkownikom lub grupom

Przykład w tej sekcji przyznaje uprawnienia do rejestracji dostawcy WMI wszystkim użytkownikom lokalnym. Jeśli chcesz udzielić dostępu użytkownikowi lub grupie, która nie jest wbudowana, musisz uzyskać identyfikator zabezpieczeń (SID) tego użytkownika lub grupy. Nie ma prostego sposobu na uzyskanie 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 WCF WMI na komputerze zdalnym, musisz włączyć prywatność pakietów w narzędziach używanych do uzyskiwania dostępu. W poniższej sekcji opisano, jak to osiągnąć 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 administracyjne WMI, możesz użyć programu WMI CIM Studio w celu uzyskania dostępu do wystąpień WMI. Narzędzia znajdują się w następującym folderze:

%windir%\Program Files\Narzędzia WMI\

  1. W oknie Połącz z przestrzenią nazw: wpisz root\ServiceModel i kliknij przycisk OK.

  2. W oknie logowania do programu WMI CIM Studio kliknij przycisk Opcje >> , aby rozwinąć okno. Wybierz opcję Prywatność pakietów dla Poziom uwierzytelniania i kliknij przycisk OK.

Tester oprzyrządowania zarządzania Windows

To narzędzie jest instalowane przez system Windows. Aby go uruchomić, uruchom konsolę poleceń, wpisując cmd.exe w oknie dialogowym Start/Uruchom i kliknij przycisk OK. Następnie wpisz wbemtest.exe w oknie poleceń. Następnie zostanie uruchomione narzędzie Windows Management Instrumentation Tester.

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

  2. W nowym oknie wprowadź root\ServiceModel w polu Przestrzeń nazw i wybierz opcję Prywatność pakietów w polu Poziom uwierzytelniania. Kliknij Połącz.

Korzystanie z kodu zarządzanego

Dostęp do zdalnych wystąpień usługi WMI można również uzyskać programowo, korzystając z klas udostępnianych System.Management przez przestrzeń nazw. Poniższy przykładowy kod pokazuje, jak to zrobić.

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