Files

416 lines
12 KiB
XML

<job id="UDIWizard">
<script language="VBScript" src="ZTIUtility.vbs"/>
<script language="VBScript">
' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: UDIWizard.wsf
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Display a wizard during a ConfigMgr task sequence
' //
' // Usage: cscript UDIWizard.wsf /definition:UDIWizard_Config.xml [/debug:true]
' //
' // ***************************************************************************
Option Explicit
RunNewInstance
'//----------------------------------------------------------------------------
'// Main Class
'//----------------------------------------------------------------------------
Class UDIWizard
'//----------------------------------------------------------------------------
'// Global constant and variable declarations
'//----------------------------------------------------------------------------
Dim iRetVal
'//----------------------------------------------------------------------------
'// Main routine
'//----------------------------------------------------------------------------
Function Main
' Local Variables
Dim sConfigFileName
Dim sConfigFilePath
Dim oConfigXML
Dim sCmd
Dim sWorkingDir
Dim arrAdmins
Dim sAdmin
Dim oAdministrators
Dim oPreflight
Dim oFilename
Dim oParameters
Dim sFilename
Dim sParameters
Dim bRemove
Dim oTSProgressUI
Dim sAppFile
Dim oProcesses, oProcess
Dim sProcessName
Dim sWizardStage
iRetVal = Success
' Find and copy the specified XML config file
If oUtility.Arguments.Exists("Definition") then
sConfigFileName = oUtility.Arguments("Definition")
Else
sConfigFileName = "UDIWizard_Config.xml"
End if
If Left(UCase(sConfigFileName), 4) = "HTTP" then
' Download the specified configuration file
sConfigFilePath = oLogging.LogPath & "\UDIWizard_Config.xml"
iRetVal = oUtility.InternetFileDownload(sConfigFileName, sConfigFilePath)
TestAndFail iRetVal, 10401, "Download configuration file " & sConfigFileName
' Download the corresponding .app file
sAppFile = sConfigFilePath & ".app"
iRetVal = oUtility.InternetFileDownload(sConfigFileName & ".app", sAppFile)
Else
' Make sure we have a connection
If Left(sConfigFileName, 2) = "\\" then
oUtility.ValidateConnection sConfigFileName
End if
' Find the config file
iRetVal = oUtility.FindFile(sConfigFileName, sConfigFilePath)
TestAndFail iRetVal, 10402, "Find configuration file " & sConfigFileName
' Find the corresponding .app file
iRetVal = oUtility.FindFile(sConfigFileName & ".app", sAppFile)
End if
' Load the XML file
Set oConfigXML = oUtility.CreateXMLDOMObjectEx(sConfigFilePath)
' Figure out what process to use
sProcessName = "explorer.exe"
Set oProcesses = objWMI.ExecQuery("select * from Win32_Process where Name='tsprogressui.exe'")
For each oProcess in oProcesses
sProcessName = "tsprogressui.exe"
Next
oLogging.CreateEntry "Using " & sProcessName & " for displaying wizard UI", LogTypeInfo
' Set the working directory
'If oEnvironment.Item("OSVersion") = "WinPE" then
If UCase(oEnv("PROCESSOR_ARCHITECTURE")) = "AMD64" then
sWorkingDir = oEnvironment.Substitute("%DEPLOYROOT%\Tools\x64")
Else
sWorkingDir = oEnvironment.Substitute("%DEPLOYROOT%\Tools\x86")
End if
oLogging.CreateEntry "Working directory: " & sWorkingDir, LogTypeInfo
oShell.CurrentDirectory = sWorkingDir
' Hide the progress UI
On Error Resume Next
Set oTSProgressUI = CreateObject("Microsoft.SMS.TSProgressUI")
oTSProgressUI.CloseProgressDialog
Set oTSProgressUI = Nothing
On Error Goto 0
' Execute the appropriate wizard
If oConfigXML.DocumentElement.SelectNodes("//DLLs").Length > 0 then
' ===========================
' Setup Wizard Pre-Processing
' ===========================
' Strip the incompatible pre-req checks
For each oPreflight in oConfigXML.DocumentElement.SelectNodes("//Pages/Page[@Name=""ConfigScanPage""]/Tasks/Task")
' Get the values from the appropriate child nodes
Set oFilename = oPreflight.SelectSingleNode("Setter[@Property=""filename""]")
If not oFilename is Nothing then
sFilename = LCase(oFilename.Text)
Else
sFilename = ""
End if
Set oParameters = oPreflight.SelectSingleNode("Setter[@Property=""parameters""]")
If not oParameters is Nothing then
sParameters = LCase(oParameters.Text)
Else
sParameters = ""
End if
' Check if this pre-req check should be removed
bRemove = False
If oEnvironment.Item("OSVersion") = "WinPE" or Left(oEnvironment.Item("OSCurrentVersion"),1) = "5" then
' Remove items not applicable to Windows PE or XP
If Instr(sParameters, "osdbootcount") > 0 or Instr(sParameters, "osdbitlockerstate") > 0 then
bRemove = true
End if
End if
If oEnvironment.Item("OSVersion") = "WinPE" then
' Remove items not applicable to Windows PE
If Instr(sParameters, "osddiskcheck") > 0 or Instr(sParameters, "osd_getprinters") > 0 then
bRemove = true
End if
If Instr(sFilename, "acpower") > 0 then
bRemove = true
End if
End if
If Left(oEnvironment.Item("OSCurrentVersion"),1) = "5" then
' Remove items not applicable to XP
' No XP-specific removals at this point
End if
' Remove if required
If bRemove then
oLogging.CreateEntry "Removed preflight " & oPreflight.Attributes.getNamedItem("DisplayName").Value & " because it was not applicable.", LogTypeInfo
oPreflight.parentNode.removeChild oPreflight
End if
Next
' Save the updated XML file
oLogging.CreateEntry "Saving edited configuration file as " & oLogging.LogPath & "\OSDSetupWizard.xml", LogTypeInfo
oConfigXML.Save oLogging.LogPath & "\OSDSetupWizard.xml"
' Copy the app file to the same location
If oFSO.FileExists(sAppFile) then
oLogging.CreateEntry "Copying app file " & sAppFile & " to " & oLogging.LogPath & "\OSDSetupWizard.xml.app", LogTypeInfo
oFSO.CopyFile sAppFile, oLogging.LogPath & "\OSDSetupWizard.xml.app", true
Else
oLogging.CreateEntry "Warning: No corresponding app file found for the specified configuration file, wizard may not work properly.", LogTypeWarning
End if
' Build command for stage
If oEnvironment.Item("Stage") <> "" then
sWizardStage = oEnvironment.Item("Stage")
Else
sWizardStage = ucase(oEnvironment.Item("DeploymentType"))
If sWizardStage = "REPLACE" and oEnvironment.Item("OSVersion") = "WinPE" then
sWizardStage = sWizardStage & ".WinPE"
End if
If sWizardStage = "NEWCOMPUTER" and ucase(oEnvironment.Item("_SMSTSMediaType")) = "OEMMEDIA" then
sWizardStage = sWizardStage & ".Prestaged"
End if
End if
oLogging.CreateEntry "Selected wizard stage option: " & sWizardStage, LogTypeInfo
' Build the command line
sCmd = "ServiceUI.exe -process:" & sProcessName & " OSDSetupWizard.exe /xml:""" & oLogging.LogPath & "\OSDSetupWizard.xml"" /stage:" & sWizardStage
' Is a locale specified? If so, append it to the command line
If oEnvironment.Item("UDILocale") <> "" then
sCmd = sCmd & " /locale:" & oEnvironment.Item("UDILocale")
End if
' =====================
' Wizard Execution
' =====================
oLogging.CreateEntry "About to run command: " & sCmd, LogTypeInfo
On Error Resume Next
iRetVal = oShell.Run(sCmd, 0, true)
If Err then
iRetVal = Err.Number
oLogging.CreateEntry "ERROR executing command " & sCmd & ": " & Err.Description & " (" & Err.Number & ")", LogTypeError
ElseIf iRetVal = 0 then
oLogging.CreateEntry "Successfully executed command " & sCmd & ", rc = " & CStr(iRetVal), LogTypeInfo
Else
TestAndLog iRetVal, "Non-zero return code executing command " & sCmd & ", rc = " & iRetVal
End if
On Error Goto 0
' ======================
' Wizard Post-Processing
' ======================
oLogging.CreateEntry "OSDTargetDrive = [" & oEnvironment.Item("OSDTargetDrive") & "]", LogTypeInfo
oLogging.CreateEntry "OSDDiskpart = [" & oEnvironment.Item("OSDDiskpart") & "]", LogTypeInfo
If ucase(oEnvironment.Item("OSDDiskpart")) = "TRUE" then
' Any volume selected from the OSD wizard bay be overridden by the new disk partitioning structure.
oLogging.CreateEntry "OSDDiskpart is enabled, disregard Volume selection from UDI Wizard.", LogTypeInfo
oEnvironment.Item("OSDTargetDrive") = ""
oEnvironment.Item("OSDTargetSystemDrive") = ""
Else
oLogging.CreateEntry "OSDDiskpart is disabled, we can use OSDTargetDrive as the requested volume.", LogTypeInfo
oEnvironment.Item("OSDisk") = oEnvironment.Item("OSDTargetDrive")
' There may be a reboot during normal Task Sequence operation. Save the volume for use later.
oUtility.SetTagForDrive oEnvironment.Item("OSDTargetDrive"), "TargetPartitionIdentifier"
End if
' Split apart the administrator members and put them in a list
If oEnvironment.Item("OSDAddAdmin") <> "" then
arrAdmins = Split(Trim(oEnvironment.Item("OSDAddAdmin")), ";")
Set oAdministrators = oEnvironment.ListItem("Administrators")
For each sAdmin in arrAdmins
If not oAdministrators.Exists(sAdmin) then
oAdministrators.Add sAdmin, ""
End if
Next
oEnvironment.ListItem("Administrators") = oAdministrators
End if
' Any user state selected? If so, set the needed variable values
If UCase(oEnvironment.Item("OSDRestoreData")) = "TRUE" and UCase(oEnvironment.Item("OSDHardLinks")) <> "TRUE" then
If UCase(oEnvironment.Item("OSDUserStateMode")) = "NETWORK" then ' Restore from network
oEnvironment.Item("OSDStateStorePath") = oEnvironment.Item("SMSConnectNetworkFolderPath") & "\" & oEnvironment.Item("OSDDataSourceDirectory")
ElseIf UCase(oEnvironment.Item("OSDUserStateMode")) = "USB" then ' Restore from USB
oEnvironment.Item("OSDStateStorePath") = oEnvironment.Item("OSDDataSourceDrive") & "\" & oEnvironment.Item("OSDDataSourceDirectory")
End if
If oEnvironment.Item("ForceEncryption") = "YES" then
oEnvironment.Item("OSDMigrateAdditionalRestoreOptions") = "/decrypt /key:" & oEnvironment.Item("OSDUserStateKeyPassword")
End if
End if
' If using hardlinks to do a refresh from the full OS, make sure the state store path is set
' now so that we have a place to copy the initial log files (before booting into PE to capture state).
If oEnvironment.Item("OSVersion") <> "WinPE" and oEnvironment.Item("OSDStateStorePath") = "" then
oEnvironment.Item("OSDStateStorePath") = oUtility.StatePath
End if
' Set the UserLocale based on the InputLocale specified in the wizard
oEnvironment.Item("UserLocale") = oEnvironment.Item("InputLocale")
' Tell the task sequence to use offline migration
oEnvironment.Item("USMTOfflineMigration") = "TRUE"
' The wizard may not encoded all variables, ensure that they are encoded.
for each sCmd in array ( "BDEPIN" )
oEnvironment.Item(sCmd) = oEnvironment.GetOSDV4(sCmd)
next
ElseIf oConfigXml.DocumentElement.NodeName = "Wizard" then
' =====================
' HTA Wizard Processing
' =====================
' Run the wizard
sCmd = "ServiceUI.exe -process:" & sProcessName & " %WINDIR%\system32\MSHTA.exe " & oUtility.ScriptDir & "\Wizard.hta /definition:""" & sConfigFileName & """"
On Error Resume Next
iRetVal = oShell.Run(sCmd, 1, true)
If Err then
iRetVal = Err.Number
oLogging.CreateEntry "ERROR executing command " & sCmd & ": " & Err.Description & " (" & Err.Number & ")", LogTypeError
ElseIf iRetVal = 0 then
oLogging.CreateEntry "Successfully executed command " & sCmd & ", rc = " & CStr(iRetVal), LogTypeInfo
Else
TestAndLog iRetVal, "UDIWizard: Non-zero return code executing command " & sCmd & ", rc = " & iRetVal
End if
On Error Goto 0
' See if the wizard completed or was cancelled
If oEnvironment.Item("WizardComplete") <> "Y" then
oLogging.CreateEntry "The wizard was cancelled, setting OSDSetupWizCancelled = TRUE", LogTypeInfo
oEnvironment.Item("OSDSetupWizCancelled") = "TRUE"
iRetVal = -1
End if
Else
oLogging.ReportFailure "Invalid wizard configuration file specified. The deployment will not proceed.", 10403
End if
' Exit with whatever return value was returned by the wizard
Main = iRetVal
End Function
End Class
</script>
</job>