Files

289 lines
12 KiB
XML

<job id="ZTIValidate">
<script language="VBScript" src="ZTIUtility.vbs"/>
<script language="VBScript" src="ZTIDiskUtility.vbs"/>
<script language="VBScript">
' // ***************************************************************************
' //
' // Copyright (c) Microsoft Corporation. All rights reserved.
' //
' // Microsoft Deployment Toolkit Solution Accelerator
' //
' // File: ZTIValidate.wsf
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Ensure that it is safe for the deployment to continue
' //
' // Usage: cscript.exe [//nologo] ZTIValidate.wsf [/debug:true]
' //
' // ***************************************************************************
Option Explicit
RunNewInstance
'//----------------------------------------------------------------------------
'// Global Constants
'//----------------------------------------------------------------------------
'//----------------------------------------------------------------------------
'// Main Class
'//----------------------------------------------------------------------------
Class ZTIValidate
'//----------------------------------------------------------------------------
'// Class instance variable declarations
'//----------------------------------------------------------------------------
Dim iRetVal
Dim sDrive
'//----------------------------------------------------------------------------
'// Constructor to initialize needed global objects
'//----------------------------------------------------------------------------
Private Sub Class_Initialize
If Ucase(oEnvironment.Item("DeploymentType")) <> "NEWCOMPUTER" Then
sDrive = oUtility.GetOSTargetDriveLetter
End If
End Sub
'//----------------------------------------------------------------------------
'// Main routine
'//----------------------------------------------------------------------------
Function Main
Dim iRetVal
Dim iImageSize, iNeededSize, iTotalSize, dMultiplier
Dim oAssoc, oAssocs
Dim iProcessorSpeed, iMemory
Dim iImageBuildMajor, iImageBuildMinor, iOSCVMajor, iOSCVMinor
iRetVal = Success
'//----------------------------------------------------------------------------
'// Abort if this is a server OS
'//----------------------------------------------------------------------------
If oEnvironment.Item("DeploymentType") = "REFRESH" then
' This should only run in the full OS, skipped when DeploymentType=NEWCOMPUTER
If UCase(oEnvironment.Item("VerifyOS")) = "CLIENT" then
If UCase(oEnvironment.Item("IsServerOS")) = "TRUE" then
oLogging.CreateEvent 41044, LogTypeError, "ERROR - Attempting to deploy a client operating system to a machine running a server operating system.", Array()
oLogging.ReportFailure "ERROR - Attempting to deploy a client operating system to a machine running a server operating system.", 9801
End if
ElseIf UCase(oEnvironment.Item("VerifyOS")) = "SERVER" then
If UCase(oEnvironment.Item("IsServerOS")) <> "TRUE" then
oLogging.CreateEvent 41045, LogTypeError, "ERROR - Attempting to deploy a server operating system to a machine running a client operating system.", Array()
oLogging.ReportFailure "ERROR - Attempting to deploy a server operating system to a machine running a client operating system.", 9802
End if
Else
oLogging.CreateEntry "VerifyOS property not set, OS check bypassed", LogTypeInfo
End if
End if
'//----------------------------------------------------------------------------
'// Abort if "OSInstall" flag is set to something other than "Y"
'//----------------------------------------------------------------------------
If oEnvironment.Exists("OSInstall") then
If UCase(Left(oEnvironment.Item("OSInstall"), 1)) <> "Y" then
oLogging.CreateEvent 41046, LogTypeError, "ERROR - Machine is not authorized for upgrading (OSInstall=" & oEnvironment.Item("OSInstall") & "), aborting.", Array()
oLogging.ReportFailure "ERROR - Machine is not authorized for upgrading (OSInstall=" & oEnvironment.Item("OSInstall") & "), aborting.", 9803
Else
oLogging.CreateEntry "OSInstall flag is set, install is allowed.", LogTypeInfo
End if
Else
oLogging.CreateEntry "OSInstall flag is not set, validation check bypassed.", LogTypeInfo
End if
'//----------------------------------------------------------------------------
'// Abort if trying to Refresh from a higher level OS to a lower level OS
'//----------------------------------------------------------------------------
'// Save to OSCurrentVersion temporary variable
oUtility.GetMajorMinorVersion(oEnvironment.Item("OSCurrentVersion"))
iOSCVMajor = oUtility.VersionMajor
iOSCVMinor = oUtility.VersionMinor
'// Save ImageBuild to temporary variable
oUtility.GetMajorMinorVersion(oEnvironment.Item("ImageBuild"))
iImageBuildMajor = oUtility.VersionMajor
iImageBuildMinor = oUtility.VersionMinor
If oEnvironment.Item("DeploymentType") = "REFRESH" Then
If oEnvironment.Item("ImageBuild") <> "" Then
If (iImageBuildMajor < iOSCVMajor) or (iImageBuildMajor = iOSCVMajor and iImageBuildMinor < iOSCVMinor) then
oLogging.ReportFailure "Error - Performing a Refresh from a newer OS Version to an older OS Version is not supported. You must perform a NewComputer deployment, aborting", 9808
End If
Else
oLogging.CreateEntry "ImageBuild could not be determined, assuming ConfigMgr deployment", LogTypeInfo
End If
End If
'//----------------------------------------------------------------------------
'// Abort if trying to Refresh to a different partition
'//----------------------------------------------------------------------------
If oEnvironment.Item("DeploymentType") = "REFRESH" and ucase(oEnvironment.Item("DestinationOSRefresh")) <> "OKTOUSEOTHERDISKANDPARTITION" Then
If ucase(sDrive) <> ucase(oEnv("SystemDrive")) Then
oLogging.ReportFailure "Error - Performing a Refresh to a partition that does not match the current OS partition is not supported. You must perform a NewComputer deployment, aborting", 9809
End If
End If
'//----------------------------------------------------------------------------
'// Make sure this machine meets the minimum requirements
'//----------------------------------------------------------------------------
If oEnvironment.Item("ImageMemory") <> "" then
iMemory = CSng(oEnvironment.Item("ImageMemory")) - 64 ' Allow 64MB shared video memory
Else
iMemory = 448 ' Assume Vista, 512MB, allow for 64MB shared video memory
End if
oLogging.CreateEntry "Compare the current processor speed with the speed requested [" + oEnvironment.Item("ImageProcessorSpeed") + "] = [" + oEnvironment.Item("ProcessorSpeed") + "].", LogTypeInfo
If oEnvironment.Item("ImageProcessorSpeed") <> "" then
iProcessorSpeed = CSng(oEnvironment.Item("ImageProcessorSpeed")) - 10 ' Allow for rounding/"creative math"
Else
iProcessorSpeed = 790 ' Assume Vista, 800MHz, allow for 10MHz rounding/"creative math"
End if
oLogging.CreateEntry "ImageProcessorSpeed set to : " & iProcessorSpeed & ".", LogTypeInfo
If oEnvironment.Exists("Memory") then
If CSng(oEnvironment.Item("Memory")) < iMemory then ' Allow for 64MB shared video memory on a 512MB machine
oLogging.CreateEvent 41047, LogTypeError, "ERROR - " & oEnvironment.Item("Memory") & "MB of memory is insufficient. At least " & iMemory & "MB of memory is required.", Array()
oLogging.ReportFailure "ERROR - " & oEnvironment.Item("Memory") & "MB of memory is insufficient. At least " & iMemory & "MB of memory is required.", 9804
End if
End if
oLogging.CreateEntry "Computer has sufficient memory.", LogTypeInfo
If oEnvironment.Item("IsVM") <> "True" and oEnvironment.Exists("ProcessorSpeed") then
If CSng(oEnvironment.Item("ProcessorSpeed")) < iProcessorSpeed then ' Allow for rounding/"creative math"
oLogging.CreateEvent 41048, LogTypeError, "ERROR - Processor speed of " & oEnvironment.Item("ProcessorSpeed") & "MHz is insufficient. At least a " & iProcessorSpeed & "MHz processor is required.", Array()
oLogging.CreateEntry "NOTE: Please ensure this machine is connected to AC power before running this script.", LogTypeError
oLogging.ReportFailure "ERROR - Processor speed of " & oEnvironment.Item("ProcessorSpeed") & "MHz is insufficient. At least a " & iProcessorSpeed & "MHz processor is required.", 9805
End if
End if
oLogging.CreateEntry "Computer has sufficient processor speed.", LogTypeInfo
'//----------------------------------------------------------------------------
'// Find or estimate the image size
'//----------------------------------------------------------------------------
If oEnvironment.Exists("ImageSize") then
iImageSize = oEnvironment.Item("ImageSize")
oLogging.CreateEntry "Using specified ImageSize = " & iImageSize, LogTypeInfo
Else
' Determine the multiplier
If oEnvironment.Exists("ImageSizeMultiplier") then
dMultiplier = CSng(oEnvironment.Item("ImageSizeMultiplier"))
oLogging.CreateEntry "Using specified ImageSizeMultiplier = " & dMultiplier, LogTypeInfo
Else
dMultiplier = 2.5
oLogging.CreateEntry "Using default ImageSizeMultiplier = " & dMultiplier, LogTypeInfo
End if
' Guess at the expanded image size using the WIM file size and multiplier
If oFSO.FileExists(oEnvironment.Item("OSDPACKAGEPATH") & "\OS.WIM") then
iImageSize = (Int(oFSO.GetFile(oEnvironment.Item("OSDPACKAGEPATH") & "\OS.WIM").Size / 1048576) + 1) * dMultiplier
oLogging.CreateEntry "Estimated size of image (assuming " & dMultiplier & "X compression) = " & iImageSize, LogTypeInfo
Else
iImageSize = 7168 ' Throw a SWAG guess of 7GB
oLogging.CreateEntry "WARNING - Cannot determine image size, guessing 7GB", LogTypeWarning
End if
End if
'//----------------------------------------------------------------------------
'// Based on the scenario and image size, determine the needed size
'//----------------------------------------------------------------------------
Select Case oEnvironment.Item("DeploymentType")
Case "REFRESH", "UPGRADE"
' Calc total required space, allowing 150MB for WinPE, logs, etc., and 3GB for Setup.
iNeededSize = iImageSize + 150 + 3000
oLogging.CreateEntry "Estimated total space needed on " & sDrive & " partion for image, Windows PE, and logs = " & iNeededSize, LogTypeInfo
' See if enough total space is available (assuming most of the drive will be cleaned off before calling setup)
On Error Resume Next ' Might fail if no C: drive yet
iTotalSize = Int(oFSO.GetDrive(sDrive).TotalSize / 1048576) - 1 ' Round down
If Err then
oLogging.CreateEntry "WARNING - Unable to detect size of the " & sDrive & " drive, assuming enough space is available.", LogTypeWarning
Err.Clear
Else
oLogging.CreateEntry "Total space available on " & sDrive & " drive = " & iTotalSize, LogTypeInfo
If iTotalSize > iNeededSize then
oLogging.CreateEntry "Enough space is available on " & sDrive & ".", LogTypeInfo
Else
oLogging.CreateEvent 41049, LogTypeError, "ERROR - insufficient space is available on " & sDrive & ". An additional " & CStr(iNeededSize - iTotalSize) & "MB is required.", Array()
oLogging.ReportFailure "ERROR - insufficient space is available on " & sDrive & ". An additional " & CStr(iNeededSize - iTotalSize) & "MB is required.", 9807
End if
End if
On Error Goto 0
Case "NEWCOMPUTER"
oLogging.CreateEntry "Assuming that the drive has enough disk space (once cleaned)", LogTypeInfo
Case Else
oLogging.CreateEntry "WARNING - Unable to determine deployment type, assuming it is OK to continue", LogTypeWarning
End Select
'//----------------------------------------------------------------------------
'// For refreshes, make sure the drive isn't compressed
'//----------------------------------------------------------------------------
If oEnvironment.Item("DeploymentType") = "REFRESH" then
oLogging.CreateEntry "Ensuring root of " & sDrive & " drive is not compressed.", LogTypeInfo
oUtility.RunWithConsoleLoggingAndHidden "compact /u " & sDrive
End if
Main = Success
End Function
End Class
</script>
</job>