Как использовать UNC-путь для мониторинга событий WMI - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать 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, либо в оболочку, если это облегчает решение.

1 Ответ

1 голос
/ 12 ноября 2019

Вот мое решение. Я обнаружил, что объект Wscript.Network имеет свойство EnumNetworkDrives, которое представляет собой список всех используемых в настоящее время букв дисков. Затем я просто перебираю алфавит, чтобы узнать, какая буква в данный момент не используется, и сопоставить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...