2010-07-26 17 views
1

Je souhaite créer une classe wrapper pour des fonctions WMI spécifiques affectant la fonctionnalité BitLocker. La première étape consiste à obtenir tous les volumes Bitlocker d'une machine, donc je créé une application console et fait cela:WMI + Bitlocker + C# Obtenir des volumes cryptés produit un délai

private static ManagementClass management; 
    private static ManagementObjectCollection Volumes = null; 

    static void Main(string[] args) 
    { 

     ManagementPath path = new ManagementPath(); 
     path.Server = ""; 
     path.NamespacePath = "\\ROOT\\CIMV2\\Security\\MicrosoftVolumeEncryption"; 
     path.ClassName = "Win32_EncryptableVolume"; 


     ConnectionOptions options = new ConnectionOptions(); 
     options.Authentication = AuthenticationLevel.PacketPrivacy; 
     options.Impersonation = ImpersonationLevel.Impersonate; 

     ManagementScope scope = new ManagementScope(path, options); 
     ObjectGetOptions getOptions = new ObjectGetOptions(); 

     management = new ManagementClass(scope, path, getOptions); 
     management.Get(); 
     Volumes = management.GetInstances(); 

    } 

Quand j'exécuter sur une machine non-Bitlocker la collection Volumes obtient initialisés OK, seulement qu'il a un nombre de 0 bien sûr. Maintenant, j'ai copié le code sur une application WinForms et quand je clique sur un bouton pour exécuter ce code, il passe par OK, mais quand j'essaye d'étendre la collection pendant le débogage, l'application se bloque et j'obtiens une "évaluation de fonction expirée". C'est le même code juste dans une autre application. Quelle pourrait en être la raison?

Répondre

0

Hm. J'ai une exception de référence nulle si je ne l'ai pas exécuté en tant qu'administrateur, mais quand je l'ai exécuté en tant qu'administrateur (Win 7 x64, btw), j'ai récupéré quatre volumes.

+0

Chose étrange, les valeurs sont là et je peux travailler avec eux Je ne peux pas les voir en mode débogage. – hoetz

0

Je viens d'avoir un problème similaire, je vais poster mon code pour vous aider, je l'espère.

ManagementObjectSearcher Encryption = new ManagementObjectSearcher(@"root\cimv2\Security\MicrosoftVolumeEncryption", "SELECT * FROM Win32_EncryptableVolume"); 

     foreach (ManagementObject QueryObj in Encryption.Get()) 
     { 
      string EncryptionStatus = QueryObj.GetPropertyValue("ProtectionStatus").ToString(); 

      if (EncryptionStatus == "0") 
      { 
       EncryptionDialog.Text = "Unencrypted"; 
      } 
      else if (EncryptionStatus == "1") 
      { 
       EncryptionDialog.Text = "Encrypted - SysPrep will not complete"; 
      } 
      else if (EncryptionStatus == "2") 
      { 
       EncryptionDialog.Text = "Cannot Determine Encryption"; 
      } 
     } 

J'utilise cette option pour afficher l'état d'un outil Sysprep je crée donc le « EncryptionDialog.Text = ... » peut être remplacé par d'autres appels que vous pourriez avoir besoin. vous devez également vous rappeler "qui m'a causé des problèmes au moins" si vous utilisez visual studio, vous devrez ajouter un fichier à votre projet intitulé "Application Manifest File" dans la boîte de dialogue "Ajouter un nouveau fichier". La raison en est que l'application devra être ouverte en mode Administrateur (Juste un FYI au cas où vous ne l'auriez pas fait jusque là)