Skip to content

Instantly share code, notes, and snippets.

@pkirch
Created May 3, 2015 12:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pkirch/b81e6a45057cc96dd85e to your computer and use it in GitHub Desktop.
Save pkirch/b81e6a45057cc96dd85e to your computer and use it in GitHub Desktop.
# Microsoft Virtual Academy
# Automatisierte Konfiguration in Azure im Überblick
# 301 - http://aka.ms/mva-1505-301
param($name, $number)
Write-Output "Name: $name"
Write-Output "Number: $number"
$features = Get-WindowsFeature
$processes = Get-Process
New-Object PSObject -Property @{
Features = $features
Processes = $processes
Name = $name
Number = $number
}
# Microsoft Virtual Academy
# Automatisierte Konfiguration in Azure im Überblick
# 301 - http://aka.ms/mva-1505-301
param($adminPassword, $domainName, $domainNetbiosName)
Add-WindowsFeature AD-Domain-Services
# Save secure string with password.
$securePassword = ConvertTo-SecureString -String $adminPassword -AsPlainText -Force
#
# Windows PowerShell script for AD DS Deployment
#
Import-Module ADDSDeployment
Install-ADDSForest `
-CreateDnsDelegation:$false `
-DatabasePath "C:\Windows\NTDS" `
-DomainMode "Win2012R2" `
-DomainName $domainName `
-DomainNetbiosName $domainNetbiosName `
-ForestMode "Win2012R2" `
-InstallDns:$true `
-LogPath "C:\Windows\NTDS" `
-NoRebootOnCompletion:$false `
-SysvolPath "C:\Windows\SYSVOL" `
-Force:$true `
-SafeModeAdministratorPassword:$securePassword
Add-WindowsFeature -Name Web-Server, Web-Windows-Auth, Web-Mgmt-Tools
Set-WebConfigurationProperty -Filter system.webServer/security/authentication/anonymousAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value False
Set-WebConfigurationProperty -Filter system.webServer/security/authentication/windowsAuthentication -PSPath "IIS:\Sites" -Location "Default Web Site" -Name Enabled -Value True
# Microsoft Virtual Academy
# Automatisierte Konfiguration in Azure im Überblick
# 301 - http://aka.ms/mva-1505-301
#region create VM
# Settings
$subscriptionName = "MSFT MVA Live" # Get-AzureSubscription
$location = "West Europe" # Get-AzureLocation
$serviceName = "mvaconfig301"
$storageAccountName = $serviceName
$adminUsername = "adm_demo"
$adminPassword = "Azureisttoll!"
$imageFamily = "Windows Server 2012 R2 Datacenter"
$vmName = $serviceName
$instanceSize = "Medium" # Get-AzureRoleSize
# In case you have more than one Azure subscription, select one.
Select-AzureSubscription -SubscriptionName $subscriptionName
# Get latest image for defined image family.
# MVA03-Images.ps1 / https://gist.github.com/pkirch/058d757a799fa0087241
$imageName = Get-AzureVMImage |
Where-Object -Property ImageFamily -eq $imageFamily |
Sort-Object -Property PublishedDate -Descending |
Select-Object -ExpandProperty ImageName -First 1
# Create storage account and set is as current.
New-AzureStorageAccount -Location $location -StorageAccountName $storageAccountName -Type Standard_LRS
Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccountName
# Create new VM configuration, add provisioning data to it, and start it.
New-AzureVMConfig -ImageName $imageName -InstanceSize $instanceSize -Name $vmName |
Add-AzureProvisioningConfig -Windows -AdminUsername $adminUsername -Password $adminPassword |
Add-AzureEndpoint -LocalPort 80 -Name HTTP -Protocol tcp -PublicPort 80 |
New-AzureVM -ServiceName $serviceName -Location $location
#endregion
#region Run simple custom script via Azure Extensions
$containerExt = "extensions"
# Create destination container in storage if it does not exist.
$containerList = Get-AzureStorageContainer -Name $containerExt -ErrorAction Ignore # Ignore error if container not found.
if ($containerList.Length -eq 0) {
New-AzureStorageContainer -Name $containerExt -Permission Off
}
$fileCustomScriptExtension = New-Object System.IO.FileInfo ("C:\Users\pkirch\OneDrive @ Microsoft\FY15\Content\2015-02-28 MVA Deployments\3 Extensions\CS-ArgumentsSample.ps1")
# Upload PowerShell file
Set-AzureStorageBlobContent -Container $containerExt -File $fileCustomScriptExtension.FullName -Force
# Inject custom script..
Get-AzureVM -ServiceName $serviceName -Name $vmName |
Set-AzureVMCustomScriptExtension -ContainerName $containerExt -FileName $fileCustomScriptExtension.Name -Argument "-number 42 -name $serviceName" |
Update-AzureVM
$vm = Get-AzureVM -ServiceName $serviceName -Name $vmName
$vm.ResourceExtensionStatusList
$scriptExt = $vm.ResourceExtensionStatusList | Where-Object -Property HandlerName -eq "Microsoft.Compute.CustomScriptExtension"
$scriptExt
$scriptExt.ExtensionSettingStatus
$scriptExt.ExtensionSettingStatus.SubStatusList.FormattedMessage.Message
$scriptExt.ExtensionSettingStatus.SubStatusList.FormattedMessage.Message.Replace("\n", "`n")
#endregion
#region Run custom script to install ADDS, a forrest, and IIS.
$fileCustomScriptExtension = New-Object System.IO.FileInfo ("C:\Users\pkirch\OneDrive @ Microsoft\FY15\Content\2015-02-28 MVA Deployments\3 Extensions\CS-InstallSample.ps1")
# Upload PowerShell file
Set-AzureStorageBlobContent -Container $containerExt -File $fileCustomScriptExtension.FullName -Force
# Inject custom script: install AD services, forest, and IIS.
Get-AzureVM -ServiceName $serviceName -Name $vmName |
Set-AzureVMCustomScriptExtension `
-ContainerName $containerExt `
-FileName $fileCustomScriptExtension.Name `
-Argument "-adminPassword $adminPassword -domainName $serviceName.cloudapp.net -domainNetbiosName net$vmName" |
Update-AzureVM
do {
Write-Host "Status Check: $(Get-Date -Format G)" -ForegroundColor Green
$vm = Get-AzureVM -ServiceName $serviceName -Name $vmName
$scriptExt = $vm.ResourceExtensionStatusList | Where-Object -Property HandlerName -eq "Microsoft.Compute.CustomScriptExtension"
if ($lastCustomScriptTimestamp -eq $null) {
Write-Host "Wait for new custom script execution." -ForegroundColor Green
$lastCustomScriptTimestamp = $scriptExt.ExtensionSettingStatus.TimestampUtc
} else {
if ($lastCustomScriptTimestamp -lt $scriptExt.ExtensionSettingStatus.TimestampUtc) {
Format-List -InputObject $scriptExt.ExtensionSettingStatus -Property TimestampUtc, Operation, Status, Code
Write-Host "Messages" -ForegroundColor Gray
$scriptExt.ExtensionSettingStatus.SubStatusList.FormattedMessage.Message.Replace("\n", "`n")
}
}
Start-Sleep 30
} until (($lastCustomScriptTimestamp -lt $scriptExt.ExtensionSettingStatus.TimestampUtc) -and ($scriptExt.ExtensionSettingStatus.Operation -eq "Command Execution Finished"))
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment