Files

774 lines
29 KiB
XML

<job id="ZTIDiskpart">
<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: ZTIDiskpart.wsf
' //
' // Version: 6.3.8456.1000
' //
' // Purpose: Partition and format the hard drive
' //
' // Usage: cscript ZTIDiskpart.wsf [/debug:true]
' //
' // Variables:
' // DEPLOYMENTTYPE = NEWCOMPUTER [Required]
' // OSDDISKINDEX = 0 - THis is the Index of the Disk to be modified
' // OSDPARTITIONS = 1
' // OSDPARTITIONS0TYPE = Primary
' // OSDPARTITIONS0FILESYSTEM = NTFS
' // OSDPARTITIONS0BOOTABLE = TRUE
' // OSDPARTITIONS0QUICKFORMAT = TRUE
' // OSDPARTITIONS0VOLUMENAME = DataDisk
' // OSDPARTITIONS0SIZE = 200
' // OSDPARTITIONS0SIZEUNITS = GB
' // OSDPARTITIONS0VOLUMELETTERVARIABLE = Destination Drive
' //
' // doNotFormatAndPartition - Master Override, Do not Clean/Format. Used with Destination Drive
' // OSDDiskpartBiosCompatibilityMode - Used in some WIndows 5.1 format scenarios.
' // OSDDiskAlign & OSDDiskOffset - Can be used to align disks on SAN disks
' // DONOTCREATEEXTRAPARTITION - Override (in some scenarios), the creation of the Boot Partition.
' //
' // ***************************************************************************
Option Explicit
RunNewInstance
'//----------------------------------------------------------------------------
'// Global Constants
'//----------------------------------------------------------------------------
' Extra Boot drives are hard coded at 499MB.
' To override this value, create a boot partition in MDT Console.
'
' *********************
' The System "Active" drive must be *UNDER* 500MB.
' Otherwise this may cause conflicts with VSS.
' See "Understanding Disk Partitions" on Technet:
' http://technet.microsoft.com/en-us/library/dd799232(v=ws.10).aspx
' *********************
'
Const WINRE_DRIVE_SIZE = 499
Const BOOT_DRIVE_SIZE = 499
Const DISKPART_MAIN_DRIVE = "C:"
'//----------------------------------------------------------------------------
'// Main Class
'//----------------------------------------------------------------------------
Class ZTIDiskpart
Dim sFreeDrive
'//----------------------------------------------------------------------------
'// Main routine
'//----------------------------------------------------------------------------
Function Main
' Local Variables
Dim bCreateBootPartition
Dim isUEFI
Dim isVHD
Dim oDisk
Dim bHasBootPartition
Dim sAlignment
Dim oExec
Dim iDiskIndex
Dim iDiskPartitionCount
Dim iPartition
Dim oAllDiskDrives
Dim isBitlocker
Dim sBootDrive
Dim sPartitionType
Dim iExtendedRemainingSize
Dim iPartitionSize
Dim iRemainingSize
Dim sNextDriveLetter
Dim sVolumeName
Dim sQuickFormat
Dim sFileSystem
Dim iBdeDriveSize
Dim i
Dim sTranslatedType
Dim oDrive
Dim sDestinationDrive
'//----------------------------------------------------------------------------
'// Environment Check
'//----------------------------------------------------------------------------
GenerateListOfAvailableDriveLetters
oLogging.CreateEntry "Free Drive Letter(s): " & sFreeDrive , LogTypeInfo
oUtility.GetMajorMinorVersion(oEnvironment.Item("ImageBuild"))
'//----------------------------------------------------------------------------
'// Verify there is a disk at the specified index.
'//----------------------------------------------------------------------------
iDiskIndex = 0
If isnumeric(oEnvironment.Item("OSDDiskIndex")) then
iDiskIndex = cint(oEnvironment.Item("OSDDiskIndex"))
End If
set oDisk = New ZTIDisk
oDisk.Disk = iDiskIndex
If isEmpty(oDisk.Disk) then
oLogging.CreateEntry "################################################", LogTypeError
oLogging.CreateEntry "## Disk(" & iDiskIndex & ") was not found. Unable to continue.", LogTypeError
oLogging.CreateEntry "## Possible Cause: Missing Storage Driver.", LogTypeError
oLogging.CreateEntry "################################################", LogTypeError
oLogging.ReportFailure "Disk OSDDiskIndex(" & iDiskIndex & ") can not be found!", 7711
ElseIf not oDisk.isOSReady( oEnvironment.Item("ImageBuild") ) then
oLogging.CreateEntry "################################################", LogTypeError
oLogging.CreateEntry "## Disk(" & iDiskIndex & ") Can not be Formatted in ZTIDiskPart.", LogTypeError
oLogging.CreateEntry "## Possible Cause: Removable drive, not an internal fixed drive.", LogTypeError
oLogging.CreateEntry "################################################", LogTypeError
oLogging.ReportFailure "Disk (" & oDisk.oWMI.Path_ & ") can not be formatted in OSD.", 7712
End if
oLogging.CreateEntry "Found Disk Index: " & iDiskIndex & " size: " & oDisk.oWMI.Size , LogTypeInfo
oLogging.CreateEntry "Disk Index: " & iDiskIndex & " size: " & oDisk.SizeAsString , LogTypeInfo
oLogging.CreateEntry "Disk WMI Path : " & oDisk.oWMI.Path_ , LogTypeVerbose
oLogging.CreateEntry "Disk WMI MOF : " & oDisk.oWMI.GetObjectText_ , LogTypeVerbose
'//----------------------------------------------------------------------------
'// Determine if we are performing custom partition configuration
'//----------------------------------------------------------------------------
iDiskPartitionCount = 0
If isnumeric(oEnvironment.Item("OSDPartitions")) then
iDiskPartitionCount = oEnvironment.Item("OSDPartitions")
End If
set oAllDiskDrives = AllDiskDrives
TestAndFail iDiskPartitionCount > 0, 7813, "Verify there are partitions defined in this Task Sequence Step."
'//----------------------------------------------------------------------------
'// Skip Processing if this is a Media build running off Drive DISKPART_MAIN_DRIVE
'//----------------------------------------------------------------------------
If mid(oEnvironment.Item("DeployDrive"),2,1) = ":" then
If GetDiskForDrive(left(oEnvironment.Item("DeployDrive"),2)) = iDiskIndex then
oLogging.CreateEntry "DeployRoot is on disk #" & iDiskIndex & ". Running an OEM Scenario: Skip.", LogTypeInfo
oEnvironment.Item("IsOEM") = oUtility.ConvertBooleanToString(true)
Main = SUCCESS
EXIT FUNCTION
End If
End If
If iDiskIndex = 0 and oFSO.FileExists("C:\OEM.wsf") then
oLogging.CreateEntry "C:\OEM.wsf exists. Running an OEM Scenario: Skip.", LogTypeInfo
oEnvironment.Item("IsOEM") = oUtility.ConvertBooleanToString(true)
Main = SUCCESS
EXIT FUNCTION
End If
If ucase(oEnvironment.Item("doNotFormatAndPartition")) = "YES" then
oLogging.CreateEntry "DoNotFormatAndPartition = YES! Find the OS Target Drive Letter.", LogTypeInfo
sBootDrive = oUtility.GetOSTargetDriveLetterEx( false )
If isempty(sBootDrive) then
oLogging.ReportFailure "DoNotFormatAndPartition has been set to Yes, however the Target Partition for the OS could not be determined. See BDD.Log for details.", 7820
Else
oLogging.CreateEntry "Do Not Format and Partition Disk. OS Drive has been pre-set: " & sBootDrive, LogTypeInfo
oUtility.VerifyPathExists left(sBootDrive,2) & "\MININT\SMSOSD\OSDLOGS"
oEnvironment.Item("SMSTSLocalDataDrive") = sBootDrive
oUtility.ResetLocalRootPath
main = SUCCESS
EXIT FUNCTION
End if
End if
'//----------------------------------------------------------------------------
'// Does the script need to Create a Boot Partition?
'// Otherwise, just go off of the Task Sequence template.
'//----------------------------------------------------------------------------
isVHD = False
If Instr( 1, " " & oEnvironment.Item("VHDDisks") & " ", " " & trim(cstr(iDiskIndex)) & " ", vbTextCompare ) <> 0 then
oLogging.CreateEntry "This is a Virtual Disk, Special VHD actions from now on: " & oEnvironment.Item("VHDDisks"), LogTypeInfo
isVHD = True
End if
isUEFI = ucase(oEnvironment.Item("isUEFI")) = "TRUE"
isBitlocker = ucase(oEnvironment.Item("doBitlocker")) = "TRUE"
' Is there at least one partition marked "bootable"?
bHasBootPartition = False
For iPartition = 0 to iDiskPartitionCount - 1
If ucase(ReadPartitionEntry(iPartition,"Bootable")) = "TRUE" then
bHasBootPartition = True
exit For
End if
Next
If Ucase(oEnvironment.Item("DONotCreateExtraPartition")) = "YES" then
' Master override, always respect
oLogging.CreateEntry "[DoNotCreateExtraPartition=YES]. OK to skip Boot Partition.", LogTypeInfo
bCreateBootPartition = False
ElseIf not bHasBootPartition then
oLogging.CreateEntry "There are no partitions marked [Bootable=TRUE] Defined for this disk. Disk Drive Count: " & oAllDiskDrives.Count, LogTypeInfo
If oAllDiskDrives.Count = 1 then
oLogging.CreateEntry "No partitions are marked ACTIVE!", LogTypeInfo
bCreateBootPartition = True
Else
oLogging.CreateEntry "Assume boot partition is on other disk.", LogTypeInfo
bCreateBootPartition = False
End if
ElseIf isUEFI and not isVHD then
oLogging.CreateEntry "This is an EFI machine, therefore we will need a Boot Partition.", LogTypeInfo
bCreateBootPartition = True
For iPartition = 0 to iDiskPartitionCount - 1
If ucase(ReadPartitionEntry(iPartition,"Bootable")) = "TRUE" and ucase(ReadPartitionEntry(iPartition,"FileSystem")) = "FAT32" then
oLogging.CreateEntry "...However, there is a FAT32 uEFI boot partition. Assume Partitions are configured properly.", LogTypeInfo
bCreateBootPartition = False
exit for
End if
next
ElseIf iDiskPartitionCount = 1 and iDiskIndex = 0 then
oLogging.CreateEntry "There is only one partition defined (MDT Default Configuration) for this disk 0 force Boot Partition.", LogTypeInfo
bCreateBootPartition = True
Else
oLogging.CreateEntry "There is at least one partition marked [Bootable=TRUE] on this MBR disk " & iDiskIndex & " " & iDiskPartitionCount, LogTypeInfo
bCreateBootPartition = False
End if
oLogging.CreateEntry "bCreateBootPartition = " & cStr(bCreateBootPartition), LogTypeInfo
'//----------------------------------------------------------------------------
'// Manage the Alignment & Offset for new Partitions
'//----------------------------------------------------------------------------
sAlignment = ""
oLogging.CreateEntry "Configuring Disk Alignment", LogTypeInfo
If isNumeric(oEnvironment.Item("OSDDiskAlign")) and isNumeric(oEnvironment.Item("OSDDiskOffset")) then
sAlignment = " OFFSET=" & oEnvironment.Item("OSDDiskOffset") & " ALIGN=" & oEnvironment.Item("OSDDiskAlign")
ElseIf isNumeric(oEnvironment.Item("OSDDiskAlign")) then
sAlignment = " ALIGN=" & oEnvironment.Item("OSDDiskAlign")
ElseIf isNumeric(oEnvironment.Item("OSDDiskOffset")) then
sAlignment = " OFFSET=" & oEnvironment.Item("OSDDiskOffset")
Else
oLogging.CreateEntry "No Disk Alignment variables specified, alignment not updated.", LogTypeInfo
End if
'//----------------------------------------------------------------------------
'// Open an instance for diskpart.exe, and dynamically pipe the commands to the program.
'//----------------------------------------------------------------------------
' Make sure we don't cache the local root path
oUtility.CacheLocalRootPath = False
oLogging.ReportProgress "Preparing Disk " & iDiskIndex & " Partitions ...", 10
set oExec = oUtility.RunCommandStart("Diskpart.exe", empty)
oUtility.RunCommandWrite oExec, "RESCAN" ' Just to be sure.
oUtility.RunCommandWrite oExec, "LIST DISK"
oUtility.RunCommandWrite oExec, "LIST VOLUME"
'//----------------------------------------------------------------------------
'// Re-Assign Drive DISKPART_MAIN_DRIVE if present
'//----------------------------------------------------------------------------
If bHasBootPartition and iDiskIndex = 0 then
If InStr(1,sFreeDrive,DISKPART_MAIN_DRIVE,vbTextCompare) = 0 then
oUtility.RunCommandWrite oExec, "REM Move Drive " & DISKPART_MAIN_DRIVE & " to a diffrent drive letter."
oUtility.RunCommandWrite oExec, "Select volume " & DISKPART_MAIN_DRIVE
oUtility.RunCommandWrite oExec, "Assign Letter=" + GetLastAvailableDriveLetter
sFreeDrive = DISKPART_MAIN_DRIVE & " " & sFreeDrive ' Push DISKPART_MAIN_DRIVE into queue
End if
End if
'//----------------------------------------------------------------------------
'// Clean the drive (if necessary)
'//----------------------------------------------------------------------------
oUtility.RunCommandWrite oExec, "SELECT DISK " & iDiskIndex
oUtility.RunCommandWrite oExec, "CLEAN"
' Reset IsBDE since we cleaned the disk
If UCase(oEnvironment.Item("IsBDE")) = "TRUE" then
oLogging.CreateEntry "Disk was cleaned, BitLocker no longer present.", LogTypeInfo
oEnvironment.Item("IsBDE") = oUtility.ConvertBooleanToString(false)
End if
'//----------------------------------------------------------------------------
'// Manage Partition Types
'//----------------------------------------------------------------------------
If isUEFI and (bHasBootPartition or isVHD) then
oUtility.RunCommandWrite oExec, "CONVERT GPT NOERR"
ElseIf oEnvironment.Item("OSDPartitionStyle") <> "" then
oUtility.RunCommandWrite oExec, "CONVERT " & oEnvironment.Item("OSDPartitionStyle") & " NOERR"
Else
oUtility.RunCommandWrite oExec, "CONVERT BASIC NOERR"
End If
'//----------------------------------------------------------------------------
'// Get the size of the extra partition. (Provided for backwards compatibiltiy).
'// Administrators are encouraged to define "bootable" partitions in the MDT Console instead.
'//----------------------------------------------------------------------------
iBdeDriveSize = BOOT_DRIVE_SIZE
If isnumeric(oEnvironment.Item("BdeDriveSize")) Then
iBdeDriveSize = oEnvironment.Item("BdeDriveSize")
If (iBdeDriveSize < ( 300 ) ) Then
oLogging.ReportFailure "Disk is not large enough for System and BDE partitions, Required = 300MB", 7701
End If
End If
'//----------------------------------------------------------------------------
'// Create a Boot Partition if requested.
'//----------------------------------------------------------------------------
If bCreateBootPartition Then
sBootDrive = GetLastAvailableDriveLetter
bHasBootPartition = true
If isUEFI then
oLogging.CreateEntry "Create an UEFI/GPT Boot Partition set. " & sBootDrive, LogTypeInfo
oUtility.RunCommandWrite oExec, "CREATE PARTITION PRIMARY Size=" & cstr(WINRE_DRIVE_SIZE)
oUtility.RunCommandWrite oExec, "FORMAT QUICK FS=NTFS LABEL=""Windows RE tools"""
oUtility.RunCommandWrite oExec, "ASSIGN LETTER=" & left( GetLastAvailableDriveLetter, 1)
oUtility.RunCommandWrite oExec, "SET ID=""de94bba4-06d1-4d40-a16a-bfd50179d6ac"""
oUtility.RunCommandWrite oExec, "GPT ATTRIBUTES=0x8000000000000001"
oUtility.RunCommandWrite oExec, "DETAIL PARTITION"
oUtility.RunCommandWrite oExec, "DETAIL VOLUME"
oUtility.RunCommandWrite oExec, "CREATE PARTITION EFI Size=" & cstr(iBdeDriveSize)
oUtility.RunCommandWrite oExec, "FORMAT QUICK FS=Fat32 LABEL=""System"""
oUtility.RunCommandWrite oExec, "ASSIGN LETTER=" & left( sBootDrive, 1)
oUtility.RunCommandWrite oExec, "DETAIL PARTITION"
oUtility.RunCommandWrite oExec, "DETAIL VOLUME"
oUtility.RunCommandWrite oExec, "CREATE PARTITION MSR SIZE=128"
oUtility.RunCommandWrite oExec, "DETAIL PARTITION"
oUtility.RunCommandWrite oExec, "DETAIL VOLUME"
Else
oLogging.CreateEntry "Create a MBR Boot Partition set. " & sBootDrive, LogTypeInfo
oUtility.RunCommandWrite oExec, "CREATE PARTITION PRIMARY Size=" & cstr(iBdeDriveSize)
oUtility.RunCommandWrite oExec, "FORMAT QUICK FS=NTFS LABEL=""System"""
oUtility.RunCommandWrite oExec, "ASSIGN LETTER=" & left( sBootDrive, 1)
' oUtility.RunCommandWrite oExec, "ATTRIBUTES VOLUME SET NODEFAULTDRIVELETTER NOERR"
oUtility.RunCommandWrite oExec, "ACTIVE"
oUtility.RunCommandWrite oExec, "DETAIL PARTITION"
oUtility.RunCommandWrite oExec, "DETAIL VOLUME"
End if
End if
'//----------------------------------------------------------------------------
'// Create Partitions from Table
'//----------------------------------------------------------------------------
iRemainingSize = oDisk.oWMI.Size / 1024 /1024
iExtendedRemainingSize = 0
'
' Enumerate through all partition entries
'
For iPartition = 0 to iDiskPartitionCount - 1
oLogging.ReportProgress "Preparing partition " & iPartition & "...", (10 + iPartition * 3)
oUtility.RunCommandWrite oExec, "REM --------------"
oUtility.RunCommandWrite oExec, "REM Partition " & iPartition
' Read each Partition TYPE
sPartitionType = ReadPartitionEntryEx( iPartition, "Type", "Primary" )
If isBitlocker then
TestAndFail ucase(sPartitionType) <> "EXTENDED" and ucase(sPartitionType) <> "LOGICAL", 7714, "Verify that any Bitlocker implementation does not have EXTENDED or LOGICAL Drives"
End if
' Read each Partition Size
If iExtendedRemainingSize <> 0 and ucase(sPartitionType) = "LOGICAL" then
iPartitionSize = GetPartitionSize( iPartition, iExtendedRemainingSize )
If isEmpty(iPartitionSize) then
iExtendedRemainingSize = 0
Else
iExtendedRemainingSize = clng(iExtendedRemainingSize) - clng(iPartitionSize)
End If
Else
iPartitionSize = GetPartitionSize( iPartition, iRemainingSize )
If isEmpty(iPartitionSize) then
iExtendedRemainingSize = 0
iRemainingSize = 0
Else
iExtendedRemainingSize = iPartitionSize
iRemainingSize = clng(iRemainingSize) - clng(iPartitionSize)
End If
End If
' Create the Partition
If UCase(sPartitionType) = "RECOVERY" or UCase(sPartitionType) = "HIDDEN" then
sTranslatedType = "Primary"
Else
sTranslatedType = sPartitionType
End if
If isEmpty(iPartitionSize) then
oUtility.RunCommandWrite oExec, "CREATE PARTITION " & sTranslatedType & sAlignment
Else
oUtility.RunCommandWrite oExec, "CREATE PARTITION " & sTranslatedType & " Size=" & iPartitionSize & sAlignment
End if
sNextDriveLetter = ""
' Mark the Drive Active
If bCreateBootPartition then
oLogging.CreateEntry "Do not mark a 2nd partition active.", LogTypeInfo
sNextDriveLetter = left(GetNextAvailableDriveLetter,1) & ":"
ElseIf ucase(ReadPartitionEntry(iPartition,"Bootable")) = "TRUE" then
oUtility.RunCommandWrite oExec, "Active"
bCreateBootPartition = True
sNextDriveLetter = left(GetLastAvailableDriveLetter,1) & ":"
Else
sNextDriveLetter = left(GetNextAvailableDriveLetter,1) & ":"
End If
' oUtility.RunCommandWrite oExec, "ATTRIBUTES VOLUME CLEAR NODEFAULTDRIVELETTER NOERR"
' Get a Drive Letter and Format
If ucase(sPartitionType) <> "EXTENDED" and ucase(sPartitionType) <> "MSR" then
oUtility.RunCommandWrite oExec, "Assign letter=" & sNextDriveLetter
' The Drive letters for each partition are allocated dynamically during WinPE.
' For scripts that *may* need them later, Administrators can define a variable
' to store this Drive Letter for future use.
If ReadPartitionEntry(iPartition,"VolumeLetterVariable") <> "" then
oEnvironment.Item( ReadPartitionEntry(iPartition,"VolumeLetterVariable") ) = sNextDriveLetter
End if
' Construct Format Commands...
sVolumeName = ReadPartitionEntryEx(iPartition,"VolumeName", "NewDisk")
sFileSystem = ReadPartitionEntryEx(iPartition,"FileSystem", "NTFS")
sQuickFormat = ""
If ucase(ReadPartitionEntryEx(iPartition,"QuickFormat", "True")) <> "FALSE" then
sQuickFormat = "QUICK"
End if
If ucase(sFileSystem) = "FAT32" then
TestAndLog len(sVolumeName) <= 11, "Verify FAT32 Label is less than 12 chars."
oUtility.RunCommandWrite oExec, "FORMAT " & sQuickFormat & " FS=FAT32 LABEL=""" & left(sVolumeName,11) & """"
ElseIf ucase(sFileSystem) = "NONE" then
oUtility.RunCommandWrite oExec, "REM DO NOT FORMAT"
Else
TestAndLog len(sVolumeName) <= 32, "Verify NTFS Label is less than 33 chars."
oUtility.RunCommandWrite oExec, "FORMAT " & sQuickFormat & " FS=" & sFileSystem & " LABEL=""" & left(sVolumeName,32) & """"
End if
If UCase(sPartitionType) = "RECOVERY" then
If oEnvironment.Item("OSDPartitionStyle") = "GPT" then
oUtility.RunCommandWrite oExec, "SET ID = de94bba4-06d1-4d40-a16a-bfd50179d6ac"
oUtility.RunCommandWrite oExec, "GPT ATTRIBUTES = 0x8000000000000000"
Else
oUtility.RunCommandWrite oExec, "SET ID = 27"
End if
ElseIf UCase(sPartitionType) = "HIDDEN" then
If oEnvironment.Item("OSDPartitionStyle") = "GPT" then
oUtility.RunCommandWrite oExec, "GPT ATTRIBUTES = 0x8000000000000000"
Else
oUtility.RunCommandWrite oExec, "SET ID = 17"
End if
End if
oUtility.RunCommandWrite oExec, "DETAIL VOLUME"
End if
oUtility.RunCommandWrite oExec, "DETAIL PARTITION"
next ' iPartition
'//----------------------------------------------------------------------------
'// Diskpart commands have been generated and piped, now parse and log output.
'//----------------------------------------------------------------------------
oUtility.RunCommandWrite oExec, "LIST PARTITION"
oUtility.RunCommandWrite oExec, "LIST VOLUME"
oUtility.RunCommandWrite oExec, "EXIT"
oUtility.RunCommandLog oExec, empty, -1
'//----------------------------------------------------------------------------
'// If the disk just partitioned and formatted is the Destination Disk
'// then we should perform some extra processing to ensure consistency.
'//----------------------------------------------------------------------------
oUtility.ReCalculateDestinationDiskAndPartition False
oLogging.CreateEntry "DestinationDisk: " & oEnvironment.Item("DestinationDisk") , LogTypeInfo
If not IsNumeric(oEnvironment.Item("DestinationDisk")) then
oLogging.CreateEntry "Assume this disk is not the destination Disk (DestinationDisk is not numeric).", LogTypeInfo
ElseIf iDiskIndex <> cint(oEnvironment.Item("DestinationDisk")) then
oLogging.CreateEntry "Assume this disk is not the destination Disk (DestinationDisk=" & oEnvironment.Item("DestinationDisk") & " iDiskIndex=" & iDiskIndex & ").", LogTypeInfo
Else
oLogging.CreateEntry "Assume this disk is the destination Disk, and verify.", LogTypeInfo
sDestinationDrive = oUtility.GetOSTargetDriveLetterEx(False)
If isEmpty(sDestinationDrive) then
oLogging.CreateEntry "Assume this disk is not the destination Disk (2).", LogTypeInfo
exit function
Main = SUCCESS
End if
oLogging.CreateEntry "Target Drive Letter Found: " & sDestinationDrive, LogTypeInfo
'//----------------------------------------------------------------------------
'// The OS Drive is important. Verify that DiskPart.exe has completed. Wait if necessary
'//----------------------------------------------------------------------------
for i = 0 to 360 ' 3 Minutes
On Error resume Next
set oDrive = ofso.GetDrive(sDestinationDrive)
If not isEmpty(oDrive) then
If oDrive.isReady then
oLogging.CreateEntry "Found OS Drive: " & oDrive.DriveLetter & " " & i, LogTypeInfo
exit for
End if
End if
On Error goto 0
oUtility.SafeSleep 500
If i mod 20 = 0 then
oLogging.CreateEntry "Waiting for Drive to Exist: " & cint(i*100/360) & "%" , LogTypeInfo
End if
next
oLogging.ReportProgress "Verify Disk " & sDestinationDrive & " ... ", 90
If IsEmpty(oDrive) then
oLogging.ReportFailure "ERROR! Drive " & sDestinationDrive & " was not found!", 7706
End if
If not oDrive.isReady then
oLogging.ReportFailure "ERROR! Drive " & sDestinationDrive & " is not Ready!", 7707
End If
If oDrive.DriveType <> 2 then
oLogging.ReportFailure "ERROR! Drive " & sDestinationDrive & " is not a fixed disk: " & oDrive.DriveType , 7708
End If
set oDisk = new ZTIDiskPartition
oDisk.Drive = oDrive.RootFolder
TestAndFail not isEmpty(oDisk.Drive), 7718, "Verify drive object is created"
oLogging.CreateEntry "Check Disk [" & iDiskIndex & "] <> [" & iDiskIndex & "] OK to skip." , LogTypeInfo
If iDiskIndex <> oDisk.Disk then
oLogging.CreateEntry "Different Disk [" & iDiskIndex & "] <> [" & iDiskIndex & "] OK to skip." , LogTypeInfo
Else
If oFSO.GetFolder( oDrive.RootFolder ).Files.Count > 0 then
oLogging.ReportFailure "ERROR! Files are present on " & sDestinationDrive & " was not cleaned: " & oFSO.GetFolder( oDrive.RootFolder ).Files.Count , 7709
End If
If oFSO.GetFolder( oDrive.RootFolder ).SubFolders.Count = 1 and oFSO.FolderExists( oDrive.RootFolder + "\MININT\" ) then
' OK, ztidiskpart.wsf may have written to this disk.
Elseif oFSO.GetFolder( oDrive.RootFolder ).SubFolders.count > 0 then
oLogging.ReportFailure "ERROR! Folders are present on " & sDestinationDrive & " was not cleaned: " & oFSO.GetFolder( oDrive.RootFolder ).SubFolders.count, 7710
End If
End if
If oEnv("SystemDrive") = "X:" then
oLogging.CreateEntry "####### NOTE: If this is one of the last lines in your BDD.log file, check " & sDestinationDrive & " for the most up to date bdd.log!!!", LogTypeInfo
End if
End if
'
' Tag any "Active" partitions so we don't use them for \minint
'
If sBootDrive <> "" then
on error resume next
With oFSO.CreateTextFile(left(sBootDrive,2) & "\ACTIVE.MDT",true,false)
.Close ' Empty 0 byte file.
End With
oFSO.GetFile(left(sBootDrive,2) & "\ACTIVE.MDT").Attributes = oFSO.GetFile(left(sBootDrive,2) & "\ACTIVE.MDT").Attributes or 2 or 4
on error goto 0
End if
Main = SUCCESS
End Function
'// END MAIN
'//---------------------------------------------------------------------------
'// Support Routines
'//---------------------------------------------------------------------------
Function GetPartitionSize ( Index, iRemainingSize )
' Return empty if No Size required ( 100% of remaining size )
Dim PartitionSizeUnits
Dim PartitionSize
PartitionSizeUnits = ReadPartitionEntry( Index, "SizeUnits" )
PartitionSize = ReadPartitionEntry( Index, "Size" )
TestAndFail isnumeric(PartitionSize), 7815, "Verify Partition size is Numeric: " & PartitionSize
oLogging.CreateEntry " Partition(" & Index & "): " & PartitionSize & " " & PartitionSizeUnits, LogTypeInfo
If ucase(PartitionSizeUnits) = "PERCENT" OR ucase(PartitionSizeUnits) = "%" then
If PartitionSize < 100 then
GetPartitionSize = int(iRemainingSize * PartitionSize / 100)
End if
Elseif ucase(PartitionSizeUnits) = "TB" then
GetPartitionSize = PartitionSize * 1000 * 1000
Elseif ucase(PartitionSizeUnits) = "GB" then
GetPartitionSize = PartitionSize * 1000
Elseif ucase(PartitionSizeUnits) = "MB" then
GetPartitionSize = PartitionSize
Else
oLogging.ReportError 7816, "Unknown Disk Size units: " & PartitionSizeUnits
End If
If isempty(GetPartitionSize) then
oLogging.CreateEntry "Size is Empty: Expand to remaining space.", LogTypeInfo
ElseIf clng(iRemainingSize) < clng(GetPartitionSize ) then
oLogging.CreateEntry "Requested disk size is greater than available space: " & GetPartitionSize, LogTypeInfo
GetPartitionSize = empty
ElseIf clng(iRemainingSize) - clng(GetPartitionSize) < 2 then
oLogging.CreateEntry "Size near end of disk: " & GetPartitionSize & " == " & iRemainingSize, LogTypeInfo
GetPartitionSize = empty
End If
oLogging.CreateEntry " Size: [ isEmpty = " & isEmpty(GetPartitionSize) & "] " & GetPartitionSize, LogTypeInfo
End Function
'//---------------------------------------------------------------------------
Function ReadPartitionEntryEx( Index, Name, DefaultValue )
ReadPartitionEntryEx = ReadPartitionEntry( Index, Name )
If ReadPartitionEntryEx = "" then
ReadPartitionEntryEx = DefaultValue
End If
End Function
Function ReadPartitionEntry( Index, Name )
ReadPartitionEntry = oEnvironment.Item( "OSDPartitions" & Index & Name )
End Function
'//---------------------------------------------------------------------------
Function GenerateListOfAvailableDriveLetters
Dim i
For i = asc("C") to asc("W")
If not ofso.DriveExists(chr(i)+":") and i <> asc("S") and i <> asc("M") then
sFreeDrive = trim(sFreeDrive & " " & chr(i)+":")
End If
Next
End function
Function GetNextAvailableDriveLetter
TestAndFail len(Trim(sFreeDrive)) > 0, 7817, "Verify There are Free drives available."
GetNextAvailableDriveLetter = left(trim(sFreeDrive),2)
oLogging.CreateEntry "Pop next Drive Letter: [" & GetNextAvailableDriveLetter & "]", LogTypeVerbose
sFreeDrive = mid(trim(sFreeDrive),4)
End function
Function GetLastAvailableDriveLetter
TestAndFail len(Trim(sFreeDrive)) > 0, 7817, "Verify There are Free drives available."
GetLastAvailableDriveLetter = right(trim(sFreeDrive),2)
oLogging.CreateEntry "Pop next Drive Letter: [" & GetLastAvailableDriveLetter & "]", LogTypeVerbose
sFreeDrive = replace(sFreeDrive,GetLastAvailableDriveLetter,"")
End function
End Class
</script>
</job>