Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 wmiProviderEnabled
diagnosztika> 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.
Kattintson a Start gombra, majd a Futtatás gombra, és írja be a compmgmt.msc parancsot.
Kattintson a jobb gombbal a Szolgáltatások és az Alkalmazás/WMI-vezérlők elemre a Tulajdonságok kiválasztásához.
Válassza a Biztonság lapot, és keresse meg a Root/ServiceModel névteret. Kattintson a Biztonság gombra.
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:
Engedély a WCF WMI-névtérhez való hozzáféréshez.
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
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
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\
A Csatlakozás névtérhez: ablakba írja be a root\ServiceModel parancsot, majd kattintson az OK gombra.
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.
Kattints a Csatlakozás gombot az ablak jobb felső sarkában.
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);