Utilisation de Windows Management Instrumentation pour les diagnostics
Windows Communication Foundation (WCF) expose au moment de l'exécution les données d'inspection d'un service par l'intermédiaire d'un fournisseur WMI (Windows Management Instrumentation) de WCF .
Activation de WMI
WMI est l'implémentation Microsoft de la norme WBEM (Web-Based Enterprise Management). Pour plus d'informations sur le Kit de développement WMI SDK, consultez MSDN Library. (https://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi\_start\_page.asp). WBEM est une norme d'industrie qui détermine comment les applications exposent l'instrumentation de gestion aux outils de gestion externes.
Un fournisseur WMI est un composant qui expose l'instrumentation au moment de l'exécution par l'intermédiaire d'une interface WBEM compatible. Il se compose d'un jeu d'objets WMI qui ont des paires attribut/valeur. Les paires peuvent être plusieurs types simples. Les outils de gestion peuvent se connecter aux services au moment de l'exécution par l'intermédiaire de l'interface. WCF expose des attributs de services tels que les adresses, les liaisons, les comportements et les écouteurs.
Le fournisseur WMI intégré peut être activé dans le fichier de configuration de l'application. Cette opération s'effectue par l'intermédiaire de l'attribut wmiProviderEnabled du <diagnostics> Element dans la section system.ServiceModel element, comme indiqué dans l'exemple de configuration suivant.
<system.serviceModel>
…
<diagnostics wmiProviderEnabled="true" />
…
</system.serviceModel>
Cette entrée de configuration expose une interface WMI. Les applications de gestion peuvent maintenant se connecter par le biais de cette interface et accéder à l'instrumentation de gestion de l'application.
Accès aux données WMI
Les données WMI sont accessibles de plusieurs façons différentes. Microsoft fournit des API WMI pour les scripts, les applications Visual Basic, les applications C++ et le .NET Framework. Pour plus d'informations, consultez Utilisation de WMI (page pouvant être en anglais).
Attention : |
---|
Si vous utilisez les méthodes fournies par le .NET Framework pour accéder par programme aux données WMI, vous devez savoir que ces méthodes peuvent lever des exceptions lorsque la connexion est établie. La connexion n'est pas établie pendant la construction de l'instance ManagementObject, mais sur la première demande qui implique l'échange concret des données. Par conséquent, vous devez utiliser un bloc try..catch pour intercepter les exceptions possibles. |
Vous pouvez modifier le niveau du suivi et de l'enregistrement des messages, ainsi que les options d'enregistrement des messages pour la source de suivi System.ServiceModel dans WMI. Pour ce faire, il suffit d'accéder à l'instance AppDomainInfo qui expose ces propriétés booléennes : LogMessagesAtServiceLevel, LogMessagesAtTransportLevel, LogMalformedMessages, et TraceLevel. Par conséquent, si vous configurez un écouteur de suivi pour l'enregistrement des messages, mais affectez la valeur false à ces options dans la configuration, vous pourrez leur affecter ultérieurement la valeur true pendant l'exécution de l'application. Ceci permet en fait d'activer l'enregistrement des messages pendant l'exécution. De la même façon, si vous activez l'enregistrement des messages dans votre fichier de configuration, vous pouvez le désactiver pendant l'exécution à l'aide de WMI.
Vous devez savoir que si aucun écouteur de suivi d'enregistrement des messages pour l'enregistrement des messages ou aucun écouteur de suivi System.ServiceModel pour le suivi n'est défini dans le fichier de configuration, aucune de vos modifications ne sont prises en compte, même si les modifications sont acceptées par WMI. Pour plus d'informations sur la configuration correcte des écouteurs respectifs, consultez Configuration de la journalisation des messages et Configuration du suivi. Le niveau de suivi de toutes les autres sources de suivi spécifiées par configuration est effectif lorsque l'application démarre, et ne peut pas être changé.
WCF expose une méthode GetOperationCounterInstanceName pour les scripts. Cette méthode retourne un nom d'instance de compteur de performance si vous lui fournissez un nom d'opération. Toutefois, elle ne valide pas votre entrée. Par conséquent, si vous fournissez un nom d'opération erroné, un nom de compteur incorrect est retourné.
La propriété OutgoingChannel de l'instance Service ne compte pas les canaux ouverts par un service pour se connecter à un autre service, si le client WCF du service de destination n'est pas créé dans la méthode Service.
Avertissement WMI prend en charge seulement une valeur TimeSpan jusqu'à 3 virgules décimales. Par exemple, si votre service affecte à l'une de ses propriétés la valeur MaxValue, sa valeur est tronquée après 3 virgules décimales lorsque elle est affichée dans WMI.
Sécurité
Comme le fournisseur WMI de WCF autorise la découverte de services dans un environnement, vous devez être très prudent avant d'en accorder l'accès. Si vous relâchez l'accès réservé aux administrateurs par défaut, vous permettez à des correspondants d'un niveau de confiance moindre d'accéder à des données sensibles dans votre environnement. En particulier, si vous relâchez les autorisations pour l'accès WMI distant, vous risquez un grand nombre d'attaques. Si un processus est inondé par des demandes WMI excessives, cela peut nuire à ses performances.
De plus, si vous relâchez les autorisations d'accès pour le fichier MOF, les correspondants d'un niveau de confiance moindre peuvent manipuler le comportement de WMI et modifier les objets chargés dans le schéma WMI. Par exemple, des champs peuvent être supprimés au point que des données critiques sont dissimulées à l'administrateur ou que des champs qui ne se remplissent pas ou lèvent des exceptions sont ajoutés au fichier.
Par défaut, le fournisseur WMI de WCF accorde les autorisations "execute method", "provider write" et "enable account" pour l'administrateur, et "enable account" pour ASP.NET, le service local et le service réseau. En particulier, sur les plateformes non Windows Vista, le compte ASP.NET a accès en lecture à l'espace de noms WMI ServiceModel. Si vous ne souhaitez pas accorder ces privilèges à un groupe d'utilisateurs particulier, vous devez désactiver le fournisseur WMI (désactivé par défaut) ou désactiver l'accès pour le groupe d'utilisateurs spécifique.
De plus, lorsque vous essayez d'activer WMI par configuration, WMI peut ne pas être activé en raison de privilège utilisateur insuffisant. Toutefois, aucun événement n'est écrit dans le journal des événements pour enregistrer cette défaillance.
Pour modifier des niveaux de privilège utilisateur, utilisez les étapes suivantes.
- Cliquez sur Démarrer puis sur Exécuter et tapez compmgmt.msc.
- Cliquez avec le bouton droit sur Services et applications/Contrôle WMI pour sélectionner Propriétés.
- Sélectionnez l'onglet Sécurité et naviguez jusqu'à l'espace de noms Root/ServiceModel. Cliquez sur le bouton Sécurité.
- Sélectionnez le groupe ou l'utilisateur spécifique dont vous souhaitez contrôler l'accès et utiliser la case à cocher Autoriser ou Refuser pour configurer des autorisations.
Accès aux instances d'objet WMI distantes
Si vous devez accéder aux instances WMI de WCF sur un ordinateur distant, vous devez activer la confidentialité de paquet sur les outils que vous utilisez pour l'accès. La section suivante décrit comment y parvenir à l'aide de WMI CIM Studio, Windows Management Instrumentation Tester, et le Kit de développement .Net SDK 2.0.
WMI CIM Studio
Si vous avez installé les outils d'administration WMI (page pouvant être en anglais), vous pouvez utiliser WMI CIM Studio pour accéder aux instances WMI. Les outils sont dans le dossier suivant
%windir%\Program Files\WMI Tools\
- Dans la fenêtre Se connecter à l'espace de noms :, tapez root\ServiceModel et cliquez sur OK.
- Dans la fenêtre WMI CIM Studio Login, cliquez sur le bouton Options >> pour développer la fenêtre. Sélectionnez Confidentialité du paquet pour Niveau d'authentificationet cliquez sur OK.
Windows Management Instrumentation Tester
Cet outil est installé par Windows. Pour l'exécuter, lancez une console de commande en tapant cmd.exe dans la boîte de dialogue Démarrer/Exécuter et cliquez sur OK. Puis, tapez wbemtest.exe dans la fenêtre de commande. Puis l'outil Windows Management Instrumentation Tester est lancé.
- Cliquez sur le bouton Connecter dans le coin supérieur droit de la fenêtre.
- Dans la nouvelle fenêtre, entrez root\ServiceModel pour le champ Espace de noms et sélectionnez Confidentialité du paquet pour Niveau d'authentification. Cliquez sur Connecter.
Utilisation du code managé
Vous pouvez aussi accéder par programme aux instances WMI distantes en utilisant des classes fournies par l'espace de noms System.Management. L'exemple de code suivant montre comment procéder.
String wcfNamespace = String.Format(@"\\{0}\Root\ServiceModel",
this.serviceMachineName);
ConnectionOptions connection = new ConnectionOptions();
connection.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope = new ManagementScope(this.wcfNamespace, connection);