Dela via


Använda Windows Management Instrumentation för diagnostik

Windows Communication Foundation (WCF) exponerar inspektionsdata för en tjänst vid körning via en WMI-provider (Windows Management Instrumentation).

Aktivera WMI

WMI är Microsofts implementering av wbem-standarden (Web-Based Enterprise Management). Mer information om WMI SDK finns i Windows Management Instrumentation. WBEM är en branschstandard för hur program exponerar hanteringsinstrumentation för externa hanteringsverktyg.

En WMI-provider är en komponent som exponerar instrumentation vid körning via ett WBEM-kompatibelt gränssnitt. Den består av en uppsättning WMI-objekt som har attribut/värdepar. Par kan vara av ett antal enkla typer. Hanteringsverktyg kan ansluta till tjänsterna via gränssnittet vid körning. WCF exponerar attribut för tjänster som adresser, bindningar, beteenden och lyssnare.

Den inbyggda WMI-providern kan aktiveras i programmets konfigurationsfil. Detta görs via wmiProviderEnabled attributet för diagnostiken><< i avsnittet system.serviceModel>, som du ser i följande exempelkonfiguration.

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

Den här konfigurationsposten exponerar ett WMI-gränssnitt. Hanteringsprogram kan nu ansluta via det här gränssnittet och få åtkomst till programmets hanteringsinstrumentation.

Åtkomst till WMI-data

WMI-data kan nås på många olika sätt. Microsoft tillhandahåller WMI-API:er för skript, Visual Basic-program, C++-program och .NET Framework. Mer information finns i Använda WMI.

Varning

Om du använder .NET Framework-metoderna för att programmatiskt komma åt WMI-data bör du vara medveten om att sådana metoder kan utlösa undantag när anslutningen upprättas. Anslutningen upprättas inte under byggandet av instansen ManagementObject , utan på den första begäran som inbegriper faktiskt datautbyte. Därför bör du använda ett try..catch block för att fånga upp möjliga undantag.

Du kan ändra spårnings- och meddelandeloggningsnivån samt alternativ för meddelandeloggning för spårningskällan System.ServiceModel i WMI. Detta kan göras genom att komma åt AppDomainInfo-instansen, som exponerar dessa booleska egenskaper: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagesoch TraceLevel. Om du konfigurerar en spårningslyssnare för meddelandeloggning, men anger dessa alternativ till false i konfigurationen, kan du därför senare ändra dem till true när programmet körs. Detta aktiverar effektivt meddelandeloggning vid körning. Om du aktiverar meddelandeloggning i konfigurationsfilen kan du inaktivera den vid körning med hjälp av WMI.

Du bör vara medveten om att om inga meddelandeloggningsspårningslyssnare för meddelandeloggning, eller om inga System.ServiceModel spårningslyssnare har angetts i konfigurationsfilen, träder inga av dina ändringar i kraft, även om ändringarna godkänns av WMI. Mer information om hur du konfigurerar respektive lyssnare finns i Konfigurera meddelandeloggning och Konfigurera spårning. Spårningsnivån för alla andra spårningskällor som anges i konfigurationen är effektiv när programmet startar och kan inte ändras.

WCF exponerar en GetOperationCounterInstanceName metod för skript. Den här metoden returnerar ett prestandaräknareinstansnamn om du anger ett åtgärdsnamn. Den verifierar dock inte dina indata. Om du anger ett felaktigt åtgärdsnamn returneras därför ett felaktigt räknarnamn.

Egenskapen OutgoingChannel för instansen Service räknar inte kanaler som öppnats av en tjänst för att ansluta till en annan tjänst, om WCF-klienten till måltjänsten inte har skapats Service inom metoden.

Varning WMI stöder endast ett TimeSpan värde på upp till 3 decimaler. Om din tjänst till exempel anger en av dess egenskaper till MaxValuetrunkeras dess värde efter 3 decimaler när det visas via WMI.

Säkerhet

Eftersom WCF WMI-providern tillåter identifiering av tjänster i en miljö bör du vara mycket försiktig när du beviljar åtkomst till den. Om du kopplar av standardåtkomsten endast för administratörer kan du ge mindre betrodda parter åtkomst till känsliga data i din miljö. Mer specifikt, om du förlorar behörigheter för fjärr-WMI-åtkomst, kan översvämningsattacker inträffa. Om en process översvämmas av överdrivna WMI-begäranden kan dess prestanda försämras.

Om du minskar åtkomstbehörigheterna för MOF-filen kan mindre betrodda parter dessutom ändra beteendet för WMI och ändra de objekt som läses in i WMI-schemat. Fält kan till exempel tas bort så att kritiska data döljs för administratören eller att fält som inte fyller i eller orsakar undantag läggs till i filen.

WCF WMI-providern beviljar som standard behörigheten "execute method", "provider write" och "enable account" för Administratör och "aktivera konto" för ASP.NET, lokal tjänst och nätverkstjänst. I synnerhet på andra plattformar än Windows Vista har ASP.NET-kontot läsbehörighet till WMI ServiceModel-namnområdet. Om du inte vill bevilja dessa behörigheter till en viss användargrupp bör du antingen inaktivera WMI-providern (den är inaktiverad som standard) eller inaktivera åtkomst för den specifika användargruppen.

När du försöker aktivera WMI via konfigurationen kanske WMI inte är aktiverat på grund av otillräcklig användarbehörighet. Ingen händelse skrivs dock till händelseloggen för att registrera det här felet.

Om du vill ändra användarbehörighetsnivåer använder du följande steg.

  1. Klicka på Start och sedan på Kör och skriv compmgmt.msc.

  2. Högerklicka på Tjänster och Program/WMI-kontroller för att välja Egenskaper.

  3. Välj fliken Säkerhet och gå till namnområdet Root/ServiceModel . Klicka på knappen Säkerhet .

  4. Markera den specifika grupp eller användare som du vill kontrollera åtkomsten och använd kryssrutan Tillåt eller Neka för att konfigurera behörigheter.

Bevilja WCF WMI-registreringsbehörigheter till ytterligare användare

WCF exponerar hanteringsdata för WMI. Det gör den genom att vara värd för en processbaserad WMI-provider, som ibland kallas för en "frikopplad provider". För att hanteringsdata ska kunna exponeras måste kontot som registrerar den här providern ha rätt behörigheter. I Windows kan endast en liten uppsättning privilegierade konton registrera frikopplade leverantörer som standard. Det här är ett problem eftersom användare ofta vill exponera WMI-data från en WCF-tjänst som körs under ett konto som inte finns i standarduppsättningen.

För att ge den här åtkomsten måste en administratör bevilja följande behörigheter till det ytterligare kontot i följande ordning:

  1. Behörighet att komma åt WMI-namnområdet WCF.

  2. Behörighet att registrera WCF-frikopplad WMI-provider.

Bevilja åtkomstbehörighet för WMI-namnområde

  1. Kör följande PowerShell-skript.

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

    Det här PowerShell-skriptet använder SDDL (Security Descriptor Definition Language) för att ge gruppen Inbyggda användare åtkomst till WMI-namnområdet "root/servicemodel". Den anger följande ACL:er:

    • Inbyggd administratör (BA) – hade redan åtkomst.

    • Nätverkstjänst (NS) – hade redan åtkomst.

    • Lokalt system (LS) – hade redan åtkomst.

    • Inbyggda användare – gruppen som du vill bevilja åtkomst till.

Så här beviljar du åtkomst till providerregistrering

  1. Kör följande PowerShell-skript.

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

Bevilja åtkomst till godtyckliga användare eller grupper

Exemplet i det här avsnittet ger alla lokala användare behörighet att registrera WMI-providern. Om du vill bevilja åtkomst till en användare eller grupp som inte är inbyggd måste du hämta användarens eller gruppens säkerhetsidentifierare (SID). Det finns inget enkelt sätt att hämta SID för en godtycklig användare. En metod är att logga in som önskad användare och sedan utfärda följande gränssnittskommando.

Whoami /user  

Mer information finns i Välkända SID:er.

Åtkomst till fjärrinstanser av WMI-objekt

Om du behöver komma åt WCF WMI-instanser på en fjärrdator måste du aktivera paketsekretess för de verktyg som du använder för åtkomst. I följande avsnitt beskrivs hur du uppnår dessa med hjälp av WMI CIM Studio, Windows Management Instrumentation Tester samt .NET SDK 2.0.

WMI CIM Studio

Om du har installerat WMI Administrationsverktyg kan du använda WMI CIM Studio för att komma åt WMI-instanser. Verktygen finns i följande mapp:

%windir%\Program Files\WMI Tools\

  1. I fönstret Anslut till namnrymd: skriver du root\ServiceModel och klickar på OK.

  2. I fönstret WMI CIM Studio-inloggning klickar du på knappen Alternativ >> för att expandera fönstret. Välj Paketsekretess för autentiseringsnivå och klicka på OK.

Testare för Windows-hanteringsinstrumentation

Det här verktyget installeras av Windows. Kör den genom att starta en kommandokonsol genom att skriva cmd.exe i dialogrutan Starta/kör och klicka på OK. Skriv sedan wbemtest.exe i kommandofönstret. Verktyget Testverktyg för Windows Management Instrumentation startas sedan.

  1. Klicka på knappen Anslut längst upp till höger i fönstret.

  2. I det nya fönstret anger du root\ServiceModel för fältet Namnområde och väljer Paketsekretess för autentiseringsnivå. Klicka på Anslut.

Använda hanterad kod

Du kan också komma åt fjärr-WMI-instanser programmatiskt med hjälp av klasser som tillhandahålls av System.Management namnområdet. Följande kodexempel visar hur du gör detta.

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