# NAME: Exchange2010LabCreate.ps1
# DESC: PowerShell script to create and map volumes for Exchange 2010 Lab
# BY : Justin Braun, Compellent Technologies, Inc.
# DATE: November 24, 2009
# VER : 1.0
#
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
# RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
#
####################################################
# ERROR HANDLING
####################################################
#"SilentlyContinue": do not print, continue
#"Continue": Print, continue (this is the default)
#"Stop": Halt the command or script
#"Inquire": Ask the user what to do
$ErrorActionPreference = "Inquire"
####################################################
# STORAGE CENTER CONFIGURATION INFORMATION
####################################################
$schost = "storagecenter.lab.test"
$user = "username"
$pass = "password"
####################################################
# EXCHANGE STORAGE CONFIGURATION
####################################################
# Number of Databases Per Server
$dbsize = "1TB"
$dbtotal = 1
$dbDiskFolder = "Assigned"
####################################################
# SERVER INFORMATION
####################################################
# Server to Map To (server defintion on CSC must match server name in Windows because of VDS)
$ServerName = "E2K10MBX01"
####################################################
# MISC. CONFIGURATION SETTINGS
####################################################
# Volume folder name
$SCParentFolderName = "E2K10MBX01"
# Use custom disk folders for each volume? (if $false, then a single disk folder config is assumed)
$useCustomDiskFolders = $false
#Mountpoints (set to $true if mountpoint volumes weren't previously created. Mountpoint volumes will be 1G by default)
$createMountpointRoot = $true
# Mountpoint Root
$dbmproot = "M:\Exchange"
$dbRootDrive = "M:"
##########################################################################################
##########################################################################################
# DO NOT EDIT BELOW THIS LINE !
##########################################################################################
##########################################################################################
# Creates volume with specified name and size using connection instantiated on script launch
function CreateVolume
{
param
(
[string] $VolumeName,
[string] $VolumeSize,
[string] $MPRoot,
[string] $SCDiskFolder,
[bool] $IsMountPoint
)
Write-Output "Creating new volume: $volumename..."
if($useCustomDiskFolders -eq $true)
{$scvolume = New-SCVolume -Name $VolumeName -Size $VolumeSize -ParentFolder $SCParentFolderName -StorageType $SCDiskFolder;}
else
{$scvolume = New-SCVolume -Name $VolumeName -Size $VolumeSize -ParentFolder $SCParentFolderName;}
# Maps volume previously created and returned from CreateVolume function
Write-Output "Mapping new volume $volumename to $servername..."
# Map Volume (if multiple HBA ports are server will be used, make sure that MPIO is installed on server and remove -SinglePath switch from next line
New-SCVolumeMap -VolumeIndex $scvolume.Index -ServerIndex $scserver.Index -SinglePath
# Rescan Server
Write-Output "Rescanning server for new volume..."
Rescan-DiskDevice -Server $ServerName -RescanDelay 5
# Issue Drive Letter / Mount Point
Write-Output "Creating access path for new volume..."
$device = Get-DiskDevice -SerialNumber $scvolume.SerialNumber
# Check to see if the device is there yet after initial rescan
if($device -eq $null)
{
# Device is still null, so let's perform up to 10 rescans before we move on
$scancount = 0
do
{
# Rescan the disk
Write-Output "Rescanning server for new volume..."
Rescan-DiskDevice -Server $ServerName -RescanDelay 5
$scancount ++
# Try getting the device again
$device = Get-DiskDevice -SerialNumber $scvolume.SerialNumber
}
until($device -ne $null -or $scancount -eq 10)
}
# Set variable (this is only used if this is a drive letter mount)
$finalpath = $MPRoot
# Set full mountpoint path (create path if it doesn't exist)
if($IsMountPoint -eq $true)
{
$finalpath = "$MPRoot\$VolumeName"
# Check to make sure the full mountpoint path acutually exists, otherwise create it
if (!(Test-Path -path "$finalpath\"))
{
New-Item "$finalpath\" -type directory
}
}
Write-Output "Onlining Disk and setting access path to $finalpath..."
# Finish creation of mountpoint/drive access
Set-DiskDevice -SerialNumber $device.SerialNumber -Online
Set-DiskDevice -SerialNumber $device.SerialNumber -ReadOnly:$false
$newvol = New-Volume -DeviceName $device.DeviceName -Server $ServerName -Label $VolumeName -AccessPath $finalpath
# Null out device
$device = $null
}
function LoadSnapins
{
# Load Exchange Management Shell & Compellent Storage Center Snapins (if not already)
$LoadedSnapins = Get-PSSnapin;
$SnapinsToLoad = "Compellent.StorageCenter.Scripting", "Microsoft.Exchange.Management.PowerShell.E2010"
"Adding PowerShell Snapins..."
foreach($snapin in $SnapinsToLoad)
{
if (get-pssnapin $snapin -ea "silentlycontinue")
{
write-host "$snapin is already loaded."
}
elseif (get-pssnapin $snapin -registered -ea "silentlycontinue")
{
Add-PSSnapin $snapin
Write-Host "$snapin is now loaded."
}
else
{
write-host "PSSnapin $snapin not found" -foregroundcolor Red
}
}
}
#############################
# START SCRIPT
#############################
$started = Get-Date
#Load Requested Snapins
LoadSnapins
# Initialize Connection for Storage Center
#$pass = Read-Host -AsSecureString -Prompt "Please provide the Storage Center password for $user"
$securepass = ConvertTo-SecureString $pass -AsPlainText -Force
$connection = Get-SCConnection -HostName $schost -User $user -Password $securepass -Save $schost -Default
# Create new Volume Folder if it doesn't exist
$volumefolder = Get-SCVolumeFolder -Name $SCParentFolderName
if($volumefolder -eq $null)
{
Write-Output "Creating new volume folder: $SCParentFolderName..."
$volumefolder = New-SCVolumeFolder -Name $SCParentFolderName;
}
# Get server information for the server that we are mapping all of the volumes to
$scserver = Get-SCServer -Name $ServerName
# Create New Mount Point Volumes for database and logs (if requested)
if($createMountpointRoot -eq $true)
{
CreateVolume "$ServerName-Exchange-MP" "1G" $dbRootDrive $dbDiskFolder $false
}
# Reset counters
$dbcount = 1
# Loop through total amount of databases for the server
do
{
CreateVolume "$ServerName-DB$dbcount" $dbsize $dbmproot $dbDiskFolder $true
"Creating mailbox database in Exchange 2010..."
New-MailboxDatabase -Server $ServerName -Name "$ServerName-DB$dbcount" -EdbFilePath "$dbmproot\$ServerName-DB$dbcount\$ServerName-DB$dbcount.edb" -LogFolderPath "$dbmproot\$ServerName-DB$dbcount\Logs\"
"Mounting new mailbox database..."
Mount-Database -Identity "$ServerName-DB$dbcount"
$dbcount ++
}
until($dbcount -eq $dbtotal + 1)
# Complete!
$ended = Get-Date
Write-Output "Volume Creation Complete!"
Write-Output "Started: $started"
Write-Output "Finished: $ended"
#############################
# END SCRIPT
#############################