Diagnostika prostřednictvím rozhraní WMI (Windows Management Instrumentation)

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

Povolení rozhraní WMI

WMI je implementace standardu WBEM (Web-Based Enterprise Management) společnosti Microsoft. 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ů a hodnot. Páry můžou mít řadu 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, vazby, chování a naslouchací procesy.

Integrovaný zprostředkovatel rozhraní WMI je možné aktivovat v konfiguračním souboru aplikace. To se provádí prostřednictvím wmiProviderEnabled atributu <diagnostiky> 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 rozhraní 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 rozhraní .NET Framework poskytnuté metody pro programový přístup k datům rozhraní WMI, měli byste vědět, že tyto metody mohou vyvolat výjimky při navázání připojení. Připojení není vytvořeno během vytváření instance, ale při prvním požadavku zahrnujícím skutečnou ManagementObject výměnu dat. Proto byste měli použít try..catch blok k zachycení možnýchvýjimekch

Můžete změnit úroveň protokolování trasování a zpráv a také možnosti protokolování zpráv pro System.ServiceModel zdroj trasování ve službě WMI. To lze provést přístupem k AppDomainInfo instance, která zveřejňuje tyto logické vlastnosti: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagesa TraceLevel. Proto pokud nakonfigurujete naslouchací proces 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 umožní protokolování zpráv za běhu. Podobně pokud v konfiguračním souboru povolíte protokolování zpráv, můžete ho zakázat za běhu pomocí rozhraní WMI.

Měli byste vědět, že pokud v konfiguračním souboru nejsou zadány žádné naslouchací procesy trasování protokolování zpráv nebo nejsou v konfiguračním souboru zadány žádné System.ServiceModel naslouchací procesy trasování zpráv, neprojeví se žádné změny, i když rozhraní WMI přijme změny. Další informace o správném nastavení příslušných naslouchacích procesů najdete v tématu Konfigurace protokolování zpráv a konfigurace trasování. Úroveň trasování všech ostatních zdrojů trasování určených konfigurací je platná při spuštění aplikace a nelze ji změnit.

WCF zveřejňuje metodu GetOperationCounterInstanceName pro skriptování. Tato metoda vrátí název instance čítače výkonu, pokud ji zadáte s názvem operace. Neověřuje ale váš vstup. Proto pokud 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 k cílové službě není vytvořen v rámci Service metody.

Upozornění rozhraní WMI podporuje TimeSpan pouze hodnotu až 3 desetinná místa. Pokud například vaše služba nastaví jednu z jejích vlastností MaxValuena , její hodnota se zkrátí po 3 desetinných bodech při zobrazení prostřednictvím rozhraní WMI.

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 jen pro správce, můžete povolit méně důvěryhodným stranám přístup k citlivým datům ve vašem prostředí. Konkrétně pokud povolíte oprávnění ke vzdálenému přístupu rozhraní WMI, může dojít k útokům na záplavy. Pokud je proces zahlcený nadměrnými požadavky rozhraní WMI, může být jeho výkon degradován.

Pokud navíc uvolníte přístupová oprávnění pro soubor MOF, můžou méně důvěryhodné strany manipulovat s chováním rozhraní WMI a měnit objekty načtené ve schématu WMI. Pole lze například odebrat tak, aby důležitá data byla skryta od správce nebo že pole, která nenaplní nebo způsobují výjimky, se do souboru přidají.

Ve výchozím nastavení poskytovatel služby WMI WCF uděluje oprávnění "execute method", "provider write" a "enable account" pro Správa istrator a "enable account" oprávnění pro ASP.NET, Local Service a Network Service. Konkrétně na platformách windows Vista má účet ASP.NET přístup pro čtení k oboru názvů WMI ServiceModel. Pokud tato oprávnění nechcete udělit konkrétní skupině uživatelů, měli byste buď deaktivovat zprostředkovatele WMI (ve výchozím nastavení je zakázaný), nebo zakázat přístup pro konkrétní skupinu uživatelů.

Kromě toho při pokusu o povolení rozhraní WMI prostřednictvím konfigurace nemusí být rozhraní WMI povolené kvůli nedostatečným uživatelským oprávněním. Do protokolu událostí se ale zapisuje žádná událost, která by zaznamenala toto selhání.

Pokud chcete upravit úrovně oprávnění uživatele, postupujte následovně.

  1. Klepněte na tlačítko Start a potom spustit a zadejte compmgmt.msc.

  2. Po kliknutí pravým tlačítkem myši na služby a ovládací prvky rozhraní WMI vyberte 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, který 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í pro registraci rozhraní WMI WCF dalším uživatelům

WCF zveřejňuje data správy rozhraní WMI. Dělá to tak, že hostuje poskytovatele rozhraní WMI v procesu, který se někdy označuje jako "oddělený poskytovatel". Aby bylo možné zobrazit data správy, musí mít účet, který zaregistruje tohoto poskytovatele, příslušná oprávnění. Ve Windows může ve výchozím nastavení registrovat oddělené poskytovatele pouze malá sada privilegovaných účtů. Jedná se o problém, protože uživatelé běžně chtějí zveřejnit data rozhraní WMI ze služby WCF spuštěné pod účtem, který není ve výchozí sadě.

Pokud chcete tento přístup poskytnout, musí správce udělit dalšímu účtu 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 WCF.

  2. Oprávnění k registraci oddělovaného zprostředkovatele služby WMI WCF

Udělení oprávnění k přístupu k oboru názvů rozhraní 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 ke skupině Předdefinovaných uživatelů přístup k oboru názvů rozhraní WMI root/servicemodel. Určuje následující seznamy ACL:

    • Integrovaný Správa istrator (BA) – již měl přístup.

    • Síťová služba (NS) – již měla přístup.

    • Místní systém (LS) – již měl přístup.

    • Předdefinovaní uživatelé – skupina, ke které chcete udělit 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 všem místním uživatelům oprávnění pro registraci zprostředkovatele rozhraní WMI. Pokud chcete udělit přístup uživateli nebo skupině, která není integrovaná, musíte získat identifikátor zabezpečení daného uživatele nebo skupiny (SID). 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 pak vydat následující příkaz prostředí.

Whoami /user  

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

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

Pokud potřebujete přistupovat k instancím služby WMI WCF 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í nástroje WMI CIM Studio, nástroje Windows Management Instrumentation Tester a sady .NET SDK 2.0.

WMI CIM Studio

Pokud jste nainstalovali WMI Správa istrative Tools, můžete k přístupu k instancím rozhraní WMI CIM Studio použít WMI CIM Studio. Nástroje jsou v následující složce:

%windir%\Program Files\WMI Tools\

  1. V Připojení oboru názvů: okno zadejte root\ServiceModel a klepněte na tlačítko OK.

  2. V okně přihlášení k aplikaci WMI CIM Studio klikněte na tlačítko Možnosti >> a rozbalte okno. Vyberte úroveň ochrany osobních údajů paketů pro úroveň ověřování a klikněte na tlačítko OK.

Windows Management Instrumentation Tester

Tento nástroj je nainstalován systémem Windows. Chcete-li ji spustit, spusťte konzolu příkazů zadáním cmd.exe v dialogovém okně Start/Spustit a klepněte na tlačítko OK. Potom do příkazového okna zadejte wbemtest.exe . Nástroj Windows Management Instrumentation Tester se pak spustí.

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

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

Použití spravovaného kódu

Ke vzdáleným instancím rozhraní 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);