Export (0) Print
Expand All

Example Script for Configuring Write Filters Using Configuration Manager 2007 on Windows Embedded Devices

Updated: March 1, 2010

Applies To: System Center Configuration Manager 2007, System Center Configuration Manager 2007 R2, System Center Configuration Manager 2007 R3, System Center Configuration Manager 2007 SP1, System Center Configuration Manager 2007 SP2

Use the following script in Configuration Manager 2007 as part of a task sequence to automate configuration of Windows Embedded write filters when you use Configuration Manager 2007 to install packages and software updates on client computers. For details about how to use this script, see How to Manage Windows Embedded Write Filters Using Configuration Manager 2007.

ImportantImportant
This script has been tested for use on computers running Windows XP Embedded. Before attempting to run this script on other operating systems, you should test it thoroughly.

Example Script

Option Explicit
On Error Resume Next
'#--------------------------------------------------------------------------------------------
'# 
'#  This VBScript is used to allow software installation and update to a Windows Embedded
'#  client that is using EWF or FBWF protection on the drive.
'#
'#  Full documentation on the use of this VBScript is included in a separate document.
'#
'#--------------------------------------------------------------------------------------------

Dim gWshShell                                        'WScript.Shell object
Dim strProtectedDrive : strProtectedDrive = null     'The drive shown. by EWF or FBWF as being protected
Dim gSystemDrive                                     'Contains the System Drive (e.g. C:).
Dim strDisableCommand : strDisableCommand = null     'Either the EWF or FBWF command to disable the write filter.
Dim strEnableCommand  : strEnableCommand = null      'Either the EWF or FBWF command to enable the write filter.
Dim bIsWFEnabled : bIsWFEnabled = false              'Boolean for write filter enabled/disabled. 
Dim bIsEWFInstalled  : bIsEWFInstalled = false       'Boolean for EWF installed.
Dim bIsFBWFInstalled : bIsFBWFInstalled = false      'Boolean for FBWF installed.
Dim strCommand : strCommand = null                   'The string holding the command-line argument.

Set gWshShell = WScript.CreateObject("WScript.Shell")       '# Create the Shell Object.

CheckWindowsEmbedded              '# Check to ensure this script is being run on Windows Embedded.

' Check whether any command-line argument is passed, and process.
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 "Invalid Command Line: Missing Action Parameter"
    WScript.Echo "USAGE:"
    WScript.Echo "EWF-FBWF.vbs [Disable|Enable]"
    WScript.Quit (0)
End If


WScript.Quit (0)


'--------------------------------------------------------------------------------------------
'   CheckWindowsEmbedded
'
'   Checks to ensure this script is being run on Windows Embedded and, if not, exits.
'     If there was no error in finding the key, read the string values from the key.
'     If the "EmbeddedNT" string is found, this is XPe.
'     In all other cases, bIsXPe is left as false, which causes an exit.
'--------------------------------------------------------------------------------------------
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
'
'  Determines which write filter (EWF or FBWF) is currently in use on this system and sets
'  a variable for use in other sections of this script. Because both EWF and FBWF can be on
'  a system (but not both controlling the protection of that system), simply testing for
'  the existence of the executable is not sufficient. Without using a separate C++ program
'  that accesses the EWF or FBWF API, the only way to test for which one is protecting the
'  drive is to use the output of the program at the command line to see whether it is active
'  and which drive is being protected.
'
'--------------------------------------------------------------------------------------------
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
        '============================================
        'Check to see whether EWFMGR.EXE is on the system.
        strFile = strPath + "\system32\EWFMGR.EXE"
        If oFSO.FileExists(strFile) Then
            'Run the EWF Manager to see whether the drive is actually protected.
            set wsx = gWshShell.Exec("%comspec% /c " & strFile & " -all")
            Do
                Status = wsx.Status
              
                ' Parsing the output of the command to see whether the EWF is enabled 
                ' and which drive is being protected (if any). Typical output 
                ' of this command looks like this:
                '
                '   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
                        ' If the output from the command generated text like the above, 
                        ' EWF must be installed. Now check whether it's enabled or disabled.
                        bIsEWFInstalled = True                    
                        if InStr(strLine, "DISABLED") then
                            bIsWFEnabled = false
                        elseif InStr(strLine, "ENABLED") then
                            bIsWfEnabled = true
                        end if
                    End If
                    
                    ' Check which drive is being protected, and get the drive letter
                    ' because the drive letter is required in the command line.
                    if (bIsEWFInstalled) AND (InStr(strLine, "Device Name")) Then
                        strProtectedDrive = left(right(strLine, 3), 2)
                        'Set the default commands to be used elsewhere in this script.
                        strEnableCommand = strFile & " " & strProtectedDrive & " -enable"
                        strDisableCommand = strFile & " " & strProtectedDrive & " -disable"
                    End If    
                Next

                If Status <> 0 Then Exit Do
                WScript.Sleep 10

            Loop
        End if
        
        '============================================
        '                    FBWF
        '============================================
        'If EWF is enabled, FBWF cannot be enabled, so if EWF enabled, skip FBWF.
        If (Not bIsWFEnabled) Then
            Dim bCurrentState : bCurrentState = false
            Dim intLoopNum : intLoopNum = 0

            'Check to see whether FBWFMGR.EXE is on the system.
            strFile = strPath + "\system32\FBWFMGR.EXE"
            If oFSO.FileExists(strFile) Then
                'Run the FBWF Manager to see whether the drive is actually protected.
                set wsx = gWshShell.Exec("%comspec% /c " & strFile & " /displayconfig")
                Do
                    Status = wsx.Status
                    
                    ' Parsing the output of the command to see whether the EWF is enabled 
                    ' and which drive is being protected (if any). Typical output 
                    ' of this command looks like this:
                    '
                    '   File-based write filter configuration for the current session:
                    '     filter state: disabled.
                    '
                    '   File-based write filter configuration for the next session:
                    '     filter state: enabled.
                    '     overlay cache data compression state: disabled.
                    '     overlay cache threshold: 64 MB.
                    '     overlay cache pre-allocation: enabled.
                    '     protected volume list:
                    '       \Device\HarddiskVolume1
                    '     write-through list of each protected volume:
                    '       \Device\HarddiskVolume1: (none)
                    '
                    output = split(wsx.Stdout.ReadAll(), vbNewLine)
                    For Each strLine in output
                        if InStr(strLine, "current session:") then
                            ' If the output from the command generated text like the above, 
                            ' EWF must be installed. Now check whether it's enabled or disabled.
                            bIsFBWFInstalled = True
                            
                           ' Gathering data from the current session (not the next session).
                           bCurrentState = true
                        elseif InStr(strLine, "next session:") then
                            bCurrentState = false
                            bNextState = true
                        end if
                    
                        ' If the Current State / filter state = enabled, FBWF is enabled.
                        if (bCurrentState) AND (InStr(strLine, "filter state:")) then
                            if (InStr(strLine, "enabled")) then
                                bIsWFEnabled = true
                            else
                                bIsWFEnabled = false
                            end if
                            Exit For
                        end if
                    Next
                    If Status <> 0 Then Exit Do
                    WScript.Sleep 10
                Loop
                'Set the default commands to be used elsewhere in this script.
                if bIsFBWFInstalled then
                    strEnableCommand = strFile & " /enable"
                    strDisableCommand = strFile & " /disable"
                End if
            End if          
        End if
    End If
End Sub


'--------------------------------------------------------------------------------------------
'   DisableWF
'
'   This sub is used to disable the write filter on the drive (EWF or FBWF) so that updates
'   can be written to the storage device.
'
'   If the drive is already disabled, this subroutine does nothing but just return. Otherwise,
'   the function will disable the EWF and reboot the machine.
'
'--------------------------------------------------------------------------------------------
Sub DisableWF
        Dim oExec
    
        'If the write filter is enabled, disable it.
        if bIsWFEnabled then
            Set oExec = gWshShell.Exec(strDisableCommand)
            'Wait for the previous command to complete.
            Do While oExec.Status = 0
                WScript.Sleep 100
            Loop
        
            'Reboot the machine to complete the operation.
            RebootEx 0
    End If
End Sub



'--------------------------------------------------------------------------------------------
'   EnableWF
'
'   This sub is used to enable the write filter on the drive (EWF or FBWF).
'
'   The function will enable the EWF and reboot the machine in two minutes so that task sequence 
'   will have time to clean up itself.
'
'--------------------------------------------------------------------------------------------
Sub EnableWF
        Dim oExec
    
        ' If the write filter is installed, enable it.
        if (bIsEWFInstalled OR bIsFBWFInstalled) then
            Set oExec = gWshShell.Exec(strEnableCommand)
            ' Wait for the previous command to complete.
            Do While oExec.Status = 0
            
                WScript.Sleep 100
            Loop
        
            'Reboot the machine to complete the operation.
            RebootEx 120
    End If
End Sub


'--------------------------------------------------------------------------------------------
'    RebootEx
' 
'   This sub reboots the system.
'--------------------------------------------------------------------------------------------
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

See Also

For additional information, see Configuration Manager 2007 Information and Support.
To contact the documentation team, email SMSdocs@microsoft.com.
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

ADD
Show:
© 2014 Microsoft