Delen via


Windows Management Instrumentation gebruiken voor diagnostische gegevens

Windows Communication Foundation (WCF) toont inspectiegegevens van een service tijdens runtime via een WMI-provider (WCF Windows Management Instrumentation).

WMI inschakelen

WMI is de implementatie van de Web-Based Enterprise Management -standaard (WBEM). Zie Windows Management Instrumentation voor meer informatie over de WMI SDK. WBEM is een industriestandaard voor de wijze waarop toepassingen beheer instrumentatie beschikbaar maken voor externe beheerhulpprogramma's.

Een WMI-provider is een onderdeel dat instrumentatie tijdens runtime beschikbaar maakt via een interface die compatibel is met WBEM. Het bestaat uit een set WMI-objecten met kenmerk-/waardeparen. Paren kunnen van een aantal eenvoudige typen zijn. Beheerhulpprogramma's kunnen tijdens runtime verbinding maken met de services via de interface. WCF maakt kenmerken van services beschikbaar, zoals adressen, bindingen, gedrag en listeners.

De ingebouwde WMI-provider kan worden geactiveerd in het configuratiebestand van de toepassing. Dit wordt gedaan via het wmiProviderEnabled kenmerk van de <diagnostische gegevens> in de <sectie system.serviceModel>, zoals wordt weergegeven in de volgende voorbeeldconfiguratie.

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

Deze configuratievermelding maakt een WMI-interface beschikbaar. Beheertoepassingen kunnen nu verbinding maken via deze interface en toegang krijgen tot de beheer instrumentatie van de toepassing.

Toegang tot WMI-gegevens

WMI-gegevens kunnen op veel verschillende manieren worden geopend. Microsoft biedt WMI-API's voor scripts, Visual Basic-toepassingen, C++-toepassingen en .NET Framework. Zie WMI gebruiken voor meer informatie.

Let op

Als u de door .NET Framework geleverde methoden gebruikt om programmatisch toegang te krijgen tot WMI-gegevens, moet u er rekening mee houden dat dergelijke methoden uitzonderingen kunnen genereren wanneer de verbinding tot stand is gebracht. De verbinding wordt niet tot stand gebracht tijdens de bouw van het ManagementObject exemplaar, maar op de eerste aanvraag waarbij werkelijke gegevens worden uitgewisseld. Daarom moet u een try..catch blok gebruiken om de mogelijke uitzonderingen te ondervangen.

U kunt het tracerings- en berichtlogboekniveau wijzigen, evenals opties voor berichtregistratie voor de System.ServiceModel traceringsbron in WMI. Dit kan worden gedaan door toegang te krijgen tot het AppDomainInfo-exemplaar , waarmee deze Booleaanse eigenschappen worden weergegeven: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessagesen TraceLevel. Als u daarom een traceerlistener configureert voor berichtlogboekregistratie, maar deze opties false instelt op in de configuratie, kunt u deze true later wijzigen wanneer de toepassing wordt uitgevoerd. Hierdoor wordt de logboekregistratie van berichten tijdens runtime effectief ingeschakeld. Als u berichtlogboekregistratie in uw configuratiebestand inschakelt, kunt u dit ook tijdens runtime uitschakelen met behulp van WMI.

Houd er rekening mee dat als er geen traceringslisteners voor berichtlogboekregistratie of geen System.ServiceModel traceringslisteners voor tracering zijn opgegeven in het configuratiebestand, geen van uw wijzigingen van kracht worden, ook al worden de wijzigingen geaccepteerd door WMI. Zie Berichtregistratie configureren en Tracering configureren voor meer informatie over het correct instellen van de respectieve listeners. Het traceringsniveau van alle andere traceringsbronnen die door de configuratie zijn opgegeven, is effectief wanneer de toepassing wordt gestart en kan niet worden gewijzigd.

WCF maakt een GetOperationCounterInstanceName methode beschikbaar voor het uitvoeren van scripts. Deze methode retourneert een exemplaarnaam van het prestatiemeteritem als u deze opgeeft met een bewerkingsnaam. Uw invoer wordt echter niet gevalideerd. Als u een onjuiste bewerkingsnaam opgeeft, wordt daarom een onjuiste tellernaam geretourneerd.

De OutgoingChannel eigenschap van het Service exemplaar telt geen kanalen die door een service worden geopend om verbinding te maken met een andere service als de WCF-client met de doelservice niet wordt gemaakt binnen de Service methode.

Let op: WMI ondersteunt alleen een TimeSpan waarde tot 3 decimalen. Als uw service bijvoorbeeld een van de eigenschappen MaxValueinstelt, wordt de waarde afgekapt na 3 decimalen wanneer deze wordt weergegeven via WMI.

Beveiliging

Omdat de WCF WMI-provider de detectie van services in een omgeving toestaat, moet u uiterst voorzichtig zijn met het verlenen van toegang tot deze service. Als u de standaardtoegang voor alleen beheerders versoepelen, kunt u minder vertrouwde partijen toegang geven tot gevoelige gegevens in uw omgeving. Als u machtigingen voor externe WMI-toegang versoepelingt, kunnen overstromingsaanvallen optreden. Als een proces wordt overspoeld door overmatige WMI-aanvragen, kunnen de prestaties worden verminderd.

Als u bovendien de toegangsmachtigingen voor het MOF-bestand versoepelen, kunnen minder vertrouwde partijen het gedrag van WMI manipuleren en de objecten wijzigen die in het WMI-schema worden geladen. Velden kunnen bijvoorbeeld worden verwijderd, zodat kritieke gegevens worden verborgen voor de beheerder of dat velden die geen uitzonderingen invullen of veroorzaken, aan het bestand worden toegevoegd.

De WCF WMI-provider verleent standaard de machtiging 'execute method', 'provider write' en 'enable account' voor Beheer istrator en 'enable account' voor ASP.NET, Local Service en Network Service. Met name op niet-Windows Vista-platforms heeft het ASP.NET-account leestoegang tot de WMI ServiceModel-naamruimte. Als u deze bevoegdheden niet wilt verlenen aan een bepaalde gebruikersgroep, moet u de WMI-provider deactiveren (deze is standaard uitgeschakeld) of de toegang voor de specifieke gebruikersgroep uitschakelen.

Als u WMI via configuratie probeert in te schakelen, is WMI mogelijk niet ingeschakeld vanwege onvoldoende gebruikersbevoegdheden. Er wordt echter geen gebeurtenis naar het gebeurtenislogboek geschreven om deze fout vast te leggen.

Als u gebruikersbevoegdheden wilt wijzigen, gebruikt u de volgende stappen.

  1. Klik op Start en typ compmgmt.msc.

  2. Klik met de rechtermuisknop op Services en Toepassing/WMI-besturingselementen om Eigenschappen te selecteren.

  3. Selecteer het tabblad Beveiliging en navigeer naar de naamruimte Root/ServiceModel . Klik op de knop Beveiliging .

  4. Selecteer de specifieke groep of gebruiker die u de toegang wilt beheren en gebruik het selectievakje Toestaan of Weigeren om machtigingen te configureren.

WCF WMI-registratiemachtigingen verlenen aan extra gebruikers

WCF toont beheergegevens aan WMI. Dit doet u door een in-process WMI-provider te hosten, ook wel een 'losgekoppelde provider' genoemd. Het account dat deze provider registreert, moet over de juiste machtigingen beschikken om de beheergegevens weer te geven. In Windows kunnen alleen een kleine set bevoegde accounts standaard losgekoppelde providers registreren. Dit is een probleem omdat gebruikers vaak WMI-gegevens willen weergeven uit een WCF-service die wordt uitgevoerd onder een account dat niet in de standaardset staat.

Om deze toegang te verlenen, moet een beheerder de volgende machtigingen verlenen aan het extra account in de volgende volgorde:

  1. Machtiging voor toegang tot de WMI-naamruimte WCF.

  2. Machtiging voor het registreren van de WMI-provider die is losgekoppeld van WCF.

Toegangsmachtigingen voor WMI-naamruimten verlenen

  1. Voer het volgende PowerShell-script uit.

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

    Dit PowerShell-script maakt gebruik van SDDL (Security Descriptor Definition Language) om de groep Ingebouwde gebruikers toegang te verlenen tot de WMI-naamruimte root/servicemodel. Hiermee worden de volgende ACL's opgegeven:

    • Ingebouwde Beheer istrator (BA) - had al toegang.

    • Netwerkservice (NS): had al toegang.

    • Lokaal systeem (LS) - had al toegang.

    • Ingebouwde gebruikers : de groep waaraan u toegang wilt verlenen.

Providerregistratietoegang verlenen

  1. Voer het volgende PowerShell-script uit.

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

Toegang verlenen tot willekeurige gebruikers of groepen

In het voorbeeld in deze sectie worden WMI-providerregistratiebevoegdheden verleend aan alle lokale gebruikers. Als u toegang wilt verlenen tot een gebruiker of groep die niet is ingebouwd, moet u de beveiligings-id (SID) van die gebruiker of groep verkrijgen. Er is geen eenvoudige manier om de SID op te halen voor een willekeurige gebruiker. Een methode is om u aan te melden als de gewenste gebruiker en vervolgens de volgende shell-opdracht uit te voeren.

Whoami /user  

Zie Bekende SID's voor meer informatie.

Toegang tot externe WMI-objectexemplaren

Als u toegang wilt krijgen tot WCF WMI-exemplaren op een externe computer, moet u pakketprivacy inschakelen voor de hulpprogramma's die u gebruikt voor toegang. In de volgende sectie wordt beschreven hoe u dit kunt bereiken met behulp van WMI CIM Studio, Windows Management Instrumentation Tester en .NET SDK 2.0.

WMI CIM Studio

Als u WMI Beheer istratieve hulpprogramma's hebt geïnstalleerd, kunt u WMI CIM Studio gebruiken voor toegang tot WMI-exemplaren. De hulpprogramma's bevinden zich in de volgende map:

%windir%\Program Files\WMI Tools\

  1. Typ in het Verbinding maken naamruimte: venster root\ServiceModel en klik op OK.

  2. Klik in het aanmeldingsvenster van WMI CIM Studio op de knop Opties >> om het venster uit te vouwen. Selecteer Pakketprivacy voor verificatieniveau en klik op OK.

Windows Management Instrumentation Tester

Dit hulpprogramma is geïnstalleerd door Windows. Als u deze wilt uitvoeren, start u een opdrachtconsole door cmd.exe te typen in het dialoogvenster Start/Uitvoeren en klikt u op OK. Typ vervolgens wbemtest.exe in het opdrachtvenster. Het hulpprogramma Windows Management Instrumentation Tester wordt vervolgens gestart.

  1. Klik op de knop Verbinding maken in de rechterbovenhoek van het venster.

  2. Voer in het nieuwe venster root\ServiceModel in voor het veld Naamruimte en selecteer Pakketprivacy voor verificatieniveau. Klik op Verbinding maken.

Beheerde code gebruiken

U kunt ook programmatisch toegang krijgen tot externe WMI-exemplaren met behulp van klassen die worden geleverd door de System.Management naamruimte. In het volgende codevoorbeeld ziet u hoe u dit doet.

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