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.

Important
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

  Copy Code
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