【问题标题】:Detect network drive mount wmi检测网络驱动器挂载 wmi
【发布时间】:2011-11-28 15:07:01
【问题描述】:

如何使用 wmi 检测网络驱动器挂载事件?我主要对像 Win32_VolumeChangeEvent 这样的网络驱动器感兴趣。

 _eventWatcher = new ManagementEventWatcher("SELECT * FROM Win32_VolumeChangeEvent");

 _eventWatcher.EventArrived += (o, args) => 
     {switch(args.NewEvent["EventType"].ToString()[0])
         {
             case '2':
                 //mount
                 Debug.WriteLine(args.NewEvent["DriveName"]);
                 break;
             case '3':
                 //unmount
                 break;
         }
     };

 _eventWatcher.Start();

提前致谢。

【问题讨论】:

    标签: c# .net c#-4.0 wmi drive


    【解决方案1】:

    您可以使用此查询(我使用 Powershell 进行快速测试,但您可以轻松转换为 C#)

    $query = "SELECT * FROM __instanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk' AND TargetInstance.DriveType=4"
    
    Register-WMIEvent -Query $query -Action {$global:a=$Args[0];$global:b=$Args[1];write-host "done" }
    
    Id              Name            State      HasMoreData     Location  Command
    --              ----            -----      -----------     --------  -------
    14              f2c5223d-3ae... NotStarted False                     $global:a=$Args[0];$gl...
    
    
    PS C:\> net use
    Les nouvelles connexions seront mémorisées.
    
    La liste est vide.
    
    PS C:\> net use o: \\jpbhpp2\c$
    La commande s'est terminée correctement.
    
    PS C:\> done
    
    
    PS C:\> $a
    
    
    Scope     : System.Management.ManagementScope
    Query     : System.Management.EventQuery
    Options   : System.Management.EventWatcherOptions
    Site      :
    Container :
    
    
    
    PS C:\> $b
    
    NewEvent                                                    Context
    --------                                                    -------
    System.Management.ManagementBaseObject                      {}
    
    
    PS C:\> $b.NewEvent
    
    
    __GENUS             : 2
    __CLASS             : __InstanceCreationEvent
    __SUPERCLASS        : __InstanceOperationEvent
    __DYNASTY           : __SystemClass
    __RELPATH           :
    __PROPERTY_COUNT    : 3
    __DERIVATION        : {__InstanceOperationEvent, __Event, __IndicationRelated, __SystemClass}
    __SERVER            : WM2008R2ENT
    __NAMESPACE         : //./root/CIMV2
    __PATH              :
    SECURITY_DESCRIPTOR :
    TargetInstance      : System.Management.ManagementBaseObject
    TIME_CREATED        : 129670237461553750
    
    
    
    PS C:\> $b.NewEvent.TargetInstance
    
    
    __GENUS                      : 2
    __CLASS                      : Win32_LogicalDisk
    __SUPERCLASS                 : CIM_LogicalDisk
    __DYNASTY                    : CIM_ManagedSystemElement
    __RELPATH                    : Win32_LogicalDisk.DeviceID="O:"
    __PROPERTY_COUNT             : 40
    __DERIVATION                 : {CIM_LogicalDisk, CIM_StorageExtent, CIM_LogicalDevice, CIM_LogicalElement...}
    __SERVER                     : WM2008R2ENT
    __NAMESPACE                  : root\CIMV2
    __PATH                       : \\WM2008R2ENT\root\CIMV2:Win32_LogicalDisk.DeviceID="O:"
    Access                       : 0
    Availability                 :
    BlockSize                    :
    Caption                      : O:
    Compressed                   : False
    ConfigManagerErrorCode       :
    ConfigManagerUserConfig      :
    CreationClassName            : Win32_LogicalDisk
    Description                  : Connexion réseau
    DeviceID                     : O:
    DriveType                    : 4
    ErrorCleared                 :
    ErrorDescription             :
    ErrorMethodology             :
    FileSystem                   : NTFS
    FreeSpace                    : 36223737856
    InstallDate                  :
    LastErrorCode                :
    MaximumComponentLength       : 255
    MediaType                    : 0
    Name                         : O:
    NumberOfBlocks               :
    PNPDeviceID                  :
    PowerManagementCapabilities  :
    PowerManagementSupported     :
    ProviderName                 : \\jpbhpp2\c$
    Purpose                      :
    QuotasDisabled               : True
    QuotasIncomplete             : False
    QuotasRebuilding             : False
    Size                         : 500000878592
    Status                       :
    StatusInfo                   :
    SupportsDiskQuotas           : True
    SupportsFileBasedCompression : True
    SystemCreationClassName      : Win32_ComputerSystem
    SystemName                   : WM2008R2ENT
    VolumeDirty                  :
    VolumeName                   :
    VolumeSerialNumber           : 96B00597
    

    【讨论】:

      【解决方案2】:

      对于网络共享监控,您可以使用 RegistryKeyChangeEvent。

      1. RegistryKeyChangeEvent 位于 root\default 中。 (不是 .net 默认使用的 root\CIMV2)
      2. 挂载点信息存储在注册表中:HKEY_CURRENT_USER\Network。但是,RegistryKeyChangeEvent 无法监控 HKEY_CURRENT_USER(无赖)。因此,您必须通过以下方式访问它:HKEY_USERS\S-1-5-18\Network(其中 S-1-5-18 是您用户的 SID)。
      3. 要确定用户的 SID,请检查以下注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList。

      最终的代码应该是这样的:

      Dim m As New ManagementEventWatcher("root\default", "SELECT * FROM RegistryKeyChangeEvent WHERE Hive=""HKEY_USERS"" AND KeyPath=""<YOUR USER SID HERE>\\Network""") 
      AddHandler m.EventArrived, AddressOf <YOUR HANDLER FUNCTION>
      m.Start()
      

      每次用户挂载或卸载网络共享时,此代码都会调用处理函数。

      【讨论】:

        【解决方案3】:

        您可以监听任何 VolumeChangeEvent,然后检查驱动器是否为网络驱动器:

        DriveInfo info = new DriveInfo(driveLetter);
        if(info.DriveType == DriveType.Network)
            //DoSomething
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多