Wednesday 23 January 2013

Configure-DC1-1.ps1

  1. # Configure-DC1-1.ps1
  2. # Converts Server to DC
  3. # Version 1.0.0 - 14 Jan 2013
  4. # See http://tfl09.blogspot.com for more details
  5. # Config script block
  6. $conf = {
  7. # Install the AD - the reboot is or should be automagic
  8. Install-Windowsfeature AD-Domain-Services -IncludeManagementTools
  9. # Now install the AD to DC1
  10. $PasswordSS = ConvertTo-SecureString -string 'Pa$$w0rd' -AsPlainText -Force
  11. Install-ADDSForest -DomainName Reskit.Org -SafeModeAdministratorPassword $PasswordSS -force -InstallDNS -DomainMode Win2012 -ForestMode Win2012
  12. }
  13. # Here is start of script
  14. $Username = "DC1\administrator"
  15. $PasswordSS = ConvertTo-SecureString 'Pa$$w0rd' -AsPlainText -Force
  16. $Creddc1 = New-Object system.management.Automation.PSCredential $username,$PasswordSS
  17. # First, run a simple script block to check that the server is actually running and is the one we think it is
  18. Invoke-Command -ComputerName DC1 -ScriptBlock { ipconfig;hostname} -Credential $Creddc1 -verbose
  19. Pause
  20. # Now add create our forest/domain/dc
  21. Invoke-Command -ComputerName DC1 -Scriptblock $conf -Credential $Creddc1 -verbose
Technorati Tags: ,,,

Monday 21 January 2013

Create-VM.PS1

  1. # Create-VM.ps1 
  2. # Script that creates VMs 
  3. # Version 1.0.0 - 20 Jan 2013 
  4. # See http://tfl09.blogspot.co.uk/2013/01/building-hyper-v-test-lab-on-windows-8.html 
  5.  
  6. # First define the Create-VM Function 
  7.  
  8. Function Create-VM { 
  9. #=================================================== 
  10. # Create a New VM 
  11. #=================================================== 
  12.  
  13. # Parameters are Name, Virtual Machine Path, path to reference Vhdx,
  14. # network switch to use, VM Memory, Unattend file, IP address and DNS
  15. # Server to set. Default values are specified in the Param block,
  16. # but these are normally overridden in the call to Create0VM 
  17.  
  18.  
  19. [Cmdletbinding()] 
  20. Param (  
  21.  $Name         = "Server"
  22.  $VmPath       = "C:\v3"
  23.  $ReferenceVHD = "C:\v3\Ref2012.vhdx"
  24.  $Network      = "Internal"
  25.  $VMMemory     = 512mb, 
  26.  $UnattendXML  = "C:\v3\unattend.xml"
  27.  $IPAddr       = '10.0.0.250/24'
  28.  $DnsSvr       = '10.0.0.10' 
  29.  
  30. $Starttime = Get-Date 
  31. Write-Verbose "Starting Create-VM at $Starttime" 
  32. Write-verbose "Creating VM: [$name]" 
  33. Write-verbose "Path to VM : [$VMpath]" 
  34.  
  35. #    Set path to differencing disk location 
  36. $path = "$vmpath\$name.vhdx" 
  37. Write-Verbose "Creating Disk at [$path]" 
  38.  
  39. #    Add a new differencing VHDX, Based on parent parent 
  40. $vmDisk01 = New-VHD –Path $path -Differencing –ParentPath $ReferenceVHD -ErrorAction Stop 
  41. Write-Verbose "Added VM Disk [$VMdisk01], pointing to [ReferenceVHD]" 
  42.  
  43. #    Create a New VM 
  44. $VM = New-VM –Name $name –MemoryStartupBytes $VMMemory –VHDPath $VMDisk01.path -SwitchName $Network -Path $vmPath 
  45. Write-Verbose "VM [$name] created" 
  46.  
  47. # Mount the Disk into the VM 
  48. Mount-DiskImage -ImagePath $path 
  49. $VHDDisk = Get-DiskImage -ImagePath $path | Get-Disk 
  50. $VHDPart = Get-Partition -DiskNumber $VHDDisk.Number 
  51. $VHDVolumeName = [string]$VHDPart.DriveLetter 
  52. $VHDVolume = [string]$VHDPart.DriveLetter + ":" 
  53. Write-verbose "Volume [$Volumename] created in VM [$name]" 
  54.  
  55.  
  56. #    Get Unattended.XML file 
  57. Write-Verbose "Using Unattended XML file [$unattendXML]" 
  58.  
  59. #    Open XML file 
  60. $Xml = [xml](get-content $UnattendXML
  61.  
  62. #    Change ComputerName 
  63. Write-Verbose "Setting VM ComputerName to: [$name]" 
  64. $Xml.unattend.settings.component | Where-Object { $_.Name -eq "Microsoft-Windows-Shell-Setup" } | 
  65.  ForEach-Object
  66.    if($_.ComputerName) { 
  67.      $_.ComputerName = $name 
  68.    } 
  69.  
  70. #    Change IP address 
  71. Write-Verbose "Setting VM ComputerName to: [$name]" 
  72. $Xml.unattend.settings.component | Where-Object { $_.Name -eq "Microsoft-Windows-TCPIP" } | 
  73.   ForEach-Object
  74.  
  75.     if($_.Interfaces) { 
  76.       $ht='#text' 
  77.       $_.interfaces.interface.unicastIPaddresses.ipaddress.$ht = $IPAddr 
  78.   } 
  79.  
  80. #    Change DNS Server address 
  81. #    Use obscure way to create the #TEXT node 
  82. Write-Verbose "Setting VM DNS address to: [$DNSSvr]" 
  83. $Xml.Unattend.Settings.Component | Where-Object { $_.Name -eq "Microsoft-Windows-DNS-Client" } | 
  84.   ForEach-Object
  85.       if($_.Interfaces) { 
  86.       $ht='#text' 
  87.       $_.Interfaces.Interface.DNSServerSearchOrder.Ipaddress.$ht = $DNSSvr 
  88.   } 
  89.  
  90. #    Save XML File on Mounted VHDX differencing disk 
  91. $xml.Save("$VHDVolume\Unattend.XML"
  92. Write-Verbose "Unattended XML file saved to vhd [$vhdvolume\unattend.xml]" 
  93.  
  94. #    Dismount VHDX  
  95. Write-Verbose "Dismounting disk image: [$Path]" 
  96. Dismount-DiskImage -ImagePath $path 
  97.  
  98. #    Update additional VM settings 
  99. Write-Verbose 'Setting additional VM settings' 
  100. Set-VM -Name $name -DynamicMemory 
  101. Set-VM -Name $name -MemoryMinimumBytes $VMMemory 
  102. Set-VM -Name $name -AutomaticStartAction Nothing 
  103. Set-Vm -Name $name -AutomaticStopAction ShutDown 
  104.  
  105. #    Show what has been created! 
  106. "VM Created:" 
  107. Get-VM -Name $name | fl * 
  108.  
  109. #    Start VM 
  110. Write-verbose "VM [$Name] being started" 
  111. Start-VM -Name $name 
  112.  
  113. #    Now work out and write how long it took to create the VM 
  114. $Finishtime = Get-Date 
  115. Write-Verbose ("Creating VB ($name) took {0} seconds" -f ($FinishTime - $Starttime).totalseconds) 
  116. # End of Create-VM function 
  117.  
  118.  
  119. ####################################################################################################### 
  120. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  121. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  122. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  123.  
  124. # Location of Server 2012 DVD Iso Image 
  125. $iso   = 'c:\Builds\9200.16384.120725-1247_x64frev_Server_Datacenter_VL_HRM_SSS_X64FREV_EN-US_DVD.iso' 
  126. # Where we put the reference VHDX 
  127. $ref   = 'c:\v3\Ref2012.vhdx' 
  128. # Path were VMs, VHDXs and unattend.txt files live 
  129. $path  = 'c:\V3' 
  130. # Location of Unattend.xml - first for workstation systems, second for domain joined systems  
  131. $una   = 'c:\V3\UnAttend.xml' 
  132. $unadj = 'c:\V3\UnAttend.dj.xml' 
  133.  
  134. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  135. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  136. #       CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS     # 
  137. ####################################################################################################### 
  138.  
  139. #   Now run the script to create the VMs as appropriate. 
  140. $Start = Get-Date 
  141. "Create-VM --- Started at: $Start" 
  142.  
  143. #################################################################### 
  144. # Comment out VMs you do NOT want to create then run the entire script 
  145. # To comment out a VM creation, just add a '#" at the start of the line.  
  146. #        Removing the comment line means you want to create that VM.  
  147. #        BE creful!  If you make a mistake, stop the script. Kill any VMs created, then remove the 
  148. #        storage for the VMs.  
  149. ####################################################################################################### 
  150.  
  151. #    Create the DC - NON-domained joined 
  152. # Create-VM -name "DC1"  -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $una -Verbose -IPAddr '10.0.0.10/24' -DNSSvr 10.0.0.10  -VMMemory 1gb 
  153.  
  154. #    Remaining VMs use the domain-join version of unattend.xml 
  155. # Create-VM -name "Srv1"  -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.30/24' -DNSSvr 10.0.0.10  -VMMemory 512mb 
  156. # Create-VM -name "Srv2"  -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.31/24' -DNSSvr 10.0.0.10  -VMMemory 512mb 
  157. # Create-VM -name "Sql1"  -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.20/24' -DNSSvr 10.0.0.10  -VMMemory 768mb 
  158. # Create-VM -name "Exch1" -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.21/24' -DNSSvr 10.0.0.10  -VMMemory 768mb 
  159.  
  160. #    DHCP 1,2 for advanced networking class 
  161. # Create-VM -name "DHCP1" -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.51/24' -DNSSvr 10.0.0.10 -VMMemory 512mb 
  162. # Create-VM -name "DHCP2" -VmPath $path -ReferenceVHD $ref -Network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.52/24' -DNSSvr 10.0.0.10 -VMMemory 512mb 
  163.  
  164. #    Create a second DC for reskit.org for advanced class 
  165. # Create-VM -name "DC2"  -vmPath $path -ReferenceVHD $ref -network "Internal" -UnattendXML $unadj -Verbose -IPAddr '10.0.0.11/24' -DNSSvr 10.0.0.10  -VMMemory 512mb 
  166.  
  167.  
  168. #  script is all done - just say nice things and quit. 
  169. $Finish = Get-Date 
  170. "Create-VM --- Finished at: $Finish" 
  171. "Elapsed Time :  $(($Finish-$Start).totalseconds) seconds" 
  172.   
Technorati Tags: ,,,

Sunday 20 January 2013

Open-FunctionInISE

  1. Function Open-FunctioninISE {
  2. <#
  3. .SYNOPSIS
  4. Opens a function in ISE
  5. .DESCRIPTION
  6.     This enables you to specify the function to open. The definition
  7.     comes from (Get-Command <command>).definition.
  8.     You specify the name of the function to open, or select it
  9.     in the ISE
  10. .NOTES
  11.     File Name : Open-FunctionInIse.ps1
  12.     Author : Thomas Lee - tfl@psp.co.uk
  13.     Requires : PowerShell Version 3.0
  14.     Based on a technet script published at http://gallery.technet.microsoft.com/scriptcenter/Open-defined-functions-in-22788d0f 
  15. .LINK
  16.     This script posted to:
  17.         http://www.pshscripts.blogspot.com
  18. .PARAMETER Function
  19.     The name of a defined function to open in new PowerShell ISE tab.
  20. .EXAMPLE
  21.     C:\Psh> Open-FunctionInIse Open-FunctioninISE
  22.     Opens Open-FunctionInIse in a new PowerShell ISE tab
  23. .EXAMPLE
  24.     Select a function name in an open edit window, then hit
  25.     Ctrl+Shift+E (or use the Add-ons menu)
  26. #>
  27. # Define parameters
  28. [Cmdletbinding()]
  29. Param(
  30. [Parameter(Position=0)]
  31. [ValidateScript({ Get-Command -commandtype function -name $_ })]
  32. [String] $function
  33. )
  34. # Start of the function.
  35. Process{
  36. # Get the function name (i.e. the selected text) and ensure it's not empty
  37. $fn = $psise.currentfile.Editor.selectedText
  38. # if nothing selected, see if we got called with it
  39. If (!$fn -or ($fn.length -LE 0)) {
  40. if ($function -and ($function.length -GT 0)){
  41. $fn = $function}
  42. Else {
  43. $fn = Read-Host -Prompt "Enter function name to view"
  44. }
  45. }
  46. If (!$Fn) {'No function to edit';return}
  47. # Get the definition, if there is one
  48. $definition = (Get-Command -commandtype function -name $fn).definition
  49. If (!$definition -or ($Definition.Length -le 0)) {return "Function [$fn] not found"}
  50. # Create What to see
  51. $FunctionHeader = "Function $fn {`n"
  52. $comments = "`# Description : $($definition.description)`n"
  53. $comments += "`# Module : $($definition.module)`n`n"
  54. $FunctionTrailer = "`n}"
  55. # Wrap it all up
  56. $definition = $functionHeader + $Comments + $Definition + $FunctionTrailer
  57. "function $fn {" + $definition + "}"
  58. # Add a tab, add text to the tab, set caret position to first character
  59. $tab = $Psise.CurrentPowerShellTab.Files.Add()
  60. $tab.Editor.text = $definition
  61. $tab.Editor.SetCaretPosition(1,1)
  62. # Sleep for a moment. Ran into issues without this.
  63. Start-Sleep -Milliseconds 200
  64. } # End process block
  65. } # End Function
  66. Set-ALias OFISE .\Open-FunctionInISE
  67. # Here we could test the function from the command line.
  68. # Function test123 {'testing 1-2-3'}
  69. # Open-FunctioninISE test123
  70. # I assume you'll just use this function so I've left the following
  71. # Code in place to add this as a menu item
  72. # Here add to the ISE as long as it's not there already!
  73. $x = ($psise.CurrentPowerShellTab.AddOnsMenu.Submenus).displayname
  74. if (! ($x -contains "_Edit Function in ISE")) {
  75. $Psise.CurrentPowerShellTab.AddOnsMenu.Submenus.Add("_Edit Function in ISE", {Open-FunctioninISE},
  76. "Ctrl+Shift+E") | Out-Null
  77. }
  78. Else {
  79. 'Function already added in ISE'
  80. }

Tuesday 15 January 2013

Create-ReferenceVHDX.ps1

  1. # Create-ReferenceVHDX.ps1
  2. # Script that will create a reference VHDX for later VM Creation
  3. # Version 1.0.0 - 14 Jan 2013
  4. # Define a function to create a reference VHDX.
  5. Function Create-ReferenceVHDX {
  6. [Cmdletbinding()]
  7. Param (
  8. # ISO of OS
  9. [string] $Iso = 'C:\downloads\9200.16384.120725-1247_x64frev_Server_Datacenter_VL_HRM_SSS_X64FREV_EN-US_DVD.iso',
  10. # Path to reference VHD
  11. [string] $RefVHDXPath = "C:\vhd\Ref2012.vhdx"
  12. )
  13. # Get start time
  14. $StartTime = Get-Date
  15. Write-Verbose "Beginning at $StartTime"
  16. #--------------------------------------------------+
  17. # Mount an ISO and check out available OS versions!
  18. #--------------------------------------------------+
  19. # Import the DISM module
  20. Write-Verbose 'Loading DISM module' -Verbose:$false
  21. Import-Module -Name DISM -Verbose:$False
  22. # Mount the OS ISO image onto the local machine
  23. Write-Verbose "Mounting ISO image [$iso]"
  24. Mount-DiskImage -ImagePath $iso
  25. # Get the Volume the Image is mounted to
  26. Write-Verbose 'Getting disk image of the ISO'
  27. $ISOImage = Get-DiskImage -ImagePath $ISO | Get-Volume
  28. Write-Verbose "Got disk image [$($ISOImage.DriveLetter)]"
  29. # And get the drive Letter of the dirve where the image is mounted
  30. # add the drive letter separator (:)
  31. $ISODrive = [string]$ISOImage.DriveLetter+":"
  32. Write-Verbose "OS ISO mounted on drive letter [$ISODrive]"
  33. # Next we will get the installation versions from the install.wim.
  34. # $Indexlist is the index of WIMs on the DVD - display the versions
  35. # available in the DVD and let user select the one to serve as the base
  36. # image - probably DataCentre Full Install
  37. $IndexList = Get-WindowsImage -ImagePath $ISODrive\sources\install.wim
  38. Write-Verbose 'Got Index list - displaying it now!'
  39. # Display the list and return the index
  40. $item = $IndexList | Out-GridView -OutputMode Single
  41. $index = $item.ImageIndex
  42. Write-Verbose "Selected image index [$index]"
  43. #---------------------------------+
  44. # Create a Reference Image !
  45. #---------------------------------+
  46. # Create the VHDX for the reference image
  47. $VMDisk01 = New-VHD –Path $RefVHDXPath -SizeBytes 15GB
  48. Write-Verbose "Created VHDX File [$($vmdisk01.path)]"
  49. # Get the disk number
  50. Mount-DiskImage -ImagePath $RefVHDXPath
  51. $VHDDisk = Get-DiskImage -ImagePath $RefVHDXPath | Get-Disk
  52. $VHDDiskNumber = [string]$VHDDisk.Number
  53. Write-Verbose "IReference image is on disk number [$VhddiskNumber]"
  54. # Create a New Partition
  55. Initialize-Disk -Number $VHDDiskNumber -PartitionStyle MBR
  56. $VHDDrive = New-Partition -DiskNumber $VHDDiskNumber -UseMaximumSize -AssignDriveLetter -IsActive | Format-Volume -Confirm:$false
  57. $VHDVolume = [string]$VHDDrive.DriveLetter+":"
  58. Write-Verbose "VHD drive [$vhddrive], Vhd volume [$vhdvolume]"
  59. # Execute DISM to apply image to base disk
  60. Write-Verbose 'Using DISM to apply image to the volume'
  61. Write-Verbose 'This will take some time'
  62. Dism.exe /apply-Image /ImageFile:$ISODrive\Sources\install.wim /index:$Index /ApplyDir:$VHDVolume\
  63. # Execute BCDBoot so volume will boot
  64. Write-Verbose 'Setting BCDBoot'
  65. BCDBoot.exe $VHDVolume\Windows /s $VHDVolume /f BIOS
  66. # Dismount the Images
  67. Write-Verbose "Dismounting ISO and new disk"
  68. Dismount-DiskImage -ImagePath $ISO
  69. Dismount-DiskImage -ImagePath $RefVHDXPath
  70. Write-Verbose "Created Reference Disk [$RefVHDXPath]"
  71. Get-ChildItem $RefVHDXPath
  72. $FinishTime = Get-Date
  73. $tt= $FinishTime - $StartTime
  74. Write-Verbose "Finishing at $FinishTime"
  75. Write-verbose "Creating base image took [$($tt.totalminutes)] minutes"
  76. } # End of Create-ReferenceVHDX
  77. ################################################################################################################
  78. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  79. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  80. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  81. # Path to Server 2012 DVD
  82. $iso = 'C:\Builds\9200.16384.120725-1247_x64frev_Server_Datacenter_VL_HRM_SSS_X64FREV_EN-US_DVD.iso'
  83. # PathTo the reference VDHX is to go
  84. $refvhdxpath = 'C:\V3\ref2012.vhdx'
  85. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  86. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  87. # CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS ===== CHECK THESE PATHS #
  88. #################################################################################################################
  89. Create-ReferenceVHDX -iso $iso -RefVHDXPath $RefVHDXPath -Verbose