Sdílet prostřednictvím


Použití služby Windows Management Instrumentation pro diagnostiku

Windows Communication Foundation (WCF) zveřejňuje kontrolní data služby za běhu prostřednictvím zprostředkovatele WMI (WCF Windows Management Instrumentation).

Povolení služby WMI

WMI je implementace standardu Web-Based Enterprise Management (WBEM) od Microsoftu. Další informace o sadě WMI SDK naleznete v tématu Windows Management Instrumentation. WBEM je oborový standard pro to, jak aplikace zpřístupňují instrumentaci správy externím nástrojům pro správu.

Zprostředkovatel rozhraní WMI je komponenta, která zveřejňuje instrumentaci za běhu prostřednictvím rozhraní kompatibilního s WBEM. Skládá se ze sady objektů WMI, které mají páry atribut/hodnota. Páry mohou být několika jednoduchých typů. Nástroje pro správu se můžou připojit ke službám prostřednictvím rozhraní za běhu. WCF zveřejňuje atributy služeb, jako jsou adresy, sídla, chování a posluchače.

Vestavěný zprostředkovatel WMI lze aktivovat v konfiguračním souboru aplikace. To se provádí prostřednictvím atributu wmiProviderEnableddiagnostiky<> v <části system.serviceModel>, jak je znázorněno v následující ukázkové konfiguraci.

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

Tato položka konfigurace zveřejňuje rozhraní WMI. Aplikace pro správu se teď můžou prostřednictvím tohoto rozhraní připojit a získat přístup k instrumentaci správy aplikace.

Přístup k datům WMI

K datům rozhraní WMI je možné přistupovat mnoha různými způsoby. Microsoft poskytuje rozhraní WMI API pro skripty, aplikace jazyka Visual Basic, aplikace jazyka C++ a rozhraní .NET Framework. Další informace naleznete v tématu Použití rozhraní WMI.

Upozornění

Pokud používáte metody poskytované rozhraním .NET Framework pro programový přístup k datům rozhraní WMI, měli byste si být vědomi toho, že tyto metody mohou při navázání připojení vyvolat výjimky. Spojení není navázáno během výstavby ManagementObject instance, ale při prvním požadavku zahrnujícím vlastní výměnu dat. Proto byste měli použít try..catch blok k zachycení možných výjimek.

Můžete změnit úroveň protokolování trasování a zpráv a také možnosti protokolování System.ServiceModel zpráv pro zdroj trasování ve službě WMI. To lze provést přístupem k instanci AppDomainInfo , která zpřístupňuje tyto logické vlastnosti: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagesa TraceLevel. Proto pokud nakonfigurujete posluchač trasování pro protokolování zpráv, ale tyto možnosti nastavíte v false konfiguraci, můžete je později změnit na true při spuštění aplikace. To efektivně povolí protokolování zpráv za běhu. Podobně pokud v konfiguračním souboru povolíte protokolování zpráv, můžete ho za běhu zakázat pomocí rozhraní WMI.

Měli byste si být vědomi toho, že pokud v konfiguračním souboru nejsou zadány žádné posluchače trasování protokolování zpráv pro protokolování zpráv nebo žádné System.ServiceModel posluchače trasování pro trasování, žádná z vašich změn se neprojeví, i když jsou změny přijaty službou WMI. Další informace o správném nastavení příslušných naslouchacích procesů naleznete v části Konfigurace protokolování zpráv a konfigurace trasování. Úroveň trasování všech ostatních zdrojů trasování určená konfigurací je účinná při spuštění aplikace a nelze ji změnit.

WCF zpřístupňuje GetOperationCounterInstanceName metodu pro skriptování. Tato metoda vrátí název instance čítače výkonu, pokud jí poskytnete název operace. Neověřuje však váš vstup. Pokud tedy zadáte nesprávný název operace, vrátí se nesprávný název čítače.

Vlastnost OutgoingChannelService instance nepočítá kanály otevřené službou pro připojení k jiné službě, pokud klient WCF pro cílovou službu není vytvořen v rámci Service metody.

Opatrnost Služba WMI podporuje pouze hodnotu s přesností TimeSpan na 3 desetinná místa. Pokud například vaše služba nastaví jednu ze svých vlastností na MaxValue, bude její hodnota při zobrazení prostřednictvím rozhraní WMI zkrácena o 3 desetinná místa.

Zabezpečení

Vzhledem k tomu, že poskytovatel rozhraní WMI WCF umožňuje zjišťování služeb v prostředí, měli byste při udělování přístupu k němu postupovat velmi opatrně. Pokud uvolníte výchozí přístup pouze pro správce, můžete povolit přístup k citlivým datům ve vašem prostředí méně důvěryhodným stranám. Konkrétně platí, že pokud uvolníte oprávnění pro vzdálený přístup ke službě WMI, může dojít k útokům zahlcení. Pokud je proces zahlcen nadměrným množstvím požadavků rozhraní WMI, může dojít ke snížení jeho výkonu.

Pokud navíc uvolníte přístupová oprávnění pro soubor MOF, mohou méně důvěryhodné strany manipulovat s chováním rozhraní WMI a měnit objekty, které jsou načteny ve schématu WMI. Pole lze například odebrat tak, aby byla důležitá data skryta před správcem nebo aby byla do souboru přidána pole, která se nenaplní nebo nezpůsobí výjimky.

Ve výchozím nastavení poskytovatel rozhraní WMI WCF uděluje oprávnění "metoda spuštění", "zápis poskytovatele" a "povolení účtu" pro správce a oprávnění "povolit účet" pro ASP.NET, místní službu a síťovou službu. Konkrétně na platformách jiných než Windows Vista má účet ASP.NET přístup pro čtení k oboru názvů WMI ServiceModel. Pokud nechcete udělit tato oprávnění určité skupině uživatelů, měli byste buď deaktivovat poskytovatele WMI (ve výchozím nastavení je zakázán), nebo zakázat přístup pro konkrétní skupinu uživatelů.

Pokud se navíc pokusíte povolit službu WMI prostřednictvím konfigurace, nemusí být služba WMI povolena z důvodu nedostatečných uživatelských oprávnění. Do protokolu událostí se však nezapisuje žádná událost, která by tuto chybu zaznamenala.

Chcete-li upravit úrovně oprávnění uživatele, postupujte následovně.

  1. Klikněte na Start a poté na Spustit a zadejte compmgmt.msc.

  2. Klikněte pravým tlačítkem na položku Služby a ovládací prvky aplikace/rozhraní WMI a vyberte možnost Vlastnosti.

  3. Vyberte kartu Zabezpečení a přejděte do oboru názvů Root/ServiceModel . Klikněte na tlačítko Zabezpečení .

  4. Vyberte konkrétní skupinu nebo uživatele, ke kterému chcete řídit přístup, a pomocí zaškrtávacího políčka Povolit nebo Odepřít nakonfigurujte oprávnění.

Udělení oprávnění k registraci služby WMI služby WCF dalším uživatelům

WCF zpřístupňuje data správy rozhraní WMI. Dělá to tak, že hostuje vnitroprocesového poskytovatele rozhraní WMI, někdy označovaného jako "oddělený poskytovatel". Aby mohla být data správy zveřejněna, musí mít účet, který registruje tohoto poskytovatele, příslušná oprávnění. V systému Windows může ve výchozím nastavení oddělené poskytovatele registrovat pouze malá sada privilegovaných účtů. Jedná se o problém, protože uživatelé běžně chtějí vystavit data WMI ze služby WCF spuštěné pod účtem, který není ve výchozí sadě.

Aby mohl správce tento přístup poskytnout, musí dalšímu účtu udělit následující oprávnění v následujícím pořadí:

  1. Oprávnění pro přístup k oboru názvů služby WMI služby WCF.

  2. Oprávnění k registraci odděleného poskytovatele rozhraní WMI služby WCF.

Udělení přístupových oprávnění k oboru názvů WMI

  1. Spusťte následující skript PowerShellu.

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

    Tento skript PowerShellu používá jazyk SDDL (Security Descriptor Definition Language) k udělení přístupu skupině Built-In Users k oboru názvů WMI "root/servicemodel". Určuje následující seznamy ACL:

    • Built-In Administrator (BA) - již měl přístup.

    • Síťová služba (NS) - již byl přístup.

    • Lokální systém (LS) - již byl přístup.

    • Built-In Uživatelé – skupina, ke které má být udělen přístup.

Udělení přístupu k registraci poskytovatele

  1. Spusťte následující skript PowerShellu.

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

Udělení přístupu libovolným uživatelům nebo skupinám

Příklad v této části uděluje oprávnění k registraci poskytovatele WMI všem místním uživatelům. Pokud chcete udělit přístup uživateli nebo skupině, která není vestavěná, musíte získat identifikátor zabezpečení (SID) daného uživatele nebo skupiny. Neexistuje žádný jednoduchý způsob, jak získat identifikátor SID pro libovolného uživatele. Jednou z metod je přihlásit se jako požadovaný uživatel a poté zadat následující příkaz shellu.

Whoami /user

Další informace naleznete v tématu Dobře známé identifikátory SID.

Přístup ke vzdáleným instancím objektů WMI

Pokud potřebujete získat přístup k instancím služby WCF WMI na vzdáleném počítači, musíte povolit ochranu osobních údajů paketů v nástrojích, které používáte pro přístup. Následující část popisuje, jak toho dosáhnout pomocí WMI CIM Studio, Windows Management Instrumentation Tester a .NET SDK 2.0.

WMI CIM Studio

Pokud jste nainstalovali Nástroje pro správu WMI, můžete pro přístup k instancím WMI použít WMI CIM Studio. Nástroje jsou v následující složce:

%windir%\Program Files\WMI Tools\

  1. V okně Připojit k oboru názvů: zadejte root\ServiceModel a klikněte na tlačítko OK.

  2. V okně Přihlášení ke službě WMI CIM Studio rozbalte okno kliknutím na tlačítko Možnosti >> . Vyberte možnost Ochrana osobních údajů paketů v části Úroveň ověření a klikněte na tlačítko OK.

Tester nástrojů pro správu systému Windows

Tento nástroj je nainstalován systémem Windows. Chcete-li ji spustit, spusťte příkazovou konzoli zadáním příkazucmd.exe do dialogového okna Start/Spustit a klikněte na tlačítko OK. Poté zadejte wbemtest.exe do příkazového okna. Poté se spustí nástroj Windows Management Instrumentation Tester.

  1. Klikněte na tlačítko Připojit v pravém horním rohu okna.

  2. V novém okně zadejte root\ServiceModel do pole Obor názvů a vyberte Ochrana osobních údajů paketů pro Úroveň ověřování. Klepněte na tlačítko Připojit.

Použití spravovaného kódu

Ke vzdáleným instancím služby WMI můžete přistupovat také programově pomocí tříd poskytovaných oborem System.Management názvů. Následující ukázka kódu ukazuje, jak to provést.

String wcfNamespace = $@"\\{this.serviceMachineName}\Root\ServiceModel");

ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);