Есть такой скриптик, был найден на просторах интернета. Его задача отслеживать в эвентах появление нового пользователя. При срабатывании скрипт ругает 22 строку и выдает ошибку invalid procedure call or argument mid.
Помогите исправить? Скрипт очень полезен.)
Dim strTemp, strRight, intPos1, intPos2
Dim intCode, intType, strSource
Const strLeft = "записи:"
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate,(Security)}!\\.\root\cimv2")
Set objCollection = objWMI.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent " & _
"WITHIN 1 WHERE TargetInstance ISA 'Win32_NTLogEvent'")
Do
Set objItem = objCollection.NextEvent
intCode = objItem.TargetInstance.EventCode
intType = objItem.TargetInstance.EventType
strSource = objItem.TargetInstance.SourceName
If StrComp(strSource, "Security", vbTextCompare) = 0 And intType = 4 Then
If intCode = 624 Or intCode = 629 Then
If intCode = 624 Then
strRight = "Новый"
Else
strRight = "Конечный"
End If
strTemp = objItem.TargetInstance.Message
intPos1 = InStr(1, strTemp, strLeft, vbTextCompare) + Len(strLeft)
intPos2 = InStr(1, strTemp, strRight, vbTextCompare)
strTemp = Trim(Mid(strTemp, intPos1, intPos2 - intPos1))
strTemp = Replace(strTemp, vbTab, "")
strTemp = Replace(strTemp, vbNewLine, "")
If intCode = 624 Then
'WScript.Echo "Создана учётная запись: " & strTemp
Call Create_DocFolder(strTemp)
Else
'WScript.Echo "Отключена учётная запись: " & strTemp
Call Move_DocFolder(strTemp)
End If
End If
End If
Set objItem = Nothing
Loop
Function Create_DocFolder(strUser)
Dim objFS, objFolder, strResult
Const strDocuments = "c:\test\"
Set objFS = CreateObject("Scripting.FileSystemObject")
If Not objFS.FolderExists(strDocuments & strUser) Then
Set objFolder = objFS.GetFolder(strDocuments)
objFolder.SubFolders.Add strUser
Set objFolder = Nothing
strResult = Set_Security(strUser, strDocuments)
'WScript.Echo strResult
End If
Set objFS = Nothing
End Function
Function Move_DocFolder(strUser)
Dim objFS, objFolder
Const strDocuments = "c:\test\"
Const strBackup = "c:\test"
Set objFS = CreateObject("Scripting.FileSystemObject")
If objFS.FolderExists(strDocuments & strUser) Then
Set objFolder = objFS.GetFolder(strDocuments & strUser)
objFolder.Copy strBackup, True
objFolder.Delete True
Set objFolder = Nothing
End If
Set objFS = Nothing
End Function
Function Set_Security(strUser, strPath)
Dim objWMI, objSecSettings, objSD, objItem
Dim objCollection, objSID, objTrustee, objNewACE, objGroup
Dim strComputer, strDomain, strUserSID, strResult
Dim arrACE, intResult
Const strNetDrive = "w:"
Const ACCESS_ALLOWED = 0
Const ACCESS_DENIED = 1
Const SE_DACL_PROTECTED = 4096
Const FLAG_SYNCHRONIZE = 1048576
Const VIEW_FOLDERS_EXECUTE_FILES = 32
Const LIST_FOLDER_READ_DATA = 1
Const READ_ATTRIBUTES = 128
Const READ_ADDITIONAL_ATTRIBUTES = 8
Const CREATE_FILES_WRITE_DATA = 2
Const CREATE_FOLDERS_APPEND_DATA = 4
Const WRITE_ATTRIBUTES = 256
Const WRITE_ADDITIONAL_ATTRIBUTES = 16
Const DEL_SUBFOLDERS_FILES = 64
Const DEL = 65536
Const READ_DAC = 131072
Const WRITE_DAC = 262144
Const WRITE_OWNER = 524288
Set objWSNet = CreateObject("WScript.Network")
strComputer = objWSNet.ComputerName
strDomain = objWSNet.UserDomain
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\CIMV2")
Set objCollection = objWMI.ExecQuery("SELECT SID FROM Win32_Account WHERE Name='" & strUser & "' AND Domain='" & strDomain & "'")
If objCollection.Count > 0 Then
'начато формирование новой записи для ACL
For Each objItem In objCollection
strUserSID = objItem.SID
Next
Set objSID = objWMI.Get("Win32_SID.SID='" & strUserSID & "'")
Set objTrustee = objWMI.Get("Win32_Trustee").Spawninstance_()
objTrustee.Domain = strDomain
objTrustee.Name = strUser
objTrustee.SID = objSID.BinaryRepresentation
objTrustee.SidLength = objSID.SidLength
objTrustee.SIDString = strUserSID
Set objSID = Nothing
Set objNewACE = objWMI.Get("Win32_Ace").Spawninstance_()
objNewACE.AceType = ACCESS_ALLOWED
objNewACE.AccessMask = VIEW_FOLDERS_EXECUTE_FILES + LIST_FOLDER_READ_DATA + READ_ATTRIBUTES + _
READ_ADDITIONAL_ATTRIBUTES + CREATE_FILES_WRITE_DATA + CREATE_FOLDERS_APPEND_DATA + _
WRITE_ATTRIBUTES + WRITE_ADDITIONAL_ATTRIBUTES + DEL_SUBFOLDERS_FILES + READ_DAC + FLAG_SYNCHRONIZE
objNewACE.Trustee = objTrustee
Set objTrustee = Nothing
'завершено формирование новой записи для ACL
objWSNet.MapNetworkDrive strNetDrive, Left(strPath, Len(strPath) - 1)
'попытка чтения дескриптора безопасности каталога
Set objSecSettings = objWMI.Get("Win32_LogicalFileSecuritySetting.Path='" & strNetDrive & "\\" & strUser & "'")
If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then
arrACE = objSD.DACL 'чтение массива записей ACL
'начато добавление новой записи в массив ACL
ReDim Preserve arrACE(UBound(arrACE) + 1)
Set arrACE(UBound(arrACE)) = objNewACE
If Not CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then
'Отключение наследования
objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED
End If
objSD.DACL = arrACE
Set objNewACE = Nothing
Erase arrACE
'завершено добавление новой записи в массив ACL
'попытка изменения дескриптора безопасности каталога
intResult = objSecSettings.SetSecurityDescriptor(objSD)
Select Case intResult
Case 0: strResult = "Дескриптор безопасности успешно обработан."
Case 2: strResult = "Отсутствует доступ к необходимой информации."
Case 9: strResult = "Для выполнения операции нет достаточных прав."
Case 21: strResult = "Заданы недопустимые значения параметров."
Case Else: strResult = "Неизвестная ошибка."
End Select
Else
strResult = "Не удалось прочитать дескриптор безопасности объекта " & UCase(strPath) & "."
End If
Set objSD = Nothing
Set objSecSettings = Nothing
objWSNet.RemoveNetworkDrive strNetDrive, True
Set objWSNet = Nothing
Else
strResult = "Не обнаружена учётная запись " & UCase(strUser) & "."
End If
Set objCollection = Nothing
Set objWMI = Nothing
Set_Security = strResult
End Function
Ответить
|