Полезные скрипты CMD/BAT

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Dragokas, 23 сен 2013.

  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Здесь собираем команды и простые скрипты Batch, VBScript, Powershell,
    имеющие специфику безопасности:

    - проверка, сбор информации и диагностика системы;
    - восстановление после заражения;
    - резервное копирование;
    - усиление защиты.

    Все скрипты по мере добавления будут сгруппированы в первом посте.

    Вы можете задать вопрос по любому коду, а также выложить свой, создав новую тему в этом разделе.

    Каталог удобняшек:
    - Восстановление и лечение
    Восстановление файловых ассоциаций - Windows XP (CMD, Reg) Windows XP, 7, 8 (CMD, Reg)
    Восстановление шрифтов после сбоя (крякозябры в окнах Windows вместо русского текста) (CMD)
    "Крякозябры" при копировании текста с форума в программу и схожие проблемы... (CMD)
    Команды консоли восстановления (Windows Recovery Console)

    - Информация о системе
    Определение версии ОС, разрядности, сборки, семейства операционной системы, разрядности среды, из которой запущен Batch
    Просмотр последнего отчета о проверке диска (chkdsk) (Powershell)
    GetUserBySID: Определение имени учетной записи пользователя по указанному идентификатору безопасности SID (VBScript)

    - Интерфейс, удобство работы и быстрый запуск
    Прыжок в ветку реестра, имя которой скопировано в буфер (CMD + exe)
    RUN Команды Windows, RunDll32

    - Проверка системы на ошибки/уязвимости

    - Права доступа
    Как сменить владельца папки или файла (Hands, CMD, Reg, AVZ)

    - Резервное копирование
    Быстрое резервное копирование данных с помощью Robocopy в Windows 7 (CMD)
    Создание контрольной точки восстановления системы

    - Реестр
    reg.exe и основы работы с реестром (CMD)

    - Сеть

    - Очистка
    Удаление временных файлов планировщиком по расписанию c учетом критериев даты создания/изменения (CMD, VBScript)
    Как удалить неудаляемые файлы из корзины?
     
    Последнее редактирование: 5 май 2014
    Guest, tzrb, Legion107 и 7 другим нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Просмотр последнего отчета о проверке диска (chkdsk)

    Нажмите комбинацию клавиш Win + R и введите PowerShell

    Скопируйте и вставьте код:

    Для Windows 7
    PHP:
    get-winevent -FilterHashTable @{logname="Application"; id="1001"; starttime="01/01/2011"}| ?{$_.providername –match "wininit"} | fl timecreated, message > "$env:homepath\desktop\chkdsk_history.txt"
    и нажмите ENTER.

    Для Windows 8
    PHP:
    Get-EventLog -LogName Application -Source chkdsk | select -Last 5 -ExpandProperty Message > "$env:homepath\desktop\chkdsk_history.txt"
    Лог будет сохранен в файл chkdsk_history.txt на рабочем столе.

    Спасибо Koza Nozdri и dzu38
     
    Последнее редактирование: 6 янв 2014
    Turok, akok, machito и 2 другим нравится это.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Прыжок в ветку реестра, имя которой скопировано в буфер (RegJump MOD)
    v.1.2.
    (29.09.2013)

    Скачать обновления смотрите в нашем ресурсе.

    Поддерживаются такие форматы:

    HKCU\Ключ
    [HKCU\Ключ]
    HKCU\Ключ\Параметр
    HKEY_CURRENT_USER\Ключ

    Например: [HKLM\System\Setup\WorkingDirectory]

    Копирайты - в тексте батника.
     
    Последнее редактирование: 4 авг 2014
    DllPok, machito, Legion107 и 3 другим нравится это.
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    GetUserBySID: Определение имени учетной записи пользователя по указанному идентификатору безопасности SID

    GetUserBySID.png

    Код (vb.net):
    on error resume next
    SID = inputBox("Введите SID: ", "GetUserBySID")
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set objAccount = objWMIService.Get("Win32_SID.SID='" & SID & "'")
    if err <> 0 then
        msgbox "SID не найден!"
    else
        user = objAccount.AccountName
        domain = objAccount.ReferencedDomainName
        ret = inputbox("SID: " & SID & vblf & _
          "Binary: " & Join(objAccount.BinaryRepresentation, ",") & vblf & _
          "Domain: " & Domain & vblf & _
          "UserName: " & user, "GetUserBySID - ответ", _
          domain & "\" & user)
    end if

    Появится диалоговое окно, куда можно ввести например:
    Вопрос Ответ
    1 WD Все
    2 S-1-1-0 Все
    3 CO СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
    4 S-1-3-0 СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
    5 BU BUILTIN\Пользователи
    6 BA BUILTIN\Администраторы
    7 AU NT AUTHORITY\Прошедшие проверку
    8 S-1-5-11 NT AUTHORITY\Прошедшие проверку
    9 SY NT AUTHORITY\система
    10 SU NT AUTHORITY\СЛУЖБА



    Посмотреть вложение GetUserBySID.zip
    Посмотреть вложение GetSIDByUser3.zip
     
    Последнее редактирование: 5 май 2014
    machito, akok и Kиpилл нравится это.
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Определение:

    • версии,
    • разрядности,
    • сборки,
    • семейства операционной системы,
    • разрядности среды, из которой запущен Batch

    Код (DOS):
    @echo off
    SetLocal EnableExtensions

    call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"

    echo Версия ОС:      %OSVer%
    echo Рязрядность ОС: %Core%
    echo Сборка:         %Build%
    echo Семейство:      %Family%
    echo Разрядность среды запуска Batch: %EnvironCore%

    pause
    Exit /B

    :GetSystemVersion [OSVersion] [OSCore] [OSBuild] [OSFamily] [EnvironmentCore]
    :: Определить версию ОС
    :: %1-исх.Переменная для хранения названия ОС
    :: %2-исх.Переменная для хранения разрядности ОС
    :: %3-исх.Переменная для хранения версии сборки ОС
    :: %4-исх.Переменная, идентифицирующая семейство ОС (9x, NT, Vista)
    :: %5-исх.Переменная, идентифицирующая разрядность среды, из-под которой запущен скрипт
      Set "xOS=x64"& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set "xOS=x32"
      set "%~2=%xOS%"
      set "%~5=x32"& if "%xOS%"=="x64" echo "%PROGRAMFILES%" |>nul find "x86" || set "%~5=x64"
      set "_key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
      For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentBuildNumber"^|Find "CurrentBuildNumber"') do set "%~3=%%~b"
      For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentVersion"^|Find "CurrentVersion"') do set "_ver=%%~b"
      For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "ProductName"^|Find "ProductName"') do set "%~1=%%~b"
      if "%_ver:~0,1%"=="6" (set "%~4=Vista") else (set "%~4=NT")
    Exit /B
    Посмотреть вложение SysVersion.zip
     
    Последнее редактирование: 18 дек 2013
    DllPok, machito, Legion107 и 3 другим нравится это.
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Создание контрольной точки восстановления системы

    Программно:

    В Windows Vista, 7, 8 необходимо запускать в режиме повышенных привилегий.

    Код VBScipt:
    Код (vb.net):
    GetObject("winmgmts:\\.\root\default:Systemrestore").CreateRestorePoint "SafeZone.cc", 10, 100
    код Batch:
    Код (DOS):
    WMIC /Namespace:\\root\default Path SystemRestore Call CreateRestorePoint "SafeZone.cc", 100, 10
    Код Powershell:
    Код (PowerShell):
    $sysrestore = [wmiclass]"\\.\root\default:systemrestore"
    $sysrestore.CreateRestorePoint("MyRestorePoint", 0, 100)
     
    Вручную: через апплет "Свойства системы":
    открыть окно - rundll32 shell32.dll,Control_RunDLL sysdm.cpl,,4
    Как создать новую контрольную точку восстановления и очистить предыдущие

    Восстановление состояния системы до последней контрольной точки

    Программно:
    Код (vb.net):
    Dim LastRP
    Set SRP = GetObject("winmgmts:\\.\root\default").InstancesOf("SystemRestore")
    For Each objRP In SRP
      LastRP = objRP.SequenceNumber
    Next
    If Not IsEmpty(LastRP) Then
      GetObject("winmgmts:\\.\root\default:SystemRestore").Restore LastRP
      Set OS = GetObject("winmgmts:{(Shutdown)}\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_OperatingSystem WHERE Primary = True")
      For Each objOS In OS
        objOS.Reboot
      Next
    End If
    Вручную через служебную программу rstrui.exe
     
    Последнее редактирование: 4 ноя 2013
    machito, Legion107, Phoenix и 5 другим нравится это.
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Рекурсивный DIR /X

    Используется для получения имени файла/папки в формате 8.3,
    если другими способами не получается удалить/переименовать объект.

    Выводит отчет в форматах Plain Text (DirX.txt) и CSV (DirX.csv) рекурсивно для текущего и всех подкаталогов,
    начиная с места, откуда батник сам запущен.

    Если отчет не был создан, запустите батник правым кликом "От имени Администратора".

    Помните: некоторые объекты с некорректным именем можно удалить/переименовать,
    добавив к полному имени файла! префикс \\?\
    например:
    Код (Text):
    rd "\\?\c:\temp\badfolder..\"
    Этот способ отключает некоторые ограничения на операции с файловой системой.

    Ссылки по теме:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
    http://safezone.cc/threads/flystudi...obrazit-propavshee-soderzhimoe-fleshki.12352/
    http://safezone.cc/threads/vosstanovlenie-dostupa-k-papkam-fajlam-so-specsimvolami-v-imeni.21291/

    Код (Text):
    @echo off
    SetLocal EnableExtensions
    chcp 862 >NUL

    set "Cur=%~dp0"
    set "Cur=%Cur:~0,-1%"

    set "log_txt=%Cur%\DirX.log"
    set "log_csv=%Cur%\DirX.csv"

    2>NUL del "%log_txt%"
    2>NUL del "%log_csv%"

    echo Type;Dir /X (8.3);Real Name;>>"%log_csv%"

    call :DirRec "%Cur%" "%Cur%"

    pause
    exit /B

    :DirRec [папка]
      For /F "skip=5 tokens=1-6" %%A in ('Dir /X /A /OS /-C "%~1" 2^>NUL') do (
        if "%%B" NEQ "File(s)" if "%%B" NEQ "Dir(s)" (
          if "%%C"=="<DIR>" (
            if "%%D" NEQ "." if "%%D" NEQ ".." (
              if "%%E"=="" (
                echo DIR  "%~1\%%D" "%~1\%%D">> "%log_txt%"
                echo DIR ;"%~1\%%D";"%~1\%%D">> "%log_csv%"
              ) else (
                echo DIR  "%~2\%%E" "%~1\%%D">> "%log_txt%"
                echo DIR ;"%~2\%%E";"%~1\%%D">> "%log_csv%"
              )
              call :DirRec "%~1\%%D" "%~2\%%E"
            )
          ) else (
              if "%%E"=="" (
                echo FILE "%~2\%%D" "%~1\%%D">> "%log_txt%"
                echo FILE;"%~2\%%D";"%~1\%%D">> "%log_csv%"
              ) else (
                echo FILE "%~2\%%E" "%~1\%%D">> "%log_txt%"
                echo FILE;"%~2\%%E";"%~1\%%D">> "%log_csv%"
              )
          )
        )
      )
    Exit /B

    >>> Посмотреть вложение DirX2.zip <<<


    В дополнение:

    Исправление проблемы, когда не работает вывод коротких имен файлов Dir /X
    Источник: techguy.org

    Режим представления коротких имен файлов может быть отключен.
    Тогда Вам не удастся получить имя в формате 8.3 командой DIR /X

    Проверить это можно, введя команду:
    Код (DOS):
    fsutil behavior query disable8dot3
    Чтобы снова включить этот режим, введите:

    1) для XP:
    Код (DOS):
    fsutil behavior set disable8dot3 0
    2) для Vista и выше:
    Код (DOS):
    fsutil behavior set disable8dot3 2
    Напомню, что данный режим отображает альтернативные имена в формате 8.3 и будет удобен,
    когда требуется работать с именами файлов и папок, имеющих:

    Для автоматической подстановки и парсинга имен в формате 8.3. можно воспользоваться такой циклической конструкцией:

    Код (DOS):
    for /f "skip=5 tokens=4" %%? in ('dir /X /-C /A-D "c:\users\alex\desktop\*"') do echo %%?
    Здесь я (имя пользователя: Alex) перечисляю у себя на рабочем столе (папка Desktop) все файлы (\*).
    Вместо команды echo можно подставить любую другую, взаимодействующую с файлом формата 8.3.

    Учитывайте, что эта команда выводит в конце 2 лишних строки.
    Код (DOS):
    @echo off
    SetLocal EnableDelayedExpansion
    :: Вот моя команда для вывода всех файлов с ключами
    :: /X - формат 8.3.
    :: /-C - убрать разделитель рядов объема файла
    :: /A-D - отобразить все скрытые объекты, -D - исключить папки
    :: \* - все объекты, вне зависимости от их имени
    set dir_com=dir /X /-C /A-D "c:\users\alex\desktop\*"
    :: Считаю кол-во строк в выводе команды DIR, отнимаю шапку и 2 последних строки
    for /F %%? in ('%dir_com%^| find /C /V ""') do set Total=%%?& Set /A Total-=7&:: 7 = skip+2
    :: Получаю вывод команды DIR, без учета ненужных строк
    for /F "skip=5 tokens=4" %%? in ('%dir_com%') do Set /A C+=1& if !C! LEQ %Total% echo %%?
     
    Последнее редактирование: 20 окт 2013
    machito, akok, Drongo и 3 другим нравится это.
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Шаблон батника из контекстного меню "Создать"

    Автор: Koza Nozdri & Dragokas

    Код (DOS):
    @echo off
    Chcp 866 >nul
      title  Пункт меню "Создать..."
      SetLocal EnableExtensions

    ver |>NUL find "6." && if "%1" neq "Admin" call :elevate
    chdir /d "%~dp0"

    (
      echo @echo off
      echo SetLocal EnableExtensions EnableDelayedExpansion
      echo Chcp 866 ^>nul
      echo title text title
      echo cd /d "%%~dp0"
      echo.
      echo.
      echo.
      echo pause
      echo exit /B
    ) > "%~dp0new.bat"

    md %systemdrive%\Windows\ShellNew 2>NUL
    copy /y "%~dp0new.bat" %systemdrive%\Windows\ShellNew\
    reg.exe add "HKCR\.bat\ShellNew" /ve /f
    reg.exe add "HKCR\.bat\ShellNew" /v FileName /d New.bat /f
    del /q "%~dp0new.bat"
    cls
    Echo Пункт создан,перезагрузите компьютер.
    Echo Для выхода нажмите Enter
    pause>nul
    Exit /B

    :Elevate
      Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"Admin","","runas",1 >"%~dp0Elevating.vbs"
      cscript.exe //nologo "%~dp0Elevating.vbs" "%~dpnx0"
      del "%~dp0Elevating.vbs"
    Exit
    Код (DOS):
    @echo off
    SetLocal EnableExtensions EnableDelayedEpansion
    Chcp 866 >nul
    title text title
    cd /d "%~dp0"



    pause
    exit /B
    Код (Text):
    @echo off
    ::Включаем режим выполнения команд без сообщений

    SetLocal
    :: Включение локализации изменений среды в пакетном файле
    :: Чтобы изменение переменных в этом батнике не влияли на другие батники, запускаемые по цепочке.
    :: Для быстрого обнуления всех переменных (особенно актуально для псевдо-массивов), используя команду EndLocal

    SetLocal EnableExtensions
    :: разрешение использовать дополнительных ключей команд (например FOR /F) и других защит от дурака,
    :: например, переход в папку с пробелами без указания кавычек в пути (например CD My Tools)

    SetLocal EnableDelayedEpansion
    :: Возможность получить актуальное значение переменной внутри цикла или блока команд,
    :: например указывая вместо %time% знаки восклицания !time!

    Chcp 866 >nul
    :: Включение кодировки 866 для того что бы русский текст не был кракозябрами в сценарии

    title text title
    :: Значение после первого слова title  будет отображаться в названии исполняемого пакетного файла

    cd /d "%~dp0"
    :: Переход в текущий каталог,сокращает код с параметрами типа del bat.bat вместо del %~dp0bat.bat
    ::То есть при работе с файлами в папке с bat сценарием не надо дописывать аргументы
    :: И при этом вы не рискуете по ошибке запороть систему командой типа: del bat.bat
    ::Не имеющей в скрипте аргумента cd /d "%~dp0"

    pause
    :: До того как будет написана финальная версия кода команда pause будет полезная для выявления ошибок и багов
    ::Либо для принятия решения о доработке кода

    exit /B
    Выход из текущего пакетного сценария.

    Create_Batch_File.png

    Посмотреть вложение CreateBAT.zip
     
    Последнее редактирование: 27 окт 2013
    machito, akok, Kиpилл и ещё 1-му нравится это.
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Удаление всех сетевых шар

    Код (DOS):
    @set @x=0; /*
    @echo off
    SetLocal
    ver |>NUL find "6." && if "%1" neq "Admin" (
      echo. Требуются права Администратора
      echo.
      pause & cscript.exe //nologo //e:jscript "%~f0" & Exit /B
    )
    echo.
    echo. Скрипт удаления всех сетевых шар
    echo.
    echo. Список исходных шар:
    echo.
    net share
    for /F "skip=4" %%? in ('net share ^| find /V "Команда выполнена" ^| find /V "The command completed"') do (
      net share "%%?" /DELETE
    )
    echo.
    echo. Список исходных шар после удаления:
    echo.
    net share
    echo.
    pause
    Exit /B
    */new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
     

    Вложения:

    • DEL_Shares.zip
      Размер файла:
      591 байт
      Просмотров:
      28
    E100, tzrb, machito и 5 другим нравится это.
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Process Monitor
    Ведет протокол имен и Process ID запускаемых и завершаемых процессов
    в файлы формата Plain Text и CSV.

    Ограничение: не засекает процессы, время жизни которых менее 1 сек.

    Пользователь Dragokas разместил новый ресурс:

    Мониторинг запуска/завершения процессов - Записывает в протокол имена и PID процессов, которые запускаются/завершаются

    Ведет протокол имен и Process ID запускаемых и завершаемых процессов
    в файлы формата Plain Text и CSV.

    Ограничение: не засекает процессы, время жизни которых менее 1 сек.
    Если нужно детальное отслеживание, используем SysInternals Process Monitor
    и выставляем фильтры "Event Class" = "Process".

    Протокол создается рядом со скриптом.
    Чтобы завершить работу монитора, запустите скрипт еще раз.

    Код (vb.net):
    sCurFolder = left(WScript.ScriptFullname, instrrev(WScript.ScriptFullname, "\"))
    sLogFile1 = sCurFolder & "Processes.log"
    sLogFile2 = sCurFolder & "Processes.csv"
    sMarker = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%temp%") & "\Marker_Process_Watcher_Dragokas"
    sComputer = "."

    ' Слежение за событием класса Win32_Process каждые 1 секунду
    Set objWMIService = GetObject("winmgmts:\\" & sComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
      ("SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")

    set oFSO = CreateObject("Scripting.FileSystemObject")

    ' Если уже выполняется монитор, удалить маркер и завершить текущий сценарий
    if CheckMarker("Exist") then CheckMarker("Delete"): WScript.Echo "Мониторинг завершен.": WScript.Quit

    ' Создать шапку протокола
    set oTS1 = oFSO.CreateTextFile(sLogFile1, true) ' true - overwrite
    set oTS2 = oFSO.CreateTextFile(sLogFile2, true) ' true - overwrite
    oTS1.WriteLine "Event        Date-Time    PID    Process Name    Par.PID    Parent Proc.Name    Command Line Arguments"
    oTS1.WriteLine "-----        ---------    ----------------    -------    ----------------    ----------------------"
    oTS2.WriteLine "Event;Date-Time;Process ID;Process Name;Parent PID;Parent Process Name;Command Line Arguments"

    sMessage = "Сейчас начнется мониторинг создания/завершения процессов." & vbLf & "Протокол дополняется в файл: " & sLogFile1 & " (.csv)" &_
      vbLf & vbLf & "Чтобы завершить мониторинг, запустите скрипт еще раз :)"

    ' Если скрипт сам себя не перезапускал
    if WScript.Arguments.Count = 0 then
        ' Если скрипт запущен под админ. правами
        if isAdminRights() then
            WScript.Echo sMessage
        else
            if Msgbox(sMessage & vbLf & vbLF & "Запустить с правами Администратора?", vbYesNo + VbInformation, "Process Monitor by Dragokas") = vbYes then
                ' Получение прав Администратора
                Elevate()
                WScript.Quit
            end if
        end if
    end if

    CheckMarker("Create")

    Do
        ' Ожидаем события
        Set objLatestEvent = colMonitoredEvents.NextEvent()

        set oProc = objLatestEvent.TargetInstance

        ' Проверяем вид события
        Select Case objLatestEvent.Path_.Class
          Case "__InstanceCreationEvent"
            if not CheckMarker("Exist") then Exit Do
            oTS1.WriteLine "Created" & ProcInfo(oProc, vbTab)
            oTS2.WriteLine "Created" & ProcInfo(oProc, ";")
          Case "__InstanceDeletionEvent"
            if not CheckMarker("Exist") then Exit Do
            oTS1.WriteLine "Deleted" & ProcInfo(oProc, vbTab)
            oTS2.WriteLine "Deleted" & ProcInfo(oProc, ";")
        End Select
    Loop

    ' Закрываем файл-протокол
    oTS1.Close()
    oTS2.Close()

    set oProc = Nothing: set objLatestEvent = Nothing: set oFSO = Nothing: set oTS = Nothing: Set colMonitoredEvents = Nothing: Set objWMIService = Nothing

    Function ProcInfo(objProcess, Delim) ' Получения свойств события процесса, определение родительского процесса
      with objProcess
        ParentPID = .ParentProcessId
        if ParentPID <> 0 then
            set oParentProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = '" & ParentPID & "'")
            if not oParentProcesses is Nothing then
                For each oParentProc in oParentProcesses
                    ParentName = oParentProc.Name
                next
                set oParentProcesses = Nothing: set oParentProc = Nothing
            end if
            set oParentProc = Nothing
        end if
        ProcInfo = Delim & Now & Delim & .ProcessId & Delim & .Name & Delim & .ParentProcessId & Delim & ParentName & Delim & .CommandLine
      end with
    End function

    Function CheckMarker(Action) ' Слежение за маркером запуска/завершения монитора
      Select case Action
        Case "Create"
          set oMarker = oFSO.CreateTextFile(sMarker, true)
          oMarker.Close()
          set oMarker = Nothing
        Case "Delete"
          On error resume next
          For N = 1 to 10
            oFSO.DeleteFile sMarker, true 'true - Read Only Force
            if Err = 0 then Exit For
            Err.Clear
            WScript.Sleep(100) 'Если возник конфликт общего доступа, ждем 100 мс. и повторим
          next
          On error Goto 0
        Case "Exist"
          CheckMarker = oFSO.FileExists(sMarker)
      End Select
    End Function

    Sub Elevate()
      Const DQ = """"
      Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")
      For Each oOS In colOS
        strOSLong = oOS.Version
      Next
      If Left(strOSLong, 1) = "6" Then
        If Not isAdminRights Then
            Set oShellApp = CreateObject("Shell.Application")
            oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ & " " & DQ & "Twice" & DQ, "", "runas", 1
            WScript.Quit
        End If
      End If
      set oOS = Nothing: set colOS = Nothing: set oShellApp = Nothing
    End Sub

    Function isAdminRights()
        Const KQV = &H1, KSV = &H2, HKCU = &H80000001, HKLM = &H80000002
        Set oReg = GetObject("winmgmts:root\default:StdRegProv")
        strKey = "System\CurrentControlSet\Control\Session Manager"
        intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
        isAdminRights = flagAccess
        Set oReg = Nothing
    End Function

     

    Вложения:

    machito, akok, orderman и 2 другим нравится это.
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    GetAssocTool - Получение пути к программе, асоциированной с расширением имени файла
    Задаем интересующий тип файлов,
    получаем путь к приложению по-умолчанию для открытия этого расширения.

    Код (vb.net):
    ext = inputbox ("Введите расширение имени файла:")
    Path = GetAssocTool(ext)
    Name = GetFileNameFromPath(Path)

    msgbox "Расширение: " & ext & vbLf & "Имя файла: " & Name & vbLf & "Путь: " & Path


    Function GetAssocTool(ext)
        'Получение пути к приложению, с которым ассоциировано расширение имени файла
        if left(ext,1) <> "." then ext = "." & ext
        if GetOSFamily() = "NT" then GetAssocTool = GetAssocTool_XP(ext) else GetAssocTool = GetAssocTool_Vista(ext)
    End Function

    Function GetAssocTool_Vista(ext)
        user_key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & ext & "\UserChoice\Progid"

        set oShell = CreateObject("WScript.Shell")
        on error resume next
        progID = oShell.RegRead(user_key)
        on error goto 0

        if progid = "" then progID = oShell.RegRead("HKCR\" & ext & "\")

        comm = oShell.RegRead("HKCR\" & progID & "\shell\open\command\")

        GetAssocTool_Vista = ParsePathFromCommandLine(comm)
    End Function

    Function GetAssocTool_XP(ext)
        curSID = GetCurrentSID()
        set oShell = CreateObject("WScript.Shell")
        on error resume next
        EXE_Name = oShell.RegRead("HKEY_USERS\" & curSID & "\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt\Application")
        on error goto 0
        if EXE_Name <> "" then
            comm = oShell.RegRead("HKCR\Applications\" & EXE_Name & "\shell\open\command\")
        else
            progID = oShell.RegRead("HKCR\" & ext & "\")
            comm = oShell.RegRead("HKCR\" & progID & "\shell\open\command\")
        end if

        GetAssocTool_XP = ParsePathFromCommandLine(comm)
    End Function


    Function ParsePathFromCommandLine(comm)
        'Получает путь из командной строки, если кроме него заданы дополнительные аргументы; убирает кавычки

        If Left(comm, 1) = """" Then
            ParsePathFromCommandLine = Mid(comm, 2, InStr(2, comm, """") - 2)
        Else
            ParsePathFromCommandLine = Split(comm)(0)
        End If
    End Function


    Function GetFileNameFromPath(sPath)
        'Преобразование пути в имя файла

        if instr(sPath,"\") = 0 then GetFileNameFromPath = sPath: Exit Function
        GetFileNameFromPath = Mid(sPath, InStrRev(sPath, "\") + 1)
    End Function


    Function GetCurrentSID()
        'Получить SID текущего пользователя

        Set oNetwork = CreateObject("WScript.Network")
        sUserName = oNetwork.UserName
        sDomain = oNetwork.UserDomain

        Set oWMI = GetObject("winmgmts:\root\cimv2")
        Set colSIDs = oWMI.ExecQuery("SELECT * FROM Win32_UserAccount WHERE Caption='" & sDomain & "\\" & sUserName & "'")
        For each oSID in colSIDs
            GetCurrentSID = oSID.SID
        Next
        Set oWMI = Nothing: Set colSIDs = Nothing
    End Function


    Function GetOSFamily()
        ' Семейство ОС
        set oShell = CreateObject("WScript.Shell")
        OSVersion = oShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")

        if cint(left(OSVersion,1)) < 6 then GetOSFamily = "NT" else GetOSFamily = "Vista"
    End Function
     
     

    Вложения:

    Последнее редактирование: 13 янв 2014
    E100, machito, akok и 5 другим нравится это.
  12. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Управление локальными сетевыми подключениями (включить/отключить)
    Совместимость: Windows Vista и выше.

    network_on_off_demo.png

    Код (DOS):
    @set @x=0; /*
    @echo off
    if "%1"=="" cscript.exe //nologo //e:jscript "%~f0"& Exit
    SetLocal EnableDelayedExpansion
    mode con: cols=90 lines=20

    :begin
    cls
    Echo Доступны следующие интерфейсы:
    Echo.
    netsh interface show interface | more +3 | findstr "." | find /n /v ""
    Echo.
    for /f "skip=2 tokens=3*" %%a in ('netsh interface show interface') do set /a N+=1& set Local!N!=%%b
    Echo.[0] - Обновить данные
    echo.

    :check
    set ID=0
    set /p "ID=Введите № интерфейса для управления: "
    if "%ID%"=="0" goto begin

    echo.
    echo. Выбран: !Local%ID%!
    echo.
    echo 1 - Подключить
    echo 2 - Отключить

    set /p action=
    if "%action%"=="1" (
      Echo Поключаю...
      netsh interface set interface name="!Local%ID%!" admin=ENABLED
    ) else (
      Echo Отключаю...
      netsh interface set interface name="!Local%ID%!" admin=DISABLED
    )
    pause
    goto begin
    */new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
     

    Вложения:

    Последнее редактирование: 24 дек 2013
    tzrb, machito, Phoenix и 3 другим нравится это.
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    IP Location Checker
    Авторы: Dragokas & LAMM_-*-_VURDALAK
    Описание:
    - принимает IP или имя WEB-страницы
    - выдает такую информацию:
    • IP-адрес
    • Страну, код страны
    • Город (RU, EN)
    • IP Range
    • вычисляет маску подсети (битовую и по октетам)
    • определяет Ваш IP-адрес (если ничего не ввести)
    Лицензия: код не является свободно распространяемым. Перепубликация - только с разрешения автора.
    Скрипт является частью программы LAMM-*-VURDALAK's banning tool.
    Данные парсятся со страниц:
    IPLocator.png

    Обсуждение в этой теме: http://safezone.cc/threads/ip-location-checker-obsuzhdenie.28611/
     

    Вложения:

    • BB_Full.zip
      Размер файла:
      5,5 КБ
      Просмотров:
      44
    Последнее редактирование: 25 ноя 2016
    E100, machito, Kиpилл и 2 другим нравится это.
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Смена владельца и прав на папку и ее содержимое, в которой запущен батник (Full Access <-> Read Only)
    Автор: Dragokas

    1) RO.cmd (ReadOnly) - делает все файлы и папки доступными только для чтения и выполнения.
    Дополнительно разрешается в текущей папке - создавать файлы.
    Все остальные операции, в т.ч. и создание файлов в подкаталогах - запрещено.

    2) FA.cmd (FullAccess) - восстанавливает полный доступ для всех пользователей.

    Для нормальной работы в ОС Windows Vista, Win 7 батник нужно запускать правой кнопкой мыши "От имени Администратора".

    Как пользоваться:
    Соблюдайте правила: запускать батник только из той папки, в которой нужно ограничить доступ (RO.cmd) или получить полные права (FA.cmd).
    Работает рекурсивно для всех подкаталогов, начиная с каталога, в котором находится батник.


    Для корректной работы потребуется утилита из состава Microsoft Support Tools - ICACLS
    (включена в ОС Windows Server 2003, начиная с SP2).

    Поддержка:
    Скрипт протестирован в средах английской и русской локализаций, а также:
    1) Windows XP SP2 (требуется утилита ICACLS). ICACLS из состава Windows 7 несовместим с XP.
    2) Windows Server 2003 SP2
    3) Windows 7 SP1

    Сохранять в кодировке OEM-866.

    FA.cmd
    Код (DOS):
    @echo off
    if "%1"=="" (
    Echo Working...
    Call "%~dpnx0" 0 1>nul 2>&1
    Echo Ready...
    Goto :eof
    )

    Setlocal Enableextensions

    Set Cur=%~dp0
    Set Cur=%Cur:~0,-1%

    takeown /f "%Cur%" /r /d y

    icacls "%Cur%" /grant All:f /T /C
    icacls "%Cur%" /grant Все:f /T /C
    RO.cmd
    Код (DOS):
    @echo off
    if "%1"=="" (
    Echo Working...
    Call "%~dpnx0" 0 1>nul 2>&1
    Echo Ready...
    Goto :eof
    )

    Setlocal Enableextensions

    Set Cur=%~dp0
    Set Cur=%Cur:~0,-1%

    takeown /f "%Cur%" /r /d y

    icacls "%Cur%" /deny All:(DE,WDAC,WO,AS,WD,AD,WEA,DC,WA) /T /C
    icacls "%Cur%" /deny Все:(DE,WDAC,WO,WD,AS,AD,WEA,DC,WA) /T /C

    icacls "%Cur%" /grant All:(RC,S,GR,GW,GE,RD,REA,X,RA) /T /C
    icacls "%Cur%" /grant Все:(RC,S,GR,GW,GE,RD,REA,X,RA) /T /C

    icacls "%Cur%" /grant All:(WD) /C
    icacls "%Cur%" /grant Все:(WD) /C

    icacls "%~dpnx0" /grant:r Все:f /C
    icacls "%~dpnx0" /grant:r All:f /C
    В коде использован метод двойного запуска скрипта исключительно для упрощения
    перенаправления потока вывода в NUL.
    Метод "обворачивания" скобками приводил к синтаксическим ошибкам в силу
    некоторых особенностей работы утилиты ICACLS.

     

    Вложения:

    E100, machito, Phoenix и 2 другим нравится это.
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Включение макросов в Microsoft Office 2003 - 2013
    Автор скрипта: Dragokas
    Версия: v.1.3 (31.08.2016)
    Совместимость: Windows XP, Vista, Seven, 8. (x32, x64)
    Office 2000, XP, 2003, 2007, 2010, 2013 (x32, x64).
    • Завершите все офисные приложения.
    • После запуска батника выберите цифру и нажмите ENTER:
    1 - Запуск макросов без уведомления.
    2 - Запуск макросов с разрешения пользователя.
    3 - Запретить запуск неподписанных макросов (не уведомлять).

    Рекомендуется выбирать 2.

    Макросы включаются/отключаются одновременно во всех установленных приложениях:
    - Word
    - Excel
    - OutLook
    - Access
    - PowerPoint
    Код (DOS):
    @echo off
    :: Macros Access Script by Alex Dragokas
    echo.
    echo Утилита включения макросов для MS Office 2003-2013
    echo.
    :ch_Security
    echo Введите цифру и нажмите кнопку ENTER:
    echo.
    echo 1 - Запуск макросов без уведомления.
    echo 2 - Запуск макросов с разрешения пользователя.
    echo 3 - Запретить запуск неподписанных макросов (не уведомлять).
    echo.
    set ch=
    set /p "ch=Ваш выбор: "
    echo.
    if "%ch%"=="1" set "MacrosLevel=1"
    if "%ch%"=="2" set "MacrosLevel=2"
    if "%ch%"=="3" set "MacrosLevel=3"
    if "%ch%" neq "1" if "%ch%" neq "2" if "%ch%" neq "3" goto ch_Security
    :ch_VBA
    echo Хотите включить программный доступ к коду макроса?
    echo.
    echo 1 - Да. Разрешить.
    echo 2 - Нет. Запретить.
    echo.
    set ch=
    set /p "ch=Ваш выбор: "
    echo.
    if "%ch%"=="1" set "ProjectLevel=1"
    if "%ch%"=="2" set "ProjectLevel=0"
    if "%ch%" neq "1" if "%ch%" neq "2" goto ch_VBA

    :: Проверяю, запущен ли хоть один из процессов MS Office

    :Check
    call :CheckRun || (echo.& echo НЕЛЬЗЯ продолжить. Сначала нужно завершить все офисные приложения.& echo.& pause & echo.& goto Check)

    For %%k in (
      HKCU\Software\Microsoft\Office
      HKCU\Software\Wow6432Node\Microsoft\Office
    ) do (
      For /F "tokens=5 delims=\" %%a in ('reg query "%%k" 2^>NUL ^| findstr /R "^.*\\[0-9].*"') do (
        if "%%a" neq "8.0" (
          if "%%a"=="9.0"  (echo Обнаружен MS Office 2000 & call :EnumApps 2003 "%%a")
          if "%%a"=="10.0" (echo Обнаружен MS Office XP   & call :EnumApps 2003 "%%a")
          if "%%a"=="11.0" (echo Обнаружен MS Office 2003 & call :EnumApps 2003 "%%a")
          if "%%a"=="12.0" (echo Обнаружен MS Office 2007 & call :EnumApps 2007 "%%a")
          if "%%a"=="13.0" (echo Обнаружен MS Office 2010 & call :EnumApps 2007 "%%a")
          if "%%a"=="14.0" (echo Обнаружен MS Office 2010 & call :EnumApps 2007 "%%a")
          if "%%a"=="15.0" (echo Обнаружен MS Office 2013 & call :EnumApps 2007 "%%a")
          if not Defined isChanges (echo Обнаружена неизвестная версия MS Office & call :EnumApps 2007 "%%a")
          echo.
        )
      )
    )
    pause
    exit /B

    :EnumApps %1-mso.family %2-key.version
      Set "isChanges=true"
      For %%k in (
        HKCU\Software\Microsoft\Office\%~2
        HKCU\Software\Wow6432Node\Microsoft\Office\%~2
      ) do (
        For /F "tokens=6 delims=\" %%a in ('reg query "%%k" 2^>NUL') do (
          if /i "%%a"=="Word" call :ChangeSecurity "%~1" "%~2" "%%a"
          if /i "%%a"=="Excel" call :ChangeSecurity "%~1" "%~2" "%%a"
          if /i "%%a"=="PowerPoint" call :ChangeSecurity "%~1" "%~2" "%%a"
          if /i "%%a"=="Access" call :ChangeSecurity "%~1" "%~2" "%%a"
          if /i "%%a"=="Outlook" call :ChangeSecurity "%~1" "%~2" "%%a"
        )
      )
    Exit /B

    :ChangeSecurity %1-mso.family %2-key.version %3-Application
      echo %~3
      if "%~1"=="2003" reg add "HKCU\Software\Microsoft\Office\%~2\%~3\Security" /v Level /t REG_DWORD /d %MacrosLevel% /f
      if "%~1"=="2007" reg add "HKCU\Software\Microsoft\Office\%~2\%~3\Security" /v VBAWarnings /t REG_DWORD /d %MacrosLevel% /f
      if /i "%~3" neq "Outlook" if "%~2" neq "9.0" reg add "HKCU\Software\Microsoft\Office\%~2\%~3\Security" /v AccessVBOM /t REG_DWORD /d %ProjectLevel% /f
    Exit /B

    :CheckRun
      TASKLIST /FI "imagename eq winword.exe" | find /i "winword.exe" && exit /B 1
      TASKLIST /FI "imagename eq excel.exe" | find /i "excel.exe" && exit /B 1
      TASKLIST /FI "imagename eq powerpnt.exe" | find /i "powerpnt.exe" && exit /B 1
      TASKLIST /FI "imagename eq outlook.exe" | find /i "outlook.exe" && exit /B 1
      TASKLIST /FI "imagename eq msaccess.exe" | find /i "msaccess.exe" && exit /B 1
    Exit /B 0
    Инструкция, как включить макросы вручную.
     

    Вложения:

    Последнее редактирование: 31 авг 2016
    Phoenix, orderman и Kиpилл нравится это.
  16. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Пример монтирования ISO-образа с помощью Daemon Tools Lite

    Алгоритм:
    • Определение, установлен ли Daemon Tools
    • Определение, буквы привода
    • Если ее нет, устанавливаем драйвер DT
    • Размонтируем предыдущий образ, монтируем новый.

    В коде использован скрипт получения информации о дисках DriveTypes.vbs от Rob van der Woude Источник

    Весь процесс можно заменить предусмотренными в руководстве DT командами ком.строки:

    Код (DOS):
    DTLite.exe -get_count dt
    DTLite.exe -get_letter dt, 1
    За исключением одной "проблемки". В последней версии DT Lite эти команды ничего не возвращают. Вот. Поэтому - только батником (ну или ручками :)).

    Код качаем из архива (внутри есть символы табуляции).

    Код (DOS):
    :: Daemon Tools AutoMount Script by Alex Dragokas
    @echo off
    SetLocal EnableExtensions

    echo Поиск виртуального привода Daemon Tools...

    Call :Get_DT_Drive

    echo Пример монтирования образа c:\Image.ISO

    Call :DT_mount "n:\_Servers\Windows 7\ru_windows_7_ultimate_with_sp1_x64_dvd_u_677391.iso"

    pause
    Exit /B



    :Get_DT_Drive
    set DTDir1=%programfiles(x86)%\DAEMON Tools Lite
    set DTDir2=%programfiles%\DAEMON Tools Lite

    if exist "%DTDir1%\DTLite.exe" (cd /d "%DTDir1%"& set DTExist=OK)
    if exist "%DTDir2%\DTLite.exe" (cd /d "%DTDir2%"& set DTExist=OK)
    if not defined DTExist (
    echo Daemon Tools не установлен
    echo Нажмите любую клавишу, чтобы начать загрузку эмулятора...
    pause>nul
    explorer "http://www.disc-tools.com/download/daemon"
    exit
    )
    set DTDir=%cd%

    :: Определяю букву виртуального диска


    For /F "tokens=3,4 Delims= " %%A in ('cscript.exe //nologo "%~dp0DriveTypes.vbs" /T') do (
    if "%%A"=="SCSI" (Set VDisk=%%B& set VType=SCSI& goto Ext_DT_Disks)
    if "%%A"=="-" (Set VDisk=%%B& set VType=DT& goto Ext_DT_Disks)
    )
    :Ext_DT_Disks

    if not defined VDisk (
    echo Daemon Tools привод не найден.
    echo Пытаюсь установить новый диск...
    DTLite -add
    call :Get_DT_Drive
    ) else (
    echo %Vdisk% %VType% - OK.
    )
    Exit /B

    :DT_mount
    "%DTDir%\DTLite.exe" -unmount %VType%, 0
    "%DTDir%\DTLite.exe" -mount %VType%, 0, "%~1"
    echo %~nx1 смонтирован на диск %VDisk%
    exit /B
     

    Вложения:

    • Mount ISO.zip
      Размер файла:
      3,5 КБ
      Просмотров:
      11
    Phoenix, machito и Kиpилл нравится это.
  17. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Монтирование ISO в Windows 8, используя PowerShell и CMD.

    Совместимость: только Windows 8 +
    Источник: stackoverflow.com, а также TechNet - один, два.
    • указываем в коде путь к образу;
    • запускаем и получаем букву диска, на который был смонтирован образ;
    • нажимаем любую клавишу: образ будет размонтирован.
    Код (DOS):
    :: укажем путь к образу
    set WindowsISO=c:\Windows7.ISO

    ECHO Начинаю процесс монтирования образа ISO: %WindowsISO%  ...
    powershell.exe "Mount-DiskImage ""%WindowsISO%"""
    :: Получаю имя диска по указанному пути к образу
    FOR /F "skip=3" %%I IN ('powershell.exe "Get-DiskImage """%WindowsISO%""" | Get-Volume | Select-Object {$_.DriveLetter}"') DO echo Disk %%I
    pause
    ECHO Размонтирование образа ISO
    powershell.exe "Dismount-DiskImage ""%WindowsISO%"""
     
    Phoenix, machito, orderman и ещё 1-му нравится это.
  18. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Как узнать, сколько места занимает MFT ?

    Запустим консоль с правами Администратора,
    и вызовем defrag (только анализ).

    Для системного диска команда выглядит так:
    Код (DOS):
    defrag %SystemDrive% /a /v
    Если нужно узнать MFT, например диска D:
    подставьте вместо %SystemDrive% нужный D:

    MFT_info2.png
     

    Вложения:

    • MFT size.zip
      Размер файла:
      271 байт
      Просмотров:
      11
    Последнее редактирование: 28 фев 2014
    machito, Phoenix, Sandor и 2 другим нравится это.
  19. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Получение HDD Smart

    Автор: Леонид_33

    Отчет в виде CSV.
    Мною добавлены функции повышение привилегий и скорректирован вывод отчета в папку рядом со скриптом.

    Код (vb.net):

    '==========================================================================
    '
    ' AUTHOR: Леонид_33
    ' NAME: HDD_Smart.vbs
    '
    ' Скрипт для получения SMARTа HDD
    ' Может брать SMART как с локальной так и удаленной машины с выводом результата в файл в формате CSV
    ' При запуске скрипта выдается окно ввода имени(IP) машины с учетными данными
    ' Если хотим получить SMART с локальной машины, то ничего не указываем, если с удаленной, указываем имя(IP) машины, и, если надо, учетные данные
    ' Работает на WindowsXP(SP2,SP3), Windows2003SP2, Windows2008SP1
    ' Берет SMART через WMI, поэтому, что винда отдает, то отдает т.е.
    ' работает только со стандартно подключенными на мать HDD IDE и SATA
    ' Как бы того не хотелось, НЕ РАБОТАЕТ с рэйдами.
    ' Ну не видит винда SMARTов с этих винтов и все тут.
    '
    ' Если что по атрибутам неясно, можно глянуть тут
    ' http://en.wikipedia.org/wiki/Self-Monitoring%2C_Analysis%2C_and_Reporting_Technology
    '
    '==========================================================================

    if not isAdminRights then call Elevate(""): WScript.Quit

    Dim strComputer
    Dim strLogin
    Dim strPassword
    On Error Resume Next
    'GetPassword()
       strComputer = "."
       strLogin = ""
       strPassword = ""


    If strLogin = "" or strComputer = "." then
       Set    objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
    else
       Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
       Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
          "root\CIMV2", _
          strLogin, _
          strPassword, _
          "MS_409")
    end If

        Set    SmartDataItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictData", "WQL", 48)

        InstanceName = Array()
        SmartData = Array()
        SmartLength = Array()
        RowCount = 0
        For Each objItem In SmartDataItems
              Redim Preserve InstanceName(RowCount)
              InstanceName(RowCount) = objItem.InstanceName
              Redim Preserve SmartData(RowCount)
              SmartData(RowCount) = objItem.VendorSpecific
              Redim Preserve SmartLength(RowCount)
              SmartLength(RowCount) = objItem.Length
              RowCount = RowCount + 1
        Next
        Set    SmartDataItems = Nothing

        ThresholdData = Array()
        Redim Preserve ThresholdData(RowCount)
        PredictFailure = Array()
        Redim Preserve PredictFailure(RowCount)
        Reason = Array()
        Redim Preserve Reason(RowCount)

        RowCount = 0
        Set    ThresholdItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictThresholds", "WQL", 48)
        For Each objItem In ThresholdItems
              ThresholdData(RowCount) = objItem.VendorSpecific
              RowCount = RowCount + 1
        Next
        Set    ThresholdItems = Nothing

        RowCount = 0
        Set    PredictStatusItems = objWMIService.ExecQuery("SELECT * FROM MSStorageDriver_FailurePredictStatus", "WQL", 48)
        For Each objItem In PredictStatusItems
              PredictFailure(RowCount) = objItem.PredictFailure
              Reason(RowCount) = objItem.Reason
              RowCount = RowCount + 1
        Next
        Set    PredictStatusItems = Nothing

        Set oDict = CreateObject("Scripting.Dictionary")
        CreateDict(oDict)

        Set objFSO = CreateObject("Scripting.FileSystemObject")
     
        If strComputer = "." then
           'Set objTextFile = objFSO.OpenTextFile(objFSO.GetSpecialFolder(2) & "\drp\" & "HDD_Smart.csv", 2, True)
           Set objTextFile = objFSO.OpenTextFile(objFSO.GetParentFolderName(WScript.ScriptFullName) & "\HDD_Smart.csv", 2, True)
        else
           'Set objTextFile = objFSO.OpenTextFile(objFSO.GetSpecialFolder(2) & "\drp\" & "HDD_Smart_" & strComputer & ".csv", 2, True)
           Set objTextFile = objFSO.OpenTextFile(objFSO.GetParentFolderName(WScript.ScriptFullName) & "\HDD_Smart_" & strComputer & ".csv", 2, True)
        end If

        For CurrentDisk = 0 to RowCount - 1
             objTextFile.WriteLine("Drive: " & Replace(Mid(InstanceName(CurrentDisk), 9, InStr(InstanceName(CurrentDisk), "__") - 9), "_", " "))
             objTextFile.WriteLine("PredictFailure: " & PredictFailure(CurrentDisk))
             objTextFile.WriteLine("Reason: " & Reason(CurrentDisk))
             objTextFile.WriteLine("ID;Attribute;Type;Flag;Threshold;Value;Worst;Raw;Status;")
             aSmartData = SmartData(CurrentDisk)
             aThresholdData = ThresholdData(CurrentDisk)

             If IsArray(aSmartData) AND IsArray(aThresholdData) Then
                 LastID = 0
                 For x = 2 To SmartLength(CurrentDisk) + 2 Step 12
                      If LastID > aSmartData(x)  then
                         x = 514
                      else
                         LastID = aSmartData(x)                  

                      If aSmartData(x) <> 0 Then
                          objTextFile.Write(aSmartData(x) & ";")
                          If oDict.Item(aSmartData(x)) = "" Then
                                objTextFile.Write("VendorSpecific(" & aSmartData(x) & ");")
                          else
                                objTextFile.Write(oDict.Item(aSmartData(x)) & ";")
                          end If

                          If aSmartData(x + 1) MOD 2 Then
                                objTextFile.Write("Pre-Failure;")
                          Else
                                objTextFile.Write("Advisory;")
                          End If

    '                      objTextFile.Write(aSmartData(x + 1) & ";")
                          aFlag = aSmartData(x + 1)
                          txtFlag = ""
                          If (aFlag And &H1) <> 0 Then txtFlag = "LC," End If
                          If (aFlag And &H2) <> 0 Then txtFlag = txtFlag & "OC," End If
                          If (aFlag And &H4) <> 0 Then txtFlag = txtFlag & "PR," End If
                          If (aFlag And &H8) <> 0 Then txtFlag = txtFlag &  "ER," End If
                          If (aFlag And &H10) <> 0 Then txtFlag = txtFlag &  "EC," End If
                          If (aFlag And &H20) <> 0 Then txtFlag = txtFlag &  "SP," End If
                          If txtFlag <> "" then
                             txtFlag = Left(txtFlag, Len(txtFlag)-1 )
                          end If
                          objTextFile.Write txtFlag & ";"

                          objTextFile.Write(aThresholdData(x + 1) & ";") 'Threshold
                          objTextFile.Write(aSmartData(x + 3) & ";")      'Value
                          objTextFile.Write(aSmartData(x + 4) & ";")      'Worst
                          objTextFile.Write((aSmartData(x + 8) * 65536 + aSmartData(x + 7) * 4096 + aSmartData(x + 6) * 256 + aSmartData(x + 5)) & ";")      'Raw
                          If aSmartData(x + 3) >= aThresholdData(x + 1) Then
                               objTextFile.WriteLine("OK;")
                          else
                               objTextFile.WriteLine("NOT OK;")
                          end If
                      end If
                      end If
                 Next
             else
                 objTextFile.WriteLine("NO DRIVE WITH SMART FOUND;")
             end If
             'objTextFile.WriteLine
        Next

        objTextFile.WriteLine
        objTextFile.WriteLine("LC - life critical;")
        objTextFile.WriteLine("OC - online collection;")
        objTextFile.WriteLine("PR - performance related;")
        objTextFile.WriteLine("ER - error rate;")
        objTextFile.WriteLine("EC - event count;")
        objTextFile.WriteLine("SP - self preserving;")
        objTextFile.Close

        Wscript.echo "HDD_SMART Is Done!"

    Function CreateDict(oDict)
        oDict.Add 1, "Raw Read Error Rate"
        oDict.Add 2, "Throughput Performance"
        oDict.Add 3, "Spin-Up Time"
        oDict.Add 4, "Start/Stop Count"
        oDict.Add 5, "Reallocated Sectors Count"
        oDict.Add 6, "Read Channel Margin"
        oDict.Add 7, "Seek Error Rate Rate"
        oDict.Add 8, "Seek Time Performance"
        oDict.Add 9, "Power-On Hours (POH)"
        oDict.Add 10, "Spin Retry Count"
        oDict.Add 11, "Recalibration Retries Count"
        oDict.Add 12, "Device Power Cycle Count"
        oDict.Add 13, "Soft Read Error Rate"
        oDict.Add 190, "HDA Temperature"
        oDict.Add 191, "G-Sense Error Rate Frequency"
        oDict.Add 192, "Power-Off Park Count"
        oDict.Add 193, "Load/Unload Cycle Count"
        oDict.Add 194, "HDA Temperature"
        oDict.Add 195, "Hardware ECC Corrected Count"
        oDict.Add 196, "Reallocated Event Count"
        oDict.Add 197, "Current Pending Sector Count"
        oDict.Add 198, "Off-Line Scan Uncorrectable Sector Count"
        oDict.Add 199, "UltraDMA CRC Error Count"
        oDict.Add 200, "Write Error Rate"
        oDict.Add 201, "Soft Read Error Rate"
        oDict.Add 202, "Address Mark Errors Frequency"
        oDict.Add 203, "ECC errors (Maxtor: ECC Errors)"
        oDict.Add 204, "Soft ECC Correction"
        oDict.Add 205, "Thermal Asperity Rate (TAR)"
        oDict.Add 206, "Flying Height"
        oDict.Add 207, "Spin High Current"
        oDict.Add 208, "Spin Buzz"
        oDict.Add 209, "Offline Seek Perfomance"
        oDict.Add 210, "Vibration During Write"
        oDict.Add 211, "Vibration During Read"
        oDict.Add 212, "Shock During Write"
        oDict.Add 220, "Disk Shift"
        oDict.Add 221, "G-Sense Error Rate"
        oDict.Add 222, "Loaded Hours"
        oDict.Add 223, "Load/Unload Retry Count"
        oDict.Add 224, "Load Friction"
        oDict.Add 225, "/Unload Cycle Count"
        oDict.Add 226, "Load 'In'-time"
        oDict.Add 227, "Torque Amplification Count"
        oDict.Add 228, "Power-Off Retract Cycle"
        oDict.Add 230, "GMR Head Amplitude"
        oDict.Add 240, "Head Flying Hours"
        oDict.Add 250, "Read Error Retry Rate"
    End Function

    Function GetPassword()
        Dim IE
        On Error Resume Next
       Set IE = CreateObject( "InternetExplorer.Application" )
       With IE
          .AddressBar = False
          .menubar = False
          .Navigate "about:blank"
          .Document.Title = "Password"
          .ToolBar        = False
          .Resizable      = False
          .StatusBar      = False
          .Width          = 340
          .Height         = 230
       End With
       With IE.Document.ParentWindow.Screen
          IE.Left = (.AvailWidth  - IE.Width ) \ 2
          IE.Top  = (.Availheight - IE.Height) \ 2
       End With
       Do While IE.Busy
          WScript.Sleep 200
       Loop

       IE.Document.Body.InnerHTML =    "<BODY SCROLL=""NO"" BGCOLOR=""#" & BCol & """ TEXT=""#" & TCol & """>" & _
                   "<FONT FACE=""arial"" SIZE=2>" & _
                   "Введите имя компьютера<BR><INPUT SIZE=""40"" " & "ID=""Computer""><BR>"  &_
                   "Пользователь<BR><INPUT SIZE=""40"" " & "ID=""Login""><BR>" &_
                   "Пароль<BR><INPUT TYPE=""password"" SIZE=""40"" " & "ID=""Login"">" &_
                   "<P><INPUT TYPE=""hidden"" ID=""OK"" " & "NAME=""OK"" VALUE=""0"">"& _
                   "<INPUT TYPE=""submit"" VALUE="" OK "" " & "OnClick=""vbscript:OK.Value=1""></P>"
       strComputer = "."
       strLogin = ""
       strPassword = ""

       IE.visible = True
       Do While IE.Document.All.OK.Value = 0
          WScript.Sleep 200
       Loop

       If IE.Document.All.Computer.Value = "" then
          strComputer = "."
       else
          strComputer = IE.Document.All.Computer.Value
          If IE.Document.All.Login.Value <> "" then
             strLogin = IE.Document.All.Login.Value
             strPassword = IE.Document.All.Password.Value
          else
             strLogin = ""
             strPassword = ""
          end If
       end If
       IE.Quit
       Set IE = Nothing
    End Function

    Sub Elevate(msg)
         Const DQ = """"
         if msgbox(msg & vblf & "Запустить с Административными привилегиями ?", vbQuestion + vbYesNo,"Подтверждение") = vbNo then WScript.Quit 5
         Dim oShellApp: Set oShellApp = CreateObject("Shell.Application")
         ' Конкатенация аргументов
         Dim args, i: For i = 1 to WScript.Arguments.Count
             args = args & DQ & WScript.Arguments(i - 1) & DQ & " "
         Next
         if len(args) = 0 then args = DQ & syscure & DQ & " " & DQ & syscheck & DQ
         oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ & " " & args, "", "runas", 1
         set oShellApp = Nothing
    End Sub

    Function isAdminRights()
         Const KQV = &H1, KSV = &H2, HKCU = &H80000001, HKLM = &H80000002
         Set oReg = GetObject("winmgmts:root\default:StdRegProv")
         strKey = "System\CurrentControlSet\Control\Session Manager"
         intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
         isAdminRights = flagAccess
         Set oReg = Nothing
    End Function
     

    Вложения:

    • GetSmart.zip
      Размер файла:
      3,9 КБ
      Просмотров:
      31
    E100, tzrb, machito и 3 другим нравится это.
  20. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Блокировка настроек Internet Explorer

    Код (DOS):
    @Echo Off
    :: Этот командный файл ограничивает политиками управление домашней страницей, поиском и надстройками в IE
    :: Автор: Вадим Стеркин. Подробнее http://www.outsidethebox.ms/12904/
    :: Политика "Отключить изменение параметров домашней страницы"
    :: Задает домашнюю страницу и фиксирует ее политикой
    REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main" /v "Start Page" /d "http://www.outsidethebox.ms/" /f
    REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel" /v HomePage /t REG_DWORD /d 1 /f
    :: Политика "Разрешить сторонние расширения браузера"
    :: Запрещает запуск BHO, блокируя панели браузера
    REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main" /v "Enable Browser Extensions" /t REG_SZ /d no /f
    :: Политика "Не разрешать пользователям включать и отключать надстройки"
    :: Полностью отключает управление надстройками
    :: REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Restrictions" /v NoExtensionManagement /t REG_DWORD /d 1 /f
    :: Политика "Ограничить поставщиков служб поиска заданным списком поставщиков"
    :: Включает ограничение списка поисков
    REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Infodelivery\Restrictions" /v UsePolicySearchProvidersOnly /t REG_DWORD /d 1 /f
    :: Переносит текущий список поисков в политики
    REG EXPORT "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\SearchScopes" "%temp%\scopes.reg"
    CALL :SearchScope
    REG IMPORT "%temp%\scopes.reg"
    DEL "%temp%\scopes.reg"
    EXIT
    :SearchScope
    :: http://forum.oszone.net/thread-191684.html
    Set Source=%temp%
    SetLocal EnableDelayedExpansion
    For %%A In ("%Source%\scopes.reg") Do (
        For /F "Tokens=1* Delims=:" %%B In ('Type "%%A"^|Findstr /IN "$"') Do (
            Set Str=%%C
            If "!Str!"=="" (
                Echo.>>"%%A_tmp"
            ) Else (
                Set Str=!Str:Software\=Software\Policies\!
                Echo !Str!>>"%%A_tmp"
            )
        )
        Move /Y "%%A_tmp" "%%~fA"
    )
    EndLocal
     
    E100, tzrb, Phoenix и 3 другим нравится это.

Поделиться этой страницей