3 Réponses :


0
votes

Vous pouvez essayer d'utiliser Win32_PnPEntity pour obtenir des détails. Classe Win32_PnPEntity


1 commentaires

Comment puis-je obtenir par exemple deviceId de Win32_DeviceChangeEvent pour faire une demande pour Win32_PnPEntity?



0
votes

Vous pouvez utiliser ORMi pour créer un observateur afin d'obtenir des informations sur tout nouvel appareil: XXX

Et puis vous pouvez regarder les événements:

private static void Watcher_WMIEventArrived(object sender, WMIEventArgs e)
{
    //DO YOUR WORK
}


0 commentaires

4
votes

Le Win32_DeviceChangeEvent indique uniquement le type de événement qui s'est produit et l'heure de l'événement (uint64, représentant des intervalles de 100 nanosecondes après le 1er janvier 1601, UTC). Pas vraiment utile si vous voulez aussi savoir ce qui est arrivé ou a été supprimé.

Je suggère d'utiliser à la place le WqlEventQuery , définition de sa classe EventClassName à __InstanceOperationEvent .
Cette classe système fournit une propriété TargetInstance qui peut être convertie en ManagementBaseObject , l'objet de gestion complet qui fournit également des informations de base sur le périphérique qui a généré l'événement.
Parmi ces informations (qui incluent le nom convivial de l'appareil), le PNPDeviceID , qui peut être utilisé pour créer d'autres requêtes afin d'inspecter plus en détail l'appareil référencé.

Le WqlEventQuery La propriété Condition peut être définie ici sur TargetInstance ISA 'Win32_DiskDrive' .
Il peut être défini sur n'importe quelle autre classe d'intérêt Win32_ .

Configurez l'écouteur d'événements (machine locale):
(Le gestionnaire d'événements s'appelle DeviceChangedEvent final)

private void DeviceChangedEvent(object sender, EventArrivedEventArgs e)
{
    using (var moBase = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)
    {
        string oInterfaceType = moBase?.Properties["InterfaceType"]?.Value.ToString();
        string devicePNPId = moBase?.Properties["PNPDeviceID"]?.Value.ToString();
        string deviceDescription = moBase?.Properties["Caption"]?.Value.ToString();
        string eventMessage = $"{oInterfaceType}: {deviceDescription} ";

        switch (e.NewEvent.ClassPath.ClassName)
        {
            case "__InstanceDeletionEvent":
                eventMessage += " removed";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(eventMessage); }));
                break;
            case "__InstanceCreationEvent":
                eventMessage += "inserted";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(eventMessage); }));
                break;
            case "__InstanceModificationEvent":
            default:
                Console.WriteLine(e.NewEvent.ClassPath.ClassName);
                break;
        }
    }
}


private void UpdateUI(string message)
{
   //Update the UI controls with information provided by the event
}

Le gestionnaire d'événements reçoit, dans e .NewEvent.Properties ["TargetInstance"] , l'objet de gestion représentant un Classe Win32_DiskDrive .
Consultez la documentation sur les propriétés directement disponibles ici.

Les classes d'intérêt dérivées __InstanceOperationEvent , signalées par le e.NewEvent .ClassPath.ClassName , peut être:

__ InstanceCreationEvent : une nouvelle arrivée de périphérique a été détectée.
__InstanceDeletionEvent : une suppression de périphérique a été détectée. __InstanceModificationEvent : un appareil existant a été modifié dans certains

Notez que l'événement est déclenché dans un thread secondaire, nous devons BeginInvoke le thread de l'interface utilisateur pour mettre à jour l'interface avec les nouvelles informations.

Voir ici: Obtenir le numéro de série du périphérique de stockage USB pour une classe qui fournit la plupart des informations disponible sur un appareil (les informations sont filtrées pour afficher uniquement les périphériques USB, mais le filtre peut être supprimé).

var query = new WqlEventQuery() {
    EventClassName = "__InstanceOperationEvent",
    WithinInterval = new TimeSpan(0, 0, 3),
    Condition = @"TargetInstance ISA 'Win32_DiskDrive'"
};

var scope = new ManagementScope("root\\CIMV2");
using (var moWatcher = new ManagementEventWatcher(scope, query))
{
    moWatcher.Options.Timeout = ManagementOptions.InfiniteTimeout;
    moWatcher.EventArrived += new EventArrivedEventHandler(DeviceChangedEvent);
    moWatcher.Start();
}


0 commentaires