2

我有一个System.Management.WqlEventQuery监听"__InstanceOperationEvent"事件。此事件是、 和事件的基类"__InstanceCreationEvent",因此它捕获所有三个。"__InstanceDeletionEvent""__InstanceModificationEvent"

当我的WqlEventQuery.Condition"TargetInstance ISA 'Win32_LogicalDisk'"时,我只获得逻辑磁盘的事件,正如预期的那样。

但是,当我的WqlEventQuery.Condition为时"(TargetInstance ISA 'Win32_LogicalDisk' or TargetInstance ISA 'Win32_MappedLogicalDisk')",我仍然只收到Win32_LogicalDisk事件。或者,我也应该能够使用WqlEventQuery.Condition set as "TargetInstance ISA 'CIM_LogicalDisk'",因为CIM_LogicalDiskWin32_LogicalDiskWin32_MappedLogicalDisk的基类。不幸的是,这个替代查询也只返回Win32_LogicalDisk事件。

总之,我似乎无法捕获Win32_MappedLogicalDisk事件。我的假设是,当我右键单击网络共享并将其作为网络驱动器映射到新的驱动器号时,应该会生成这样的事件。尽管这个新的映射驱动器在资源管理器中显示得很好,但我的程序从未收到任何事件。

我的任何假设是错误的吗?什么是Win32_MappedLogicalDrive ,或者它与DriveType为“NetworkDrive”的Win32_LogicalDrive有何区别?如何使用 WMI 捕获连接/断开网络驱动器的事件?

更新:我在这里发布了更多关于这个问题的信息:http : //social.technet.microsoft.com/Forums/en-US/ocsmanagement/thread/1c92f08b-b9c9-4f27-a1bb-0c16a8868d19 结果是不幸的一面- UAC 的影响,除了在管理帐户下创建重复的驱动器映射外,没有其他解决方法。

4

1 回答 1

2

我四处搜索,发现这是(像往常一样)某种与 Vista/Window 7 UAC 相关的行为,而且确实足够...... http://www.vistax64.com/powershell/270814-win32_mappedlogicaldisk-returns-null-vista .html

由于映射的驱动器是“每个用户”的,因此以管理员身份运行的 WMI 查询无法看到由非提升用户(例如来自资源管理器)映射的驱动器。这是违反直觉的,因为通常应用程序可以访问更多以管理员身份运行的信息,而不是更少。因此,根据谁映射驱动器,它可能对程序可见,具体取决于它是否以提升的权限运行。我想我将不得不使用模拟选项来确保程序找到它可能访问的所有驱动器。

此外,一旦这工作,我看到网络驱动器的重复条目,并意识到 Win32_LogicalDisk 对象集包括 Win32_MappedLogicalDisk 对象,即使 Win32_MappedLogicalDISk 就任何类层次结构而言都不是 Win32_LogicalDisk 。根据文档,Win32_MappedLogicalDisk 与 Win32_LogicalDisk 一样,直接从 CIM_LogicalDisk 扩展而来。

请参阅有关 UAC 对映射驱动器造成的问题的讨论:http: //blogs.msdn.com/b/cjacks/archive/2007/02/19/mapped-network-drives-with-uac-on-windows-vista。 aspx?PageIndex=2

摘抄:

“我的存根正在运行提升到管理员。你是否建议它可以以某种方式检测标准用户映射的驱动器,然后再次进行映射?或者我需要两个存根:第一个运行没有提升,一个列表(说,映射驱动器的注册表),然后转到存根#2,它要求提升到管理员,读取注册表列表并重新映射驱动器。 听起来有点像鲁布戈德堡!

另一种解决方法有点像为管理员复制驱动器映射,但涉及允许通过链接他们的令牌与管理员共享普通用户驱动器映射。请参阅http://support.microsoft.com/kb/937624

于 2011-06-22T17:11:43.247 回答