На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Windows
1. Указывайте версию Вашей ОС.
2. Запрещается размещать запросы и ссылки на кряки, серийники и т.п., а также вопросы нарушения лицензии ПО и его взлома.
3. Не разрешается давать советы из разряда "Поставь Linux".
4. Переустановка ОС - крайнее и безотказное лекарство, которое знают все. В таких советах никто не нуждается.
5. При публикации скриптов пользоваться тегами code. Тип подсветки кода выбирать строго в соответствии с языком публикуемого кода.
6. Прежде чем задать вопрос, обязательно загляните в FAQ и следуйте написанным рекомендациям для устранения проблемы. И если не помогло, а поиск по разделу не дал результатов - только тогда задавайте вопрос на форуме.
7. Вопросы, связанные с проблемами ПО, задавайте в разделе Программное обеспечение
Модераторы: Akina
Страницы: (22) « Первая ... 20 21 [22]   ( Перейти к последнему сообщению )  
> Полезные скрипты , WSH (js, vbs) + WMI
    Функция для 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 - режим отображения сообщений.
    При работе в "молчаливом" режиме не выводятся никакие сообщения, кроме сообщений о ситуациях, приводящих к аварийному завершению работы функции. Данный режим никак не влияет на процедуру ведения журнала.

    Возвращаемое значение у функции отсутствует.
    ExpandedWrap disabled
      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
    Сообщение отредактировано: Dmitrii -
      Нашел в самом начале топика скрипт от B.V. - Вывод на экран списка всех запущенных на локальной рабочей станции процессов

      Я сам работаю в VBA, и вышеуказанный скрипт очень пригодился для активации окна соседнего приложения и открытия файла Excel - именно в соседнем приложении.
      Приведу немного переделанный и подогнанный код для VBA

      ExpandedWrap disabled
        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 и получить полные имена всех открытых файлов.

      Как это можно сделать через скрипт?
          Просто если использовать тег VB вместо VB Script код становится намного читабельней.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:
          Страницы: (22) « Первая ... 20 21 [22] 


          Рейтинг@Mail.ru
          [ Script execution time: 0,0493 ]   [ 16 queries used ]   [ Generated: 19.03.24, 11:25 GMT ]