Vbscript 如何使用UNC路径进行WMI事件监视

Vbscript 如何使用UNC路径进行WMI事件监视,vbscript,Vbscript,我正在尝试使用WMI使用vbs脚本监视文件夹的更改,但它将是一个网络驱动器。有多个用户将执行此脚本,并且映射的驱动器号可能与某些用户不同。因此,我想使用不会改变的UNC 我已经尝试将strDrive和strFolder更改为UNC和文件夹的每个组合。脚本将执行,但不会识别任何事件,除非我使用驱动器号 ' VBScript source code 'WMIFileEvents.vbs intInterval = "2" strDrive = "f:" 'or \\mypath\ strFolder

我正在尝试使用WMI使用vbs脚本监视文件夹的更改,但它将是一个网络驱动器。有多个用户将执行此脚本,并且映射的驱动器号可能与某些用户不同。因此,我想使用不会改变的UNC

我已经尝试将strDrive和strFolder更改为UNC和文件夹的每个组合。脚本将执行,但不会识别任何事件,除非我使用驱动器号

' VBScript source code
'WMIFileEvents.vbs
intInterval = "2"
strDrive = "f:" 'or \\mypath\
strFolder = "\\vbs\\"
strComputer = "." 


Set objWMIService = GetObject( "winmgmts:" & _ 
    "{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\cimv2" )
strQuery =  _
    "Select * From __InstanceOperationEvent" _
    & " Within " & intInterval _
    & " Where Targetinstance Isa 'CIM_DataFile'" _
    & " And TargetInstance.Drive='" & strDrive & "'" _
    & " And TargetInstance.Path='" & strFolder & "'"
Set colEvents = objWMIService. ExecNotificationQuery (strQuery) 
WScript.Echo "Monitoring events...[Ctl-C] to end"

Do 

    Set objEvent = colEvents.NextEvent()
    Set objTargetInst = objEvent.TargetInstance

    Select Case objEvent.Path_.Class 
        Case "__InstanceCreationEvent" 
            WScript.Echo "Created: " & objTargetInst.Name 
        Case "__InstanceDeletionEvent" 
            WScript.Echo "Deleted: " & objTargetInst.Name 
        Case "__InstanceModificationEvent" 
            WScript.Echo "Modified: " & objTargetInst.Name
    End Select 
Loop

我很乐意修改此脚本以与UNC一起工作,或者从UNC返回驱动器号(我也不知道如何做)。我愿意在VBS之外使用VBA或shell,如果这样更容易解决的话。

这是我的解决方案。我发现Wscript.Network对象具有EnumNetworkDrive属性,该属性是当前使用的所有驱动器号的列表。然后,我只是在字母表中循环,以发现当前未使用的字母,并手动将UNC映射到它。即使他们已经连接了驱动器,我也只是在最后映射并移除

这假设用户不是所有可能的驱动器号,这在我的情况下是安全的。另一种方法是将驱动器号映射回UNC,以确定当前使用的驱动器是否有我需要的路径

我希望有一个更好的方法来查看一个项目是否在列表中,而不是我笨重的循环,我愿意接受建议,但这对我来说很有效,而且没花多长时间就完成了

'Establish all letters of the English Alphabet (assuming these can all become drive mappings)
Set driveLetters = CreateObject("System.Collections.ArrayList")

driveletters.add "A:"
driveletters.add "B:"
driveletters.add "C:"
driveletters.add "D:"
driveletters.add "E:"
driveletters.add "F:"
driveletters.add "G:"
driveletters.add "H:"
driveletters.add "I:"
driveletters.add "J:"
driveletters.add "K:"
driveletters.add "L:"
driveletters.add "M:"
driveletters.add "N:"
driveletters.add "O:"
driveletters.add "P:"
driveletters.add "Q:"
driveletters.add "R:"
driveletters.add "S:"
driveletters.add "T:"
driveletters.add "U:"
driveletters.add "V:"
driveletters.add "W:"
driveletters.add "X:"
driveletters.add "Y:"
driveletters.add "Z:"


'Find the first available open drive mapping

Set oWSN = CreateObject("WScript.Network")
Set oDrives = oWSN.EnumNetworkDrives

For i = 0 to driveletters.Count - 1 step 1
    in_list = False
    For j = 0 to oDrives.Count - 1 Step 2
        If oDrives.Item(j) = driveletters.Item(i) Then
            in_list = True
        End If
    Next

    If in_list = False Then
        strDrive = driveletters.Item(i)
        Exit For
    End If
Next

oWSN.MapNetworkDrive strDrive, "\\unc\path"

'Monitoring code

oWSN.RemoveNetworkDrive strDrive, True

您不能使用UNC路径,这是肯定的。请参阅(仅返回本地固定磁盘上的文件实例。)除此之外,即使此脚本按您希望的方式工作,您是否意识到只有运行此脚本的计算机所做的更改才能被监视(提示:
strComputer=“.”
),这是您期望的行为吗?这实际上是我期望的行为(虽然我没有意识到这一点,因为我不是VBS专家)。长话短说,我别无选择,只能从Excel VBA执行一个进程,然后监视一个文件夹,以了解发生的情况。每台必须使用该工具的计算机上都会有此Excel工作簿和VBS脚本的副本。我最终“解决”使用CreateObject(“WScript.Network”)解决此问题要获取给定用户所有连接的网络驱动器的列表,请找到一个打开的插槽并手动连接所需的UNC。这很笨重,但整个项目也是如此。很好。您可以添加解决方案作为答案,并接受您自己的问题。谢谢。我不得不修复我的循环,几天来一直忙于其他项目。现在结束了。