0
votes

Pourquoi WMI fonctionne-t-il via une recherche mais pas directement?

Le premier de ces deux verrouille un lecteur BitLocker. Le second InvokeMethod lance: 'Chemin d'objet invalide'. Pourquoi? Ils semblent équivalents.

//Using a search:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "SELECT * FROM Win32_EncryptableVolume WHERE DriveLetter = 'E:'");
foreach (ManagementObject classInstance1 in searcher.Get())
    classInstance1.InvokeMethod("Lock", new object[] { true }); 

//Direct:
ManagementObject classInstance2 = new ManagementObject("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "Win32_EncryptableVolume.DriveLetter='E:'", null);
classInstance2.InvokeMethod("Lock", new object[] { 0 });//throws: 'Invalid object path'.


0 commentaires

3 Réponses :


0
votes

Il semble que vous n'appeliez pas get () code> méthode. Essayez ceci:

ManagementObject classInstance2 = new ManagementObject("root\\CIMV2\\Security\\MicrosoftVolumeEncryption", "Win32_EncryptableVolume.DriveLetter='E:'", null);
classInstance2.Get();
classInstance2.InvokeMethod("Lock", new object[] { 0 });


6 commentaires

J'ai essayé et j'ai obtenu le "Chemin d'objet non valide" à la ligne Get .


DriveLetter est-il la seule clé de la classe ??


Non. Et cela fonctionne réellement avec DeviceID mais mon code ne le sait pas. Il connaît la lettre.


C'est ça le truc. Vous ne pouvez récupérer l'instance que de manière «complète» en recherchant par les attributs clés. Je pense que votre meilleure chance est d'utiliser ManagementObjectSearcher


Merci. Avez-vous un lien concernant cette chose "attribut clé"?


Oui. Examinez la page 348 de ce livre:

Vous ne pouvez malheureusement pas instancier un objet en utilisant une propriété qui n'est pas une propriété clé. Une propriété clé dans WMI est une propriété qui a la CIM_Key qualifier , la documentation WMI donne plus de détails sur Qualificateur clé . Pour plus d'informations sur l'exigence WMI d'utiliser un chemin complet avec une clé pour référencer un objet, vous pouvez lire la documentation WMI sur Chemins d'objets d'instance .

En C #, pour la classe particulière que vous avez spécifiée ( Win32_EncryptableVolume ), vous ne pouvez accomplir ce que vous essayez de faire qu'en utilisant ManagementObjectSearcher comme indiqué dans votre exemple. C'est parce que vous essayez d'obtenir une instance basée sur une propriété standard plutôt que sur une propriété clé.

Un excellent utilitaire pour explorer WMI est WMI Explorer 2.0. Cela donne une excellente représentation visuelle des classes WMI. Dans cet utilitaire, les propriétés clés sont identifiées par un astérisque.

https://github.com/vinaypamnani/wmie2/releases


0 commentaires

-1
votes

Je suppose simplement que la bonne réponse est similaire à ce que les autres ont mentionné mais pas exactement.

La page de la classe mentionne que DeviceID a la propriété suivante:

Qualificatifs: clé

Je suppose, faute de documentation réelle, que la recherche de quelque chose par leur clé renvoie la chose elle-même. Lorsque la recherche par autre chose renvoie une liste d'objets qui satisfont à cette condition. Même si la liste ne contient qu'une seule entrée - ce n'est pas l'objet lui-même mais plutôt une liste.

Mais si quelqu'un pouvait fournir de la documentation, ce serait bien.


0 commentaires