Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Windows Communication Foundation (WCF) exponerar inspektionsdata för en tjänst vid körning via en WCF WMI-provider (Windows Management Instrumentation).
Aktivera WMI
WMI är Microsofts implementering av standarden Web-Based Enterprise Management (WBEM). 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ärde-par. 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 konfigurationsfilen för programmet. Detta görs via attributet wmiProviderEnabled 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 Using WMI.
Försiktighet
Om du använder de .NET Framework metoder som tillhandahålls 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 uppbyggnaden av instansen ManagementObject , utan vid den första begäran som omfattar 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 System.ServiceModel spårningskällan i WMI. Detta kan göras genom att komma åt instansen AppDomainInfo , 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 spårningslyssnare för meddelandeloggning för meddelandeloggning eller inga System.ServiceModel spårningslyssnare för spårning anges i konfigurationsfilen, börjar inga av dina ändringar gälla, även om ändringarna accepteras av WMI. Mer information om hur du konfigurerar respektive lyssnare på rätt sätt finns i Konfigurera meddelandeloggning och Konfigurera spårning. Spårningsnivån för alla andra spårningskällor som anges av konfigurationen gäller när programmet startar och kan inte ändras.
WCF exponerar en GetOperationCounterInstanceName metod för skript. Den här metoden returnerar ett instansnamn för prestandaräknaren om du anger ett åtgärdsnamn. Det validerar 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 öppnas av en tjänst för att ansluta till en annan tjänst, om WCF-klienten till måltjänsten inte skapas i Service metoden.
Försiktighet 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 MaxValue, trunkeras 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 slappnar av standardåtkomsten för administratörer kan du ge mindre betrodda parter åtkomst till känsliga data i din miljö. Mer specifikt, om du lossar 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 lättar på åtkomstbehörigheterna för MOF-filen kan dessutom mindre betrodda parter manipulera WMI:s beteende 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 fylls i eller orsakar undantag läggs till i filen.
Som standard beviljar WCF WMI-providern behörigheten "körningsmetod", "providerskrivning" och "aktivera konto" för administratören och behörigheten "aktivera konto" för ASP.NET, den lokala tjänsten och nätverkstjänsten. I synnerhet på icke-Windows Vista-plattformar har ASP.NET-kontot läsbehörighet till WMI ServiceModel-namnområdet. Om du inte vill ge 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.
Dessutom, när du försöker aktivera WMI via konfiguration, kanske WMI inte aktiveras på grund av otillräcklig användarbehörighet. Ingen händelse skrivs dock till händelseloggen för att registrera det här felet.
Använd följande steg för att ändra användarbehörighetsnivåer.
Klicka på Start och sedan på Kör och skriv compmgmt.msc.
Högerklicka på Tjänster och Program-/WMI-kontroller för att välja Egenskaper.
Välj fliken Säkerhet och gå till namnområdet Root/ServiceModel . Klicka på knappen Säkerhet .
Välj den specifika grupp eller användare som du vill styra åtkomsten till 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 pågående WMI-provider, som ibland kallas för en "frikopplad provider". För att hanteringsdata ska exponeras måste det konto som registrerar den här providern ha rätt behörigheter. I Windows kan endast en liten uppsättning privilegierade konton registrera frikopplade providers 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:
Behörighet att komma åt WCF WMI-namnområdet.
Behörighet att registrera den fristående WCF-WMI-providern.
Så här beviljar du åtkomstbehörighet för WMI-namnområde
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 Built-In användare åtkomst till WMI-namnområdet "root/servicemodel". Den anger följande ACL:er:
Built-In Administrator (BA) – har redan åtkomst.
Nätverkstjänst (NS) – hade redan åtkomst.
Lokalt system (LS) - hade redan åtkomst.
Built-In Användare – Gruppen som åtkomst ska beviljas.
Så här beviljar du åtkomst till providerregistrering
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 registreringsbehörighet för WMI-providern till alla lokala användare. 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 skalkommando.
Whoami /user  
Mer information finns i Välkända SID:er.
Åtkomst till fjärranslutna WMI-objektinstanser
Om du behöver åtkomst till WCF WMI-instanser på en fjärrdator måste du aktivera paketsekretess på 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 och .NET SDK 2.0.
WMI CIM Studio
Om du har installerat administrationsverktyg för WMI kan du använda WMI CIM Studio för att få åtkomst till WMI-instanser. Verktygen finns i följande mapp:
%windir%\ Program \ WMI Tools\
I fönstret Anslut till namnområde: skriver du root\ServiceModel och klickar på OK.
I inloggningsfönstret för WMI CIM Studio klickar du på knappen Alternativ >> för att expandera fönstret. Välj Paketsekretess som Autentiseringsnivå och klicka på OK.
Testare för Windows Management Instrumentation
Det här verktyget installeras av Windows. För att köra den, 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 Windows Management Instrumentation Tester startas sedan.
Klicka på knappen Anslut i det övre högra hörnet av fönstret.
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ärranslutna WMI-instanser programmatiskt med hjälp av klasser som System.Management tillhandahålls av 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);