зеркало из https://github.com/microsoft/MSLab.git
369 строки
14 KiB
PowerShell
369 строки
14 KiB
PowerShell
# Verify Running as Admin
|
|
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
|
|
If (-not $isAdmin) {
|
|
Write-Host "-- Restarting as Administrator" -ForegroundColor Cyan ; Start-Sleep -Seconds 1
|
|
|
|
if($PSVersionTable.PSEdition -eq "Core") {
|
|
Start-Process pwsh.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
|
|
} else {
|
|
Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs
|
|
}
|
|
|
|
exit
|
|
}
|
|
|
|
#region Functions
|
|
|
|
function WriteInfo($message){
|
|
Write-Host $message
|
|
}
|
|
|
|
function WriteInfoHighlighted($message){
|
|
Write-Host $message -ForegroundColor Cyan
|
|
}
|
|
|
|
function WriteSuccess($message){
|
|
Write-Host $message -ForegroundColor Green
|
|
}
|
|
|
|
function WriteError($message){
|
|
Write-Host $message -ForegroundColor Red
|
|
}
|
|
|
|
function WriteErrorAndExit($message){
|
|
Write-Host $message -ForegroundColor Red
|
|
Write-Host "Press enter to continue ..."
|
|
Read-Host | Out-Null
|
|
Exit
|
|
}
|
|
|
|
#endregion
|
|
|
|
$mslabVersion = "dev"
|
|
|
|
#region download convert-windowsimage if needed and load it
|
|
$convertWindowsImagePath = "$PSScriptRoot\Convert-WindowsImage.ps1"
|
|
if (-not (Test-Path -Path $convertWindowsImagePath)) {
|
|
WriteInfo "`t Downloading Convert-WindowsImage"
|
|
try {
|
|
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/microsoft/MSLab/releases/download/$mslabVersion/Convert-WindowsImage.ps1" -OutFile $convertWindowsImagePath
|
|
} catch {
|
|
try {
|
|
WriteInfo "Download Convert-windowsimage.ps1 from releases ($mslabVersion) failed with $($_.Exception.Message), trying master branch now"
|
|
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/microsoft/MSLab/master/Tools/Convert-WindowsImage.ps1" -OutFile $convertWindowsImagePath
|
|
} catch {
|
|
WriteError "`t Failed to download Convert-WindowsImage.ps1!"
|
|
}
|
|
}
|
|
}
|
|
|
|
#load convert-windowsimage
|
|
. "$PSScriptRoot\Convert-WindowsImage.ps1"
|
|
|
|
#endregion
|
|
|
|
#region Ask for ISO
|
|
WriteInfoHighlighted "Please select ISO image"
|
|
[reflection.assembly]::loadwithpartialname("System.Windows.Forms")
|
|
$openFile = New-Object System.Windows.Forms.OpenFileDialog -Property @{
|
|
Title="Please select ISO image"
|
|
}
|
|
$openFile.Filter = "iso files (*.iso)|*.iso|All files (*.*)|*.*"
|
|
If($openFile.ShowDialog() -eq "OK"){
|
|
WriteInfo "File $($openfile.FileName) selected"
|
|
}
|
|
if (!$openFile.FileName){
|
|
WriteErrorAndExit "Iso was not selected... Exitting"
|
|
}
|
|
$ISO = Mount-DiskImage -ImagePath $openFile.FileName -PassThru
|
|
$ISOMediaPath = (Get-Volume -DiskImage $ISO).DriveLetter+':'
|
|
if (-not (Test-Path -Path $ISOMediaPath\sources\install.wim)){
|
|
$ISO | Dismount-DiskImage
|
|
WriteErrorAndExit "ISO does not contain install.wim. Exitting"
|
|
}
|
|
#endregion
|
|
|
|
#region ask for MSU packages
|
|
WriteInfoHighlighted "Please select msu packages you want to add to image. Click cancel if you don't want any."
|
|
[reflection.assembly]::loadwithpartialname("System.Windows.Forms")
|
|
$msupackages = New-Object System.Windows.Forms.OpenFileDialog -Property @{
|
|
Multiselect = $true;
|
|
Title="Please select msu packages you want to add to image. Click cancel if you don't want any."
|
|
}
|
|
$msupackages.Filter = "msu files (*.msu)|*.msu|All files (*.*)|*.*"
|
|
If($msupackages.ShowDialog() -eq "OK"){
|
|
WriteInfoHighlighted "Following patches selected:"
|
|
foreach ($filename in $msupackages.FileNames){
|
|
WriteInfo "`t $filename"
|
|
}
|
|
}
|
|
|
|
#Write info if nothing is selected
|
|
if (!$msupackages.FileNames){
|
|
WriteInfoHighlighted "No msu was selected..."
|
|
}
|
|
|
|
#sort packages by size (to apply Servicing Stack Update first)
|
|
if ($msupackages.Filenames){
|
|
$files=@()
|
|
foreach ($Filename in $msupackages.FileNames){$files+=Get-ChildItem -Path $filename}
|
|
$packages=($files |Sort-Object -Property Length).Fullname
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region do the job
|
|
$BuildNumber=(Get-ItemProperty -Path "$ISOMediaPath\setup.exe").versioninfo.FileBuildPart
|
|
|
|
if ($BuildNumber -eq 14393){
|
|
$NanoServer=(Read-Host -Prompt "Server 2016 ISO Selected. Do you want to build NanoServer? Y/N")
|
|
}
|
|
|
|
if ($Nanoserver -eq "Y"){
|
|
$WindowsImage=Get-WindowsImage -ImagePath "$ISOMediaPath\NanoServer\NanoServer.wim"
|
|
|
|
#ask for edition
|
|
WriteInfoHighlighted "Please select Nano Server edition"
|
|
$Edition=($WindowsImage | Out-GridView -OutputMode Single -Title "Please select Edition").ImageName
|
|
if (-not ($Edition)){
|
|
$ISO | Dismount-DiskImage
|
|
WriteErrorAndExit "Edition not selected. Exitting "
|
|
}
|
|
#grab Nano packages
|
|
$nanocabs="Microsoft-NanoServer-DSC-Package","Microsoft-NanoServer-FailoverCluster-Package","Microsoft-NanoServer-Guest-Package","Microsoft-NanoServer-Storage-Package","Microsoft-NanoServer-SCVMM-Package","Microsoft-NanoServer-Compute-Package","Microsoft-NanoServer-SCVMM-Compute-Package","Microsoft-NanoServer-SecureStartup-Package","Microsoft-NanoServer-DCB-Package","Microsoft-NanoServer-ShieldedVM-Package"
|
|
$NanoPackages=@()
|
|
foreach ($NanoPackage in $nanocabs){
|
|
$NanoPackages+=(Get-ChildItem -Path "$ISOMediaPath\NanoServer\Packages" -Recurse | Where-Object Name -like $NanoPackage*).FullName
|
|
}
|
|
|
|
#create temp name
|
|
$tempvhdname="Win2016NanoHV_G2.vhdx"
|
|
|
|
}else{
|
|
$WindowsImage=Get-WindowsImage -ImagePath "$ISOMediaPath\sources\install.wim"
|
|
if ($BuildNumber -lt 7600){
|
|
if ($ISO -ne $Null){
|
|
$ISO | Dismount-DiskImage
|
|
}
|
|
WriteErrorAndExit "`t Use Windows 7 or newer!"
|
|
}
|
|
|
|
#ask for edition if more than 1
|
|
if ($windowsimage.count -gt 1){
|
|
$Edition=($WindowsImage | Out-GridView -OutputMode Single).ImageName
|
|
if (-not ($Edition)){
|
|
$ISO | Dismount-DiskImage
|
|
WriteErrorAndExit "Edition not selected. Exitting "
|
|
}
|
|
}else{
|
|
$edition = $windowsimage.ImageName
|
|
}
|
|
|
|
#Generate vhdx name
|
|
if ($edition -like "*Azure Stack HCI*"){
|
|
$tempvhdname = switch ($BuildNumber){
|
|
17784 {
|
|
"AzSHCI20H2_G2.vhdx"
|
|
}
|
|
20348 {
|
|
"AzSHCI21H2_G2.vhdx"
|
|
}
|
|
20349 {
|
|
"AzSHCI22H2_G2.vhdx"
|
|
}
|
|
25398 {
|
|
"AzSHCI23H2_G2.vhdx"
|
|
}
|
|
26100 {
|
|
"AzSHCI24H2_G2.vhdx"
|
|
}
|
|
}
|
|
if ($BuildNumber -GT 26100){
|
|
$tempvhdname="AzSHCIInsider_$BuildNumber.vhdx"
|
|
}
|
|
}elseif (($Edition -like "*Server*Core*") -or ($Edition -like "Windows Server * Datacenter") -or ($Edition -like "Windows Server * Standard")){
|
|
$tempvhdname = switch ($BuildNumber){
|
|
7600 {
|
|
"Win2008R2Core_G1.vhdx"
|
|
}
|
|
7601 {
|
|
"Win2008R2SP1Core_G1.vhdx"
|
|
}
|
|
9200 {
|
|
"Win2012Core_G2.vhdx"
|
|
}
|
|
9600 {
|
|
"Win2012R2Core_G2.vhdx"
|
|
}
|
|
14393 {
|
|
"Win2016Core_G2.vhdx"
|
|
}
|
|
16299 {
|
|
"WinServer1709_G2.vhdx"
|
|
}
|
|
17134 {
|
|
"WinServer1803_G2.vhdx"
|
|
}
|
|
17763 {
|
|
"Win2019Core_G2.vhdx"
|
|
}
|
|
18362 {
|
|
"WinServer1903_G2.vhdx"
|
|
}
|
|
18363 {
|
|
"WinServer1909_G2.vhdx"
|
|
}
|
|
19041 {
|
|
"WinServer20H1_G2.vhdx"
|
|
}
|
|
20348 {
|
|
"Win2022Core_G2.vhdx"
|
|
}
|
|
26100 {
|
|
"Win2025Core_G2.vhdx"
|
|
}
|
|
}
|
|
if ($BuildNumber -gt 26100){
|
|
$tempvhdname="WinSrvInsiderCore_$BuildNumber.vhdx"
|
|
}
|
|
}elseif($Edition -like "Hyper-V*"){
|
|
$tempvhdname = switch ($BuildNumber){
|
|
9200 {
|
|
"HVServer2012_G2.vhdx"
|
|
}
|
|
9600 {
|
|
"HVServer2012R2_G2.vhdx"
|
|
}
|
|
14393 {
|
|
"HVServer2016_G2.vhdx"
|
|
}
|
|
17763 {
|
|
"HVServer2019_G2.vhdx"
|
|
}
|
|
}
|
|
}elseif($Edition -like "*Server*"){
|
|
$tempvhdname = switch ($BuildNumber){
|
|
7600 {
|
|
"Win2008R2_G1.vhdx"
|
|
}
|
|
7601 {
|
|
"Win2008R2SP1_G1.vhdx"
|
|
}
|
|
9200 {
|
|
"Win2012_G2.vhdx"
|
|
}
|
|
9600 {
|
|
"Win2012R2_G2.vhdx"
|
|
}
|
|
14393 {
|
|
"Win2016_G2.vhdx"
|
|
}
|
|
17763 {
|
|
"Win2019_G2.vhdx"
|
|
}
|
|
20348 {
|
|
"Win2022_G2.vhdx"
|
|
}
|
|
26100 {
|
|
"Win2025_G2.vhdx"
|
|
}
|
|
}
|
|
if ($BuildNumber -GT 26100){
|
|
$tempvhdname="WinSrvInsider_$BuildNumber.vhdx"
|
|
}
|
|
}else{
|
|
$tempvhdname = switch ($BuildNumber){
|
|
7600 {
|
|
"Win7_G1.vhdx"
|
|
}
|
|
7601 {
|
|
"Win7SP1_G1.vhdx"
|
|
}
|
|
9200 {
|
|
"Win8_G2.vhdx"
|
|
}
|
|
9600 {
|
|
"Win8.1_G2.vhdx"
|
|
}
|
|
10240 {
|
|
"Win10TH1_G2.vhdx"
|
|
}
|
|
10586 {
|
|
"Win10TH2_G2.vhdx"
|
|
}
|
|
14393 {
|
|
"Win10RS1_G2.vhdx"
|
|
}
|
|
15064 {
|
|
"Win10RS2_G2.vhdx"
|
|
}
|
|
16299 {
|
|
"Win10RS3_G2.vhdx"
|
|
}
|
|
17134 {
|
|
"Win10RS4_G2.vhdx"
|
|
}
|
|
17763 {
|
|
"Win10RS5_G2.vhdx"
|
|
}
|
|
18362 {
|
|
"Win1019H1_G2.vhdx"
|
|
}
|
|
18363 {
|
|
"Win1019H2_G2.vhdx"
|
|
}
|
|
19041 {
|
|
"Win1020H1_G2.vhdx"
|
|
}
|
|
22000 {
|
|
"Win1121H2_G2.vhdx"
|
|
}
|
|
22621 {
|
|
"Win1122H2_G2.vhdx"
|
|
}
|
|
26100 {
|
|
"Win1124H2_G2.vhdx"
|
|
}
|
|
}
|
|
if ($BuildNumber -GT 26100){
|
|
$tempvhdname="Win11Insider_$BuildNumber.vhdx"
|
|
}
|
|
}
|
|
}
|
|
|
|
#ask for imagename
|
|
$vhdname=(Read-Host -Prompt "Please type VHD name (if nothing specified, $tempvhdname is used")
|
|
if(!$vhdname){$vhdname=$tempvhdname}
|
|
|
|
#ask for size
|
|
[int64]$size=(Read-Host -Prompt "Please type size of the Image in GB. If nothing specified, 127 is used")
|
|
$size=$size*1GB
|
|
if (!$size){$size=127GB}
|
|
|
|
#Create VHD
|
|
if ($nanoserver -eq "y"){
|
|
Convert-WindowsImage -SourcePath "$ISOMediaPath\NanoServer\NanoServer.wim" -Edition $Edition -VHDPath "$PSScriptRoot\$vhdname" -SizeBytes $size -VHDFormat VHDX -DiskLayout UEFI -Package ($packages+$NanoPackages)
|
|
}else{
|
|
if ($packages){
|
|
if ($BuildNumber -le 7601){
|
|
Convert-WindowsImage -SourcePath "$ISOMediaPath\sources\install.wim" -Edition $Edition -VHDPath "$PSScriptRoot\$vhdname" -SizeBytes $size -VHDFormat VHDX -DiskLayout BIOS -Package $packages
|
|
}else{
|
|
Convert-WindowsImage -SourcePath "$ISOMediaPath\sources\install.wim" -Edition $Edition -VHDPath "$PSScriptRoot\$vhdname" -SizeBytes $size -VHDFormat VHDX -DiskLayout UEFI -Package $packages
|
|
}
|
|
}else{
|
|
if ($BuildNumber -le 7601){
|
|
Convert-WindowsImage -SourcePath "$ISOMediaPath\sources\install.wim" -Edition $Edition -VHDPath "$PSScriptRoot\$vhdname" -SizeBytes $size -VHDFormat VHDX -DiskLayout BIOS
|
|
}else{
|
|
Convert-WindowsImage -SourcePath "$ISOMediaPath\sources\install.wim" -Edition $Edition -VHDPath "$PSScriptRoot\$vhdname" -SizeBytes $size -VHDFormat VHDX -DiskLayout UEFI
|
|
}
|
|
}
|
|
}
|
|
|
|
WriteInfo "Dismounting ISO Image"
|
|
if ($ISO -ne $Null){
|
|
$ISO | Dismount-DiskImage
|
|
}
|
|
|
|
WriteSuccess "Job Done. Press enter to continue..."
|
|
Read-Host | Out-Null
|
|
#endregion |