2010-05-14 27 views
1

J'essaie de lancer un événement lorsqu'un utilisateur branche un périphérique USB. Pour l'instant, je me contente d'imprimer simplement quelque chose sur la console (dans le produit fini, il va lancer une application).Ouverture de mon application lorsqu'un périphérique USB est inséré sous Windows en utilisant WMI

Ce code est très vaguement adapté de: https://serverfault.com/questions/115496/use-wmi-to-detect-a-usb-drive-was-connected-regardless-of-whether-it-was-mounted

Il y a deux problèmes: 1) J'ai besoin de passer l'argument à la portée de gestion dynamique parce que ce sera installé sur les ordinateurs que je ne pas utiliser ou dont le nom Je ne sais pas. 2) J'obtiens une exception d'espace de noms invalide quand j'appelle w.Start();

Des idées que je fais mal?

static ManagementEventWatcher w=null; 
static void Main(string[] args) 
    { 
     AddInstUSBHandler(); 
     for(;;); 
    } 

public static void USBRemoved(object sneder, EventArgs e) 
    { 
     Console.WriteLine("A USB device inserted"); 
    } 


static void AddInstUSBHandler() 
    { 
     WqlEventQuery q; 
     ManagementScope scope = new ManagementScope("HQ\\DEV1"); 
     scope.Options.EnablePrivileges=true; 

      q=new WqlEventQuery(); 
      q.EventClassName+="_InstanceCreationEvent"; 
      q.WithinInterval=new TimeSpan(0,0,3); 
      [email protected]"TargetInstance ISA 'Win32_USBControllerdevice'"; 
      w=new ManagementEventWatcher(scope,q); 
      w.EventArrived+=new EventArrivedEventHandler(USBRemoved); 
      w.Start(); 
    } 

Répondre

1

Cette ligne est incorrecte -> "HQ \ DEV1"

//ManagementScope scope = new ManagementScope("HQ\\DEV1"); 

Suivez ManagementScope Class

// Make a connection to a remote computer. 
    // Replace the "FullComputerName" section of the 
    // string "\\\\FullComputerName\\root\\cimv2" with 
    // the full computer name or IP address of the 
    // remote computer. 
    ManagementScope scope = 
     new ManagementScope(
     "\\\\FullComputerName\\root\\cimv2"); 
+0

J'ai ajouté le nom complet de l'ordinateur - et obtenu "classe non valide". Si je le change en \\\\ HQ \\ DEV1 \\ root \\ cimv2, (ce qui n'est pas le nom complet de l'ordinateur mais le chemin d'accès dans le domaine), j'obtiens "l'accès est refusé". Serait-ce parce que je ne suis pas l'administrateur de ma boîte? – rsteckly

+0

Je le dirais. J'ai eu des problèmes similaires. Si vous allez dans Gestion de l'ordinateur -> Services et applications -> Contrôle WMI, vous ou votre système adim pouvez définir les autorisations. Je l'ai fait sur Windows 7 et XP mais je ne peux avoir accès sur XP. – hfitzwater