[英]Detect network drive mount wmi
How to detect network drive mount event using wmi ? 如何使用wmi检测网络驱动器安装事件? I'm mainly interested i something like Win32_VolumeChangeEvent just for network drives.
我主要对像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();
Thanks in advance. 提前致谢。
You can use this query (I use Powershell for rapid test but you can easily transform to C#) 您可以使用此查询(我使用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
For network share monitoring you can use RegistryKeyChangeEvent. 对于网络共享监视,可以使用RegistryKeyChangeEvent。
The final code should be something like this: 最终代码应如下所示:
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()
This code will call the handler function every time the user mounts or dismounts a network share. 每当用户安装或卸载网络共享时,此代码都会调用处理程序函数。
You can listen for any VolumeChangeEvent and then just check if the drive is a network drive: 您可以侦听任何VolumeChangeEvent,然后只需检查驱动器是否为网络驱动器:
DriveInfo info = new DriveInfo(driveLetter);
if(info.DriveType == DriveType.Network)
//DoSomething
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.