Megosztás a következőn keresztül:


A Windows Management Instrumentation használata diagnosztikához

A Windows Communication Foundation (WCF) futásidőben elérhetővé teszi a szolgáltatás vizsgálati adatait egy WCF Windows Management Instrumentation (WMI) szolgáltatón keresztül.

A WMI engedélyezése

A WMI a Microsoft Web-Based Enterprise Management (WBEM) szabvány implementálása. A WMI SDK-val kapcsolatos további információkért lásd: Windows Management Instrumentation. A WBEM egy iparági szabvány arra vonatkozóan, hogy az alkalmazások hogyan teszik elérhetővé a felügyeleti rendszerállapotokat a külső felügyeleti eszközök számára.

A WMI-szolgáltató egy olyan összetevő, amely futásidőben elérhetővé teszi a rendszerállapotot egy WBEM-kompatibilis felületen keresztül. Attribútum/érték párokkal rendelkező WMI-objektumok halmazából áll. A párok számos egyszerű típusúak lehetnek. A felügyeleti eszközök futásidőben csatlakozhatnak a szolgáltatásokhoz a felületen keresztül. A WCF olyan szolgáltatások attribútumait teszi elérhetővé, mint a címek, kötések, viselkedések és figyelők.

A beépített WMI-szolgáltató az alkalmazás konfigurációs fájljában aktiválható. Ez a wmiProviderEnableddiagnosztika> attribútumán< keresztül történik a <system.serviceModel> szakaszban, ahogy az az alábbi mintakonfigurációban látható.

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

Ez a konfigurációs bejegyzés egy WMI-felületet tesz elérhetővé. A felügyeleti alkalmazások mostantól ezen az interfészen keresztül csatlakozhatnak, és hozzáférhetnek az alkalmazás felügyeleti rendszerállapotához.

WMI-adatok elérése

A WMI-adatok számos különböző módon érhetők el. A Microsoft WMI API-kat biztosít szkriptekhez, Visual Basic-alkalmazásokhoz, C++ alkalmazásokhoz és a .NET-keretrendszerhez. További információ: WMI-használata.

Figyelmeztetés

Ha a .NET-keretrendszer által biztosított metódusokat használja a WMI-adatok programozott eléréséhez, vegye figyelembe, hogy ezek a metódusok kivételeket okozhatnak a kapcsolat létrejöttekor. A kapcsolat nem a példány felépítése ManagementObject során jön létre, hanem az első kérésre, amely tényleges adatcserét tartalmaz. Ezért blokkot kell használnia try..catch a lehetséges kivételek elkapásához.

Módosíthatja a nyomkövetési és üzenetnaplózási szintet, valamint a System.ServiceModel nyomkövetési forrás üzenetnaplózási beállításait a WMI-ben. Ezt az AppDomainInfo példány elérésével teheti meg, amely a következő logikai tulajdonságokat teszi elérhetővé: LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, és TraceLevel. Ezért ha konfigurál egy nyomkövetési figyelőt az üzenetnaplózáshoz, és ezeket a beállításokat false értékre állítja be a konfigurációban, később megváltoztathatja őket true értékre, amikor az alkalmazás fut. Ez hatékonyan engedélyezi az üzenetnaplózást futásidőben. Hasonlóképpen, ha engedélyezi az üzenetnaplózást a konfigurációs fájlban, futtatáskor letilthatja azt a WMI használatával.

Vegye figyelembe, hogy ha a konfigurációs fájlban nincs megadva üzenetnaplózási nyomkövetésfigyelő az üzenetek naplózásához, vagy nincs System.ServiceModel megadva nyomkövetési figyelő a nyomkövetéshez, akkor a módosítások egyike sem lép érvénybe, még akkor sem, ha a WMI elfogadja a módosításokat. A megfelelő figyelők megfelelő beállításával kapcsolatos további információkért lásd: Üzenetnaplózás konfigurálása és Nyomkövetés konfigurálása. A konfiguráció által megadott összes többi nyomkövetési forrás nyomkövetési szintje az alkalmazás indításakor érvényes, és nem módosítható.

A WCF elérhetővé tesz egy GetOperationCounterInstanceName metódust a szkriptekhez. Ez a metódus egy teljesítményszámlálópéldány nevét adja vissza, ha műveletnevet ad meg neki. Ez azonban nem érvényesíti a bevitelt. Ezért ha helytelen műveletnevet ad meg, a rendszer helytelen számlálónevet ad vissza.

A OutgoingChannel példány tulajdonsága Service nem számolja a szolgáltatás által megnyitott csatornákat egy másik szolgáltatáshoz való csatlakozáshoz, ha a WCF-ügyfél és a célszolgáltatás nem jön létre a Service metóduson belül.

Figyelmeztet A WMI csak legfeljebb 3 tizedesjegyes értéket támogat.TimeSpan Ha például a szolgáltatás az egyik tulajdonságát a következőre MaxValueállítja be, az értéke 3 tizedesjegy után csonkolódik a WMI-n keresztül.

Biztonság

Mivel a WCF WMI-szolgáltató lehetővé teszi a szolgáltatások felderítését egy környezetben, rendkívül óvatosan kell eljárnia a hozzáférés megadásakor. Ha lazít az alapértelmezett rendszergazdai hozzáférésen, engedélyezheti a kevésbé megbízható felek számára a környezet bizalmas adataihoz való hozzáférést. Pontosabban, ha fellazítja a távoli WMI-hozzáférés engedélyeit, elárasztó támadások léphetnek fel. Ha egy folyamatot elárasztanak a túlzott WMI-kérések, a teljesítménye romolhat.

Ezenkívül, ha lazít a MOF-fájl hozzáférési engedélyein, a kevésbé megbízható felek módosíthatják a WMI viselkedését, és módosíthatják a WMI-sémába betöltött objektumokat. A mezők eltávolíthatók például úgy, hogy a fontos adatok el legyenek rejtve a rendszergazda elől, vagy hogy a nem feltöltődő vagy kivételeket okozó mezők kerüljenek a fájlba.

Alapértelmezés szerint a WCF WMI-szolgáltató "végrehajtási módszer", "szolgáltatói írás" és "fiók engedélyezése" engedélyt ad a rendszergazdának, valamint a "fiók engedélyezése" engedélyt a ASP.NET, a helyi szolgáltatáshoz és a hálózati szolgáltatáshoz. Különösen a nem Windows Vista platformokon a ASP.NET fiók olvasási hozzáféréssel rendelkezik a WMI ServiceModel névtérhez. Ha nem kívánja megadni ezeket a jogosultságokat egy adott felhasználói csoportnak, inaktiválja a WMI-szolgáltatót (alapértelmezés szerint le van tiltva), vagy tiltsa le az adott felhasználói csoport hozzáférését.

Ezenkívül, ha a WMI-t a konfiguráción keresztül próbálja engedélyezni, előfordulhat, hogy a WMI nem engedélyezve van, mert nem megfelelő felhasználói jogosultság. A hiba rögzítésére azonban nem ír esemény az eseménynaplóba.

A felhasználói jogosultsági szintek módosításához kövesse az alábbi lépéseket.

  1. Kattintson a Start gombra, majd a Futtatás gombra, és írja be a compmgmt.msc parancsot.

  2. Kattintson a jobb gombbal a Szolgáltatások és az Alkalmazás/WMI-vezérlők elemre a Tulajdonságok kiválasztásához.

  3. Válassza a Biztonság lapot, és keresse meg a Root/ServiceModel névteret. Kattintson a Biztonság gombra.

  4. Válassza ki azt a csoportot vagy felhasználót, amelynek hozzáférését szabályozni szeretné, és az Engedélyezés vagy a Megtagadás jelölőnégyzettel konfigurálja az engedélyeket.

WCF WMI regisztrációs engedélyek megadása további felhasználóknak

A WCF elérhetővé teszi a felügyeleti adatokat a WMI számára. Ezt egy folyamatban lévő WMI-szolgáltató üzemeltetésével teszi, amelyet néha "leválasztott szolgáltatónak" is neveznek. A felügyeleti adatok elérhetővé tételéhez a szolgáltatót regisztráló fióknak rendelkeznie kell a megfelelő engedélyekkel. A Windows rendszerben alapértelmezés szerint csak a kiemelt jogosultságú fiókok kis halmaza regisztrálhatja a leválasztott szolgáltatókat. Ez azért probléma, mert a felhasználók gyakran szeretnék elérhetővé tenni a WMI-adatokat egy olyan WCF-szolgáltatásból, amely nem szerepel az alapértelmezett készletben.

A hozzáférés biztosításához a rendszergazdának a következő engedélyeket kell megadnia a további fióknak a következő sorrendben:

  1. Engedély a WCF WMI-névtérhez való hozzáféréshez.

  2. Engedély a WCF leválasztott WMI-szolgáltató regisztrálására.

WMI-névtér-hozzáférési engedély megadása

  1. Futtassa a következő PowerShell-szkriptet.

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

    Ez a PowerShell-szkript a Security Descriptor Definition Language (SDDL) használatával hozzáférést biztosít a Built-In Users csoportnak a "root/servicemodel" WMI-névtérhez. A következő ACL-eket adja meg:

    • Built-In rendszergazda (BA) – már rendelkezett hozzáféréssel.

    • Hálózati szolgáltatás (NS) - már rendelkezett hozzáféréssel.

    • Helyi rendszer (LS) - már rendelkezett hozzáféréssel.

    • Built-In Felhasználók – Az a csoport, amelyhez hozzáférést szeretne adni.

Szolgáltatói regisztrációs hozzáférés megadása

  1. Futtassa a következő PowerShell-szkriptet.

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

Hozzáférés biztosítása tetszőleges felhasználóknak vagy csoportoknak

Az ebben a szakaszban található példa WMI-szolgáltató regisztrációs jogosultságokat biztosít az összes helyi felhasználó számára. Ha nem beépített felhasználónak vagy csoportnak szeretne hozzáférést adni, akkor be kell szereznie a felhasználó vagy csoport biztonsági azonosítóját (SID). Nincs egyszerű módja annak, hogy egy tetszőleges felhasználó számára megkapja a biztonsági azonosítót. Az egyik módszer az, hogy bejelentkezik a kívánt felhasználóként, majd kiadja a következő parancsértelmező parancsot.

Whoami /user  

További információ: Jól ismert biztonsági azonosítók.

Távoli WMI-objektumpéldányok elérése

Ha távoli gépen kell hozzáférnie a WCF WMI-példányokhoz, engedélyeznie kell a csomagvédelem védelmét a hozzáféréshez használt eszközökön. A következő szakasz azt ismerteti, hogyan érheti el ezeket a WMI CIM Studio, a Windows Management Instrumentation Tester és a .NET SDK 2.0 használatával.

WMI CIM Stúdió

Ha telepítette a WMI felügyeleti eszközöket, a WMI CIM Studio segítségével elérheti a WMI-példányokat. Az eszközök a következő mappában találhatók:

%windir%\Program Files\WMI Tools\

  1. A Csatlakozás névtérhez: ablakba írja be a root\ServiceModel parancsot, majd kattintson az OK gombra.

  2. A WMI CIM Studio bejelentkezési ablakában kattintson a Beállítások >> gombra az ablak kibontásához. Válassza a Csomag adatvédelme lehetőséget a Hitelesítési szint mezőben, majd kattintson az OK gombra.

Windows Management Instrumentation tesztelő

Ezt az eszközt a Windows telepíti. A futtatáshoz indítson el egy parancskonzolt úgy, hogy beírja a cmd.exe parancsot a Start/Futtatás párbeszédpanelen, majd kattintson az OK gombra. Ezután írja be wbemtest.exe parancsot a parancsablakba. Ezután elindul a Windows Management Instrumentation Tester eszköz.

  1. Kattints a Csatlakozás gombot az ablak jobb felső sarkában.

  2. Az új ablakban írja be a root\ServiceModel nevet a Névtér mezőbe, és válassza a Csomag adatvédelme lehetőséget a Hitelesítési szinthez. Kattintson a Csatlakozás gombra.

Felügyelt kód használata

A távoli WMI-példányokat programozott módon is elérheti a System.Management névtér által biztosított osztályok használatával. Az alábbi kódminta bemutatja, hogyan teheti ezt meg.

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