Используйте приведенный ниже сценарий в Configuration Manager 2007 как часть последовательности задач для автоматизации настройки фильтров записи в Windows Embedded, когда Configuration Manager 2007 используется для установки пакетов и обновлений программного обеспечения на клиентские компьютеры. Сведения об использовании этого сценария см. в разделе Управление фильтрами записи в Windows Embedded при помощи Configuration Manager 2007.
Важно! |
---|
Данный сценарий протестирован на компьютерах с Windows XP Embedded. Перед использованием этого сценария в других операционных системах его необходимо тщательно протестировать. |
Пример сценария
Скопировать код | |
---|---|
Option Explicit On Error Resume Next '#-------------------------------------------------------------------------------------------- '# '# Этот сценарий VBScript используется для разрешения установки ПО и обновления на клиенте Windows Embedded '#, использующем защиту диска EWF или FBWF. '# '# Полную документацию по использованию этого сценария VBScript см. в отдельном документе. '# '#-------------------------------------------------------------------------------------------- Dim gWshShell 'WScript.Shell object Dim strProtectedDrive : strProtectedDrive = null 'Отображается диск, защищенный EWF или FBWF, Dim gSystemDrive 'Содержит системный диск (например диск C:). Dim strDisableCommand : strDisableCommand = null 'Команда EWF или FBWF для отключения фильтра записи. Dim strEnableCommand : strEnableCommand = null 'Команда EWF или FBWF для включения фильтра записи. Dim bIsWFEnabled : bIsWFEnabled = false 'Включение/выключение логической переменной для фильтра записи. Dim bIsEWFInstalled : bIsEWFInstalled = false 'Логическая переменная для EWF установлена. Dim bIsFBWFInstalled : bIsFBWFInstalled = false 'Логическая переменная для FBWF установлена. Dim strCommand : strCommand = null 'Строка размещения аргументов командной строки. Set gWshShell = WScript.CreateObject("WScript.Shell") '# Создание объекта оболочки. CheckWindowsEmbedded '# Проверка того, что сценарий выполняется под управлением Windows Embedded. ' Проверка наличия переданного аргумента командной строки, обработка. If WScript.Arguments.Count = 1 Then strCommand = UCase(WScript.Arguments.Item(0)) Select Case strCommand Case "DISABLE" CheckWhichWF DisableWF Case "ENABLE" CheckWhichWF EnableWF Case Else WScript.Quit (0) End Select Else WScript.Echo "Недопустимая командная строка: отсутствует параметр действия" WScript.Echo "USAGE:" WScript.Echo "EWF-FBWF.vbs [Disable|Enable]" (0) WScript.Quit End If WScript.Quit (0) '-------------------------------------------------------------------------------------------- ' CheckWindowsEmbedded ' ' Проверка того, что сценарий запущен под управлением Windows Embedded; если нет, то выход. ' Если нет ошибок при поиске ключа, чтение значений строк из ключа. ' Если строка "EmbeddedNT" найдена, это XPe. ' В прочих случаях bIsXPe остается ложным, что приводит к выходу. '-------------------------------------------------------------------------------------------- Sub CheckWindowsEmbedded() Dim arrValues, bIsXPe bIsXPe = FALSE arrValues = gWshShell.RegRead(XPE_REG_KEY) If Err.Number = 0 then For Each strValue in arrValues if strValue = "EmbeddedNT" then bIsXPe = True end if Next End If Err.Clear if not bIsXPe then WScript.Quit (0) end if End Sub '-------------------------------------------------------------------------------------------- ' CheckWhichWF ' ' Определение того, какой фильтр записи (EWF или FBWF) используется в системе, и задание ' переменной для использования в других разделах этого сценария. Поскольку в системе ' могут использоваться оба фильтра (EWF и FBWF)' (однако защита системы не может контролироваться обоими фильтрами), простой проверки' наличия исполняемого файла недостаточно. Без использования отдельной программы C++,' обращающейся к интерфейсу API EWF или FBWF, единственным способом проверить, какой фильтр используется для защиты ' диска, является использование вывода программы в командной строке для проверки, какой фильтр ' активен и какой диск им защищен. ' '-------------------------------------------------------------------------------------------- Sub CheckWhichWF Dim oFSO, strFile, strPath, wsx Dim output, strLine Dim Status Set oFSO = CreateObject("Scripting.FileSystemObject") strPath = gWshShell.ExpandEnvironmentStrings("%SystemRoot%") If IsEmpty(strPath) Then WScript.Quit (1) Else '============================================ ' EWF '============================================ 'Проверка наличия EWFMGR.EXE в системе. strFile = strPath + "\system32\EWFMGR.EXE" If oFSO.FileExists(strFile) Then 'Запуск EWF Manager для проверки того, защищен ли диск. set wsx = gWshShell.Exec("%comspec% /c " & strFile & " -all") Do Status = wsx.Status ' Разбор вывода команды для проверки того, включен ли EWF ' и какой диск защищен (если есть защищенные диски). Обычно результат выполнения ' этой команды выглядит следующим образом: ' ' Protected Volume Configuration ' Type RAM ' State DISABLED ' Boot Command ENABLE ' Param1 0 ' Param2 0 ' Persistent Data "" ' Volume ID A7 FA CA 34 00 7E 00 00 00 00 00 00 00 00 00 00 ' Device Name "\Device\HarddiskVolume1" [C:] ' Max Levels 1 ' Clump Size 512 ' Current Level N/A ' output = split(wsx.Stdout.ReadAll(), vbNewLine) For Each strLine in output if InStr(strLine, "State") then ' Если выводом команды является текст, похожий на приведенный выше, это значит, что ' EWF установлен. Теперь проверим, включен он или выключен. bIsEWFInstalled = True if InStr(strLine, "DISABLED") then bIsWFEnabled = false elseif InStr(strLine, "ENABLED") then bIsWfEnabled = true end if End If ' Проверка того, какой диск защищен, и получение буквы диска, ' так как эта буква требуется для командной строки. if (bIsEWFInstalled) AND (InStr(strLine, "Device Name")) Then strProtectedDrive = left(right(strLine, 3), 2) 'Задание стандартных команд, используемых в других частях сценария. strEnableCommand = strFile & " " & strProtectedDrive & " -enable" strDisableCommand = strFile & " " & strProtectedDrive & " -disable" End If Next If Status <> 0 Then Exit Do WScript.Sleep 10 Loop End if '============================================ ' FBWF '============================================ 'Если включен EWF, FBWF не может быть также включен, поэтому если EWF включен, проверка FBWF пропускается. If (Not bIsWFEnabled) Then Dim bCurrentState : bCurrentState = false Dim intLoopNum : intLoopNum = 0 'Проверка наличия FBWFMGR.EXE в системе . strFile = strPath + "\system32\FBWFMGR.EXE" If oFSO.FileExists(strFile) Then 'Запуск FBWF Manager для проверки того, какой диск защищен. set wsx = gWshShell.Exec("%comspec% /c " & strFile & " /displayconfig") Do Status = wsx.Status ' Разбор вывода команды для проверки того, включен ли EWF ' и какой диск защищен (если есть защищенные диски). Обычно результат выполнения ' этой команды выглядит следующим образом: ' ' Файловая конфигурация фильтра записи для текущего сеанса: ' состояние фильтра: выключен. ' ' Файловая конфигурация фильтра записи для следующего сеанса: ' состояние фильтра: включен. ' состояние сжатия данных кэша оверлея: выключено. ' пороговое значение кэша оверлея: 64 МБ. ' предварительное выделение кэша оверлея: включено. ' список защищенных томов: ' \Device\HarddiskVolume1 ' список операций записи для каждого защищенного тома: ' \Device\HarddiskVolume1: (нет) ' output = split(wsx.Stdout.ReadAll(), vbNewLine) For Each strLine in output if InStr(strLine, "текущий сеанс:") then ' Если выводом команды является текст, аналогичный приведенному выше, ' EWF установлен. Проверка того, включен он или выключен. bIsFBWFInstalled = True ' Получение данных из текущего сеанса (не следующего сеанса). bCurrentState = true elseif InStr(strLine, "следующий сеанс:") then bCurrentState = false bNextState = true end if ' Если Current State / filter state = enabled, FBWF включен. if (bCurrentState) AND (InStr(strLine, "состояние фильтра:")) then if (InStr(strLine, "включено")) then bIsWFEnabled = true else bIsWFEnabled = false end if Exit For end if Next If Status <> 0 Then Exit Do WScript.Sleep 10 Loop 'Задание стандартных команд, используемых в других частях сценария. if bIsFBWFInstalled then strEnableCommand = strFile & " /enable" strDisableCommand = strFile & " /disable" End if End if End if End If End Sub '-------------------------------------------------------------------------------------------- ' DisableWF ' ' Эта процедура предназначена для отключения фильтра записи на диске (EWF или FBWF), чтобы можно было ' записать обновления на устройство хранения. ' ' Если защита диска уже отключена, эта процедура не выполняет никаких действий, только возврат. В противном случае ' она отключает EWF и перезагружает компьютер. ' '-------------------------------------------------------------------------------------------- Sub DisableWF Dim oExec 'Если фильтр записи включен, его нужно отключить. if bIsWFEnabled then Set oExec = gWshShell.Exec(strDisableCommand) 'Ожидание завершения выполнения предыдущей команды. Do While oExec.Status = 0 WScript.Sleep 100 Loop 'Перезагрузка компьютера для завершения операции. RebootEx 0 End If End Sub '-------------------------------------------------------------------------------------------- ' EnableWF ' ' Эта процедура предназначена для включения фильтра записи диска (EWF или FBWF). ' ' Процедура включает EWF и перезагружает компьютер через две минуты, чтобы ' последовательность задач могла завершиться. ' '-------------------------------------------------------------------------------------------- Sub EnableWF Dim oExec ' Если фильтр записи установлен, его нужно включить. if (bIsEWFInstalled OR bIsFBWFInstalled) then Set oExec = gWshShell.Exec(strEnableCommand) 'Ожидание завершения выполнения предыдущей команды. Do While oExec.Status = 0 WScript.Sleep 100 Loop 'Перезагрузка компьютера для завершения операции. RebootEx 120 End If End Sub '-------------------------------------------------------------------------------------------- ' RebootEx ' ' Эта процедура выполняет перезагрузку системы. '-------------------------------------------------------------------------------------------- Sub RebootEx(intSeconds) Dim strRebootCommandLine strRebootCommandLine = "shutdown.exe -r -t " & intSeconds Set oExec = gWshShell.Exec(strRebootCommandLine) Do While oExec.Status = 0 WScript.Sleep 100 Loop End Sub |