Friday, March 22, 2013

Doing Custom Drive Configuration MDT without changing Task Sequence using PowerShell

This post elaborates on the MDTDB PowerShell module from Michael Niehaus link URL and configures the drives using PowerShell. it does this without altering the Task Sequence.

The key to this is using a few MDT database variables:

  • OSDPartitions0BOOTABLE=
  • OSDPartitions0FILESYSTEM=
  • OSDPartitions0QUICKFORMAT=
  • OSDPartitions0SIZE=
  • OSDPartitions0SIZEUNITS=
  • OSDPartitions0TYPE=
  • OSDPartitions0VOLUMELETTERVARIABLE=
  • OSDPartitions0VOLUMENAME=

This variables will overrule de standard drive configuration defined in the Task Sequence. MDT can configure a maximum of 2 partitions (per disk) using the database variables OSDPartitions0 and OSDPartitions1Field OSDPartitions0SIZE will define the partition size in units specified in OSDPartitions0SIZEUNITS, these can be MB, GB or %. When using % this will define the percentage of remaining diskspace so if partition 0 was defined as 40Gb the specification of 100 % will result in the allocation of 100% of the rest of the remaining disk space to that second partition.

this script will use DHCP exports as created by another script you can find on my blog , if no, by DHCP exported MAC address, can be found the script will ask for a MAC address. it will check the MAC address for validity and the script will ask you to create a new MDTcomputer object if the machine cannot be found.



##################################
#
# this deployscript automates MDT using the database
# It configures the disk configuration of a new or existing computer object
# Functionality based on MDT plugin developed by Michael Niehaus
# Build by Bas Huygen
# March 2013
# Version 0.1
#################################

# Clear relevant variables
Clear-Host
Clear-Variable -Name computer
Clear-Variable -Name LASTEXITCODE

# import the relevant powershell modules and snapins
Import-Module D:\PSdeployripts\MDTDB\MDTDB.psm1 -Verbose
Add-PSSnapIn Microsoft.BDD.PSSnapIn

# Declare variables
$ErrorActionPreference= "SilentlyContinue"
$DeployServer = "deploy.deploy.lan"
$SQLServer = "deploySQL.deploy.lan"
$SQLInstance = "SQLExpress"
$MDTDatabaseName = "MDTdb"
$DHCPexport = "\\DHCP01\D$\PSdeployripts\Exports\exportDHCP.txt"

# Make a connection to the MDT database
Connect-MDTDatabase -SQLServer $SQLServer\$SQLInstance -Database $MDTDatabaseName

# Function Get-MAC $computer used to fetch MAC address
Function Get-MAC ($computer){
$macstr = 0
$maccnv = 0
if(!(Test-Path $DHCPexport)){Write-Host "path $DHCPexport is not valid"
$macstr =Get-Content Env:\TEMP\maccache.txt |where{$_ -like "*$computer*"}}
if($macstr.length -eq 0){
$maccnv= Read-Host ("$computer not found in cache `nEnter the MAC adress
`nFormat is xx:xx:xx:xx:xx:xx");
write "$computer $maccnv" |Out-File Env:\TEMP\maccache.txt -Append

# check the retreived MAC adress for validity
if($maccnv.Replace(":","").Length -ne 12) {
do{
Write-Host "Found $computer in DHCP however it is not valid: $maccnv"
$maccnv = Read-Host "Please enter a valid MAC address format is xx:xx:xx:xx:xx:xx";
}while ($maccnv.Replace(":","").Length -ne 12)
}
write "$computer $maccnv" |Out-File Env:\TEMP\maccache.txt -Append
}
else{ Write-Host "Found $computer with $maccnv"}
return $maccnv }

# Function set drive config entered by user
Function Drive-Config ($computer,$mac){
$config = Read-Host ("Please enter drive configuration: `n
-----------------------------------------------------------------
Standard disk configuration (1 partition all space allocated) (s) `
One custom partition rest not configured (1) `n
Two custom partitions (2)`n
-----------------------------------------------------------------
Please enter a choice (1,2,s)")

Switch ($config) {
1 {Set-MDTComputer -id $mac -settings @{OSDPartitions="1";
OSDPartitions0BOOTABLE="TRUE";
OSDPartitions0FILESYSTEM="NTFS";
OSDPartitions0QUICKFORMAT="TRUE";
OSDPartitions0SIZE=(Read-Host "The amount of GB's of the first drive");
OSDPartitions0SIZEUNITS="GB";
OSDPartitions0TYPE="Primary";
OSDPartitions0VOLUMELETTERVARIABLE="Newdrive1";
OSDPartitions0VOLUMENAME="OSDisk"
OSDPartitions1BOOTABLE="";
OSDPartitions1FILESYSTEM="";
OSDPartitions1QUICKFORMAT="";
OSDPartitions1SIZE="";
OSDPartitions1SIZEUNITS="";
OSDPartitions1TYPE="";
OSDPartitions1VOLUMELETTERVARIABLE="";
OSDPartitions1VOLUMENAME=""} > $null
}
2 {Set-MDTComputer -id $mac -settings @{OSDPartitions="2";
OSDPartitions0BOOTABLE="TRUE";
OSDPartitions0FILESYSTEM="NTFS";
OSDPartitions0QUICKFORMAT="TRUE";
OSDPartitions0SIZE=(Read-Host "The amount of GB's of the first drive");
OSDPartitions0SIZEUNITS="GB";
OSDPartitions0TYPE="Primary";
OSDPartitions0VOLUMELETTERVARIABLE="Newdrive1";
OSDPartitions0VOLUMENAME="OSDisk"
OSDPartitions1BOOTABLE="FALSE";
OSDPartitions1FILESYSTEM="NTFS";
OSDPartitions1QUICKFORMAT="TRUE";
OSDPartitions1SIZE=(Read-Host "The amount of GB's of the second drive");
OSDPartitions1SIZEUNITS="GB";
OSDPartitions1TYPE="Primary";
OSDPartitions1VOLUMELETTERVARIABLE="Newdrive2";
OSDPartitions1VOLUMENAME="Data" } > $null
}
s {Set-MDTComputer -id $mac -settings @{OSDPartitions="";
OSDPartitions0BOOTABLE="";
OSDPartitions0FILESYSTEM="";
OSDPartitions0QUICKFORMAT="";
OSDPartitions0SIZE="";
OSDPartitions0SIZEUNITS="";
OSDPartitions0TYPE="";
OSDPartitions0VOLUMELETTERVARIABLE="";
OSDPartitions0VOLUMENAME=""
OSDPartitions1BOOTABLE="";
OSDPartitions1FILESYSTEM="";
OSDPartitions1QUICKFORMAT="";
OSDPartitions1SIZE="";
OSDPartitions1SIZEUNITS="";
OSDPartitions1TYPE="";
OSDPartitions1VOLUMELETTERVARIABLE="";
OSDPartitions1VOLUMENAME=""} > $null
}
}
}

Clear-Host
$computer = Read-Host "Please enter Computer name"
write "Starting deployscript for $computer"
$mac = Get-MAC $computer
If(!((Get-MDTComputer -macAddress $mac).OSDComputerName -eq $computer)){
if($macstr -eq 0){Get-MAC $computer}
$newMDTComp = Read-Host "Make a new MDT Computer object? (y/n)"
if($newMDTComp -eq "y"){
New-MDTComputer -macAddress $mac -dedeployription $computer -settings @{OSInstall="YES";OSDComputerName="$computer"} > $null
Drive-Config $computer ((Get-MDTComputer -macAddress $mac).ID)}exit
}
else{Drive-Config $computer ((Get-MDTComputer -macAddress $mac).ID)}


happy OSD-ing 


No comments:

Post a Comment