Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.171.164.77] |
|
Страницы: (22) « Первая ... 20 21 [22] ( Перейти к последнему сообщению ) |
Сообщ.
#316
,
|
|
|
Функция для VB-сценария, позволяющая очищать DACL подкаталогов заданного каталога от не олицетворённых DACL-записей, сохраняя при этом настройки, унаследованные от "родителя".
Дополнительные возможности функции: - поддержка работы как в графическом, так и в консольном режимах; - поддержка рекурсивного просмотра подкаталогов; - ведение журнала работы; - поддержка работы в "молчаливом" режиме. Описание параметров. objWMIServ - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на WMI-пространство того компьютера, на томе которого (локальном или сетевом) расположено обрабатываемое дерево подкаталогов. Допустимое значение: ссылка на пространство CIMV2, полученная с помощью моникера. objDir - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на каталог, содержащий обрабатываемое дерево подкаталогов. Допустимое значение: любая корректная ссылка на объект типа FOLDER (модель FSO) локального или удалённого компьютера. При работе с каталогом удалённого компьютера предполагается, что ссылка формируется с использованием административного ресурса для соответствующего логического тома. objLog - входной, обязательный, подтип Object. Смысловая нагрузка - ссылка на текстовый файл, представляющий собой журнал работы функции, а также индикатор необходимости ведения такого журнала. Допустимые значения: любая корректная ссылка на открытый для записи объект типа TEXTSTREAM (модель FSO) локального компьютера (журнал ведётся); Nothing (журнал не ведётся). blnRec - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима рекурсивного просмотра обрабатываемого дерева подкаталогов. Допустимые значения: TRUE - выполнять рекурсивный просмотр; FALSE - не выполнять рекурсивный просмотр. blnCon - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима выполнения сценария (в составе которого задействована функция), определяющий возможность вывода на экран текущих диагностических сообщений функции. Допустимые значения: TRUE - консольный режим, вывод сообщений возможен; FALSE - графический режим, вывод сообщений невозможен . blnSil - входной, обязательный, подтип Boolean. Смысловая нагрузка - логический индикатор режима отображения на экране текущих диагностических сообщений функции. Допустимые значения: TRUE - "молчаливый" режим; FALSE - режим отображения сообщений. При работе в "молчаливом" режиме не выводятся никакие сообщения, кроме сообщений о ситуациях, приводящих к аварийному завершению работы функции. Данный режим никак не влияет на процедуру ведения журнала. Возвращаемое значение у функции отсутствует. Function Clear_DACL(objWMIServ, objDir, objLog, blnRec, blnCon, blnSil) Dim objItem, objSecSettings, objSD, objACE, arrACE, strSID Dim strPath, strTemp, blnHasInherited, blnHasError, blnIsFound, intRes, i Const SE_DACL_PROTECTED = 4096 'Флаг-признак отключенного режима наследования управляемым каталогом 'безопасности NTFS от "родителя" Const INHERITED_ACE = 16 'Флаг-признак того, что текущая запись DACL унаследована от "родителя" On Error Resume Next For Each objItem In objDir.SubFolders blnHasError = False: blnIsFound = False: strSID = vbNullString strPath = objItem.Path If Err.Number = 0 Then strTemp = strTemp & UCase(strPath) & vbNewLine i = InStr(strPath, "$") If i > 0 Then strPath = Replace(Mid(strPath, i - 1), "$", ":") End If Set objSecSettings = objWMIServ.Get("Win32_LogicalFileSecuritySetting.Path='" & strPath & "'") If Err.Number = 0 Then If objSecSettings.GetSecurityDescriptor(objSD) = 0 Then If Err.Number = 0 Then intRes = 0 If Not IsNull(objSD.DACL) Then For Each objACE In objSD.DACL If IsNull(objACE.Trustee.Name) Then blnIsFound = True Exit For End If Next If blnIsFound Then If CBool(objSD.ControlFlags And SE_DACL_PROTECTED) Then arrACE = objSD.DACL Else blnHasInherited = True arrACE = Array() i = -1 '--- Выборка из исходного DACL записей, не унаследованных от "родителя" For Each objACE In objSD.DACL If CBool(objACE.AceFlags And INHERITED_ACE) Then If IsNull(objACE.Trustee.Name) Then blnHasError = True strTemp = strTemp & objACE.Trustee.SIDString & _ " -> запись унаследована от ""родителя""." & vbNewLine End If Else i = i + 1 ReDim Preserve arrACE(i) Set arrACE(i) = objACE End If Next '------ '--- Отключение наследования настроек безопасности от "родителя" objSD.ControlFlags = objSD.ControlFlags + SE_DACL_PROTECTED intResult = objSecSettings.SetSecurityDescriptor(objSD) '------ End If If intRes = 0 Then '--- Поиск в DACL записей, у свойства Trustee.Name которых отсутствует значение For Each objACE In arrACE If IsNull(objACE.Trustee.Name) Then objACE.AccessMask = 0 'назначение нулевой маски для последующего автоудаления записи strSID = strSID & objACE.Trustee.SIDString & " -> запись удалена." & vbNewLine End If Next '------ Set objACE = Nothing objSD.DACL = arrACE 'собственно изменение DACL Erase arrACE '--- Включение наследования настроек безопасности от "родителя", 'если первоначально оно было включено If blnHasInherited Then objSD.ControlFlags = objSD.ControlFlags - SE_DACL_PROTECTED End If '------ '--- Итоговое сохраненение изменений, внесённых в дескриптор безопасности intRes = objSecSettings.SetSecurityDescriptor(objSD) Select Case intRes Case 0 strTemp = strTemp & strSID If blnHasError Then strTemp = strTemp & "Частично успешное завершение." & vbNewLine Else strTemp = strTemp & "Полностью успешное завершение." & vbNewLine End If Case 2: strTemp = strTemp & "Доступ запрещён." & vbNewLine Case 5, 9, 1307: strTemp = strTemp & "Для выполнения операции недостаточно полномочий." & vbNewLine Case 21: strTemp = strTemp & "Заданы недопустимые значения параметров." & vbNewLine Case Else: strTemp = strTemp & "Неизвестная ошибка с кодом: " & intRes & vbNewLine End Select '------ Else strTemp = strTemp & "Не удалось отключить наследование безопасности." & vbNewLine End If Else strTemp = strTemp & "Очистка DACL не требуется." & vbNewLine End If Else strTemp = strTemp & "Список управления доступом пуст." & vbNewLine End If Else strTemp = strTemp & "Ошибка " & Err.Number & " при выполнении метода GetSecurityDescriptor." & _ vbNewLine & Err.Description & vbNewLine Err.Clear End If Else strTemp = strTemp & "Не удалось прочитать дескриптор безопасности." & vbNewLine End If Else strTemp = strTemp & "Ошибка " & Err.Number & " обращения к классу Win32_LogicalFileSecuritySetting " & _ "при обработке папки " & UCase(strPath) & vbNewLine Err.Clear End If Else blnHasError = True strTemp = strTemp & "Ошибка " & Err.Number & " при попытке рекурсивного просмотра папки " & _ UCase(objDir.Path) & vbNewLine Err.Clear End If Set objSD = Nothing Set objSecSettings = Nothing If Not objLog Is Nothing Then objLog.WriteLine strTemp If blnCon And Not blnSil Then WScript.Echo strTemp strTemp = vbNullString If blnRec And Not blnHasError Then Call Clear_DACL(objWMIServ, objItem, objLog, blnRec, blnCon, blnSil) Next Set objItem = Nothing On Error GoTo 0 End Function |
Сообщ.
#317
,
|
|
|
Нашел в самом начале топика скрипт от B.V. - Вывод на экран списка всех запущенных на локальной рабочей станции процессов
Я сам работаю в VBA, и вышеуказанный скрипт очень пригодился для активации окна соседнего приложения и открытия файла Excel - именно в соседнем приложении. Приведу немного переделанный и подогнанный код для VBA Option Explicit Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Public PID_OPEN_FILE_1 Public strFullFileName$ Sub АКТИВИРУЕМ_ОКНО_СОСЕДНЕГО_ПРИЛОЖЕНИЯ_EXCEL_И_ОТКРЫВАЕМ_ФАЙЛ_В_НЕМ() Dim WMI Dim Process Dim SQuery Dim WShell ' Dim Processes 'Коллекция процессов Dim Ret Dim PID 'On Error Resume Next strFullFileName = "C:\1.xls" ' //Соединяемся с WMI If PID_OPEN_FILE_1 = Empty Then MsgBox "попыток открытия файла с помощью данного макроса еще небыло" Else MsgBox "файл уже открывали" End If Set WShell = CreateObject("Wscript.Shell") Set WMI = GetObject("winMgmts:") PID = GetCurrentProcessId 'Формируем текст запроса SQuery = "SELECT * FROM Win32_Process WHERE Name<>'EXPLORER.EXE'" 'Создаем коллекцию-результат запроса Set Processes = WMI.ExecQuery(SQuery) 'Цикл по всем элементам коллекции For Each Process In Processes Ret = False If Process.Caption Like "EXCEL.EXE" And Process.processid <> PID Then Select Case PID_OPEN_FILE_1 Case Empty '''для контроля записываем id-процесса, в котором открыли файл. '''при последующем открытии файла будем перебирать все id-процесса - пока не найдем нужный PID_OPEN_FILE_1 = Process.processid Ret = WShell.AppActivate(Process.processid) If Ret = True Then Ret = ShellExecute(0, "open", strFullFileName, 0, vbNullString, 5) Case Process.processid Ret = WShell.AppActivate(Process.processid) If Ret = True Then Ret = ShellExecute(0, "open", strFullFileName, 0, vbNullString, 5) End Select End If Next Set WMI = Nothing Set WShell = Nothing End Sub Но встала задача: перебрать все открытые приложения Excel и получить полные имена всех открытых файлов. Как это можно сделать через скрипт? |
Сообщ.
#318
,
Сообщение отклонено: Akina -
|
Сообщ.
#319
,
|
|
|
Просто если использовать тег VB вместо VB Script код становится намного читабельней.
|