Category Archives: Azure

Simplifying your life using the AZ-modules in powershell

As of December 2018 there’s a new kid in town helping you out with Azure. The old AzureRM modules will be replaced by the AZ modules to keep consistent with Core and Cloud Shell. The module will also keep your management / development environments consistent over Windows / Linux / Mac, hopefully making you a lot more efficient.

Installing the AZ modules

First step is actually uninstalling the AzureRM modules. Leaving you feeling all naked without any possibility to remotely manage Azure. But it’ll just be a few seconds if you’re quick enough.

Run Uninstall-AzureRM as Administrator and wait for it to complete. Once done you’ll run Install-Module Az and it’ll install the new modules.

If you have old scripts and don’t feel like rewrite them you can enable aliases for the old commands running Enable-AzureRmAlias. 

That’s it, you’re all updated and running the latest and greatest! To read more about the changes, check out GitHub!

Register resource providers in Azure

These lines of PowerShell will help you register ALL resource providers in Azure in the selected subscription:

# Login

# List subscriptions

# Select subscription
Select-AzureSubscription -SubscriptionName “INSERT NAME HERE”

# List all providers and register (if you only want specific ones, you must run commands manually)
$providers = @(Get-AzureRmResourceProvider -ListAvailable)
foreach ($x in $providers) {

Register-AzureRmResourceProvider -ProviderNamespace $x.ProviderNamespace -Force
write-host $x.ProviderNamespace
Write-Host “Done!”

Creating a VPN gateway in Azure ARM using PowerShell

Spent a few days at a customer site building stuff. Needed some gateways in ARM (Azure Resource Manager) mode. The code below will create a gateway and all artifacts it depends upon.
Use at your own risk 🙂
# Start here
# Variables
$location01 = “West Europe”
$networkname01 = “AzNet”
$rgname01 = “AzNetRG”
# Azure Network Address Space (/27 for VM use. /29 for gateway use)
# Your Azure network MUST have a subnet named “GatewaySubnet”
# Create your network in the portal, make sure to add all address spaces and subnets before running script. Do NOT forget to add “GatewaySubnet”.
$localSubnets01 = @(“”, “”)
# Remote Network Address Space
$remotenetwork01 = @(“”)
# Remote Network Gateway IP
$RemoteGwIP01 = “”
# Remote Connection Gateway Name
$RemoteConnectionGwName = “RemGW”
# Remote Connection Name
$RemoteConnectionName = “RemConn”
$VNET01 = Get-AzureRMVirtualNetwork -Name $networkname01 -ResourceGroupName $rgname01
$gwSubnet01 = Get-AzureRMVirtualNetworkSubnetConfig -Name GatewaySubnet -VirtualNetwork $VNET01
# Create a new public IP address.
$gwIP01 = New-AzurermPublicIpAddress -Name ($networkname01 + “-gwip”) -ResourceGroupName $rgname01 -Location $location01 -AllocationMethod Dynamic
# Create VPN gateway configuration.
$gwConfig01 = New-AzurermVirtualNetworkGatewayIpConfig -Name ($RemoteConnectionName + “-gwconfig”) -SubnetId (Get-AzurermVirtualNetworkSubnetConfig -VirtualNetwork $VNET01 -Name GatewaySubnet).Id -PublicIpAddressId $gwIP01.Id
# Create gateway. This will take up to 40 minutes, so be patient.
$gw01 = New-AzurermVirtualNetworkGateway -Name ($networkname01 + “-gw”) -ResourceGroupName $rgname01 -Location $location01 -IpConfigurations $gwConfig01 -GatewayType VPN -VpnType RouteBased -Tag $tags
$localGw01 = New-AzurermLocalNetworkGateway -Name $RemoteConnectionGwName -ResourceGroupName $rgname01 -Location $location01 -GatewayIpAddress $RemoteGwIP01 -AddressPrefix $remotenetwork01
$AzureGW = Get-AzureRmVirtualNetworkGateway -Name ($networkname01 + “-gw”)  -ResourceGroupName $rgname01
$RemoteGW = Get-AzurermLocalNetworkGateway -Name $RemoteConnectionGwName -ResourceGroupName $rgname01
New-AzurermVirtualNetworkGatewayConnection -Name $RemoteConnectionName -ResourceGroupName $rgname01 -Location $location01 -VirtualNetworkGateway1 $AzureGW -LocalNetworkGateway2 $RemoteGW -ConnectionType IPsec -RoutingWeight 10 -SharedKey $sharedKey01
# End here

TechDays 2015 – Pre-conf and Azure Resource Manager

Just got an email confirming mine and Anders Bengtssons pre-conf for TechDays 2015, the “Azure IAAS Ninja Bootcamp”. We’ll teach you as much as you can consume about Azure IAAS during one day! I also got one session on Azure Resource Manager. ARM is by far the biggest leap in producing clean, nicely installed and repetitive environments in Azure. If you’re missing out on PowerShell and ARM along with DSC my guess is that you’ll be doing something else in the future!

Are you going to TechDays 2015 in Sweden?

Check out my sessions here:

And don’t forget to register:

Connecting to your Azure site-to-site VPN over NAT

Creating a site-to-site connection to your Azure virtual network is desired in a lot of scenarios. Think hybrid cloud, new workloads, communicating with internal systems from Azure and so on. And in demo scenarios when you’re out travelling you might need that access too. Well, looking at the list of supported devices (below) we can find Windows RRAS for example.

Supported VPN devices:

And reading the guide (below) we’ll see how it’s actually done.

Configure Site-to-site VPN:

According to the last link you’ll need an external IPv4 that’s not behind NAT: “Obtain an externally facing IPv4 IP for your VPN device. This IP address is required for a site-to-site configuration and is used for your VPN device, which cannot be located behind a NAT.

That last statement has been discussed quite a lot, and when you read the RFC (RFC 3715,  of course that IPsec connection will work over NAT. It’s just not supported by Microsoft, meaning that we can’t help you configuring your firewall to allow passthrough, hence we want your gateway to be directly connected to the internet.

For IPsec to traverse your NAT you’ll need to forward some ports (often called port forwarding in your router).

IKE – UDP 500
Encapsulating Security Payload (ESP) – IP protocol 50
Authentication Header (AH) – IP protocol 51
IPsec NAT traversal – UDP 4500

My setup consists of a Telia router with an external IP of 78.72.172.xx, my internal ip range is This is added as a local network in Azure.


I then create a new virtual network in Azure and create a dynamic gateway. This will be assigned an ip address.


After that I’ve installed a VM on my local network running Windows Server 2012 R2 and configured it with RRAS. If you download the VPN device configuration script from the Azure portal it’ll set everything up for you, including installing the role. I’ve also configured the port forwarding in my router.



As you can see in the screenshot above the rule “IPSEC_500” forwards all traffic to

Once you have your port forwarding up and running you can have your RRAS server connect.


Give the portal some time (or refresh it) and it’ll show connected too


I’ve deployed two VM’s in Azure and turned off the firewall to be able to verify connectivity using ping.




In the screenshot above I’ve verified connectivity to in Azure with ping, and I’ve done a traceroute. The timeout is from the Azure gateway that doesn’t respond to ICMP. Internal address of RRAS server can be seen in the lower window.

Note that this is unsupported by Microsoft – but works according to RFC.

Uploading your RemoteApp image directory from Azure to RemoteApp

If you’ve been working with RemoteApp for a while you’ve most likely gotten tired of downloading and uploading that image by now. Most of us have probably set up a VM in Azure and added a disk to it, just bouncing the VHD off of that one. Saves a lot of time just staying in Azure. But still, downloading it IS time consuming so to get around that I’ve written a script. Before you download it there are some pointers:

There is NO error checking. Meaning you must remember to disable EFS, install all the roles/features and run sysprep manually. If you forget something you’ll notice that when you try to start your image. That’s VERY late in the process.

The script needs you to have the Azure Storage SDK installed. Same here, if the path to the DLL has changed it’ll fail. If my calendar decides to clear out I’ll give it some time and clean it up but for now it’s a quick and dirty fix… Copy below, save as .ps1 and off you go!

# Load Assembly – Without this file, it’ll all fail…
Add-Type -Path “C:Program Files (x86)Microsoft SDKsAzurePowerShellServiceManagementAzureNetworkMicrosoft.WindowsAzure.Storage.dll”

# Source information
# Information from storage account
$sourceStorageAccount = “storageaccountname” # <- Storage account name
$sourceStorageKey     = “yourstoragekey” # <- The key to your storage account
$sourceContainer      = “vhd” # <- Container name
$sourceFilename       = “RemoteAppTemplate.vhd” <- VHD name, can be seen in your container
$sourceContainerUri   = [String]::Format(“https://{0}{1}”, $sourceStorageAccount, $sourceContainer)

# Destination information
# Information from RemoteApp upload script commandline
$destStorageAccount = “cdvne195334804rdcm”    # <- Destination name
$destStorageSAS     = “?sv=2012-02-12&sr=b&si=f6939bb2-a99d-43b6-823a-fe8ad44f5c20&sig=6q%2Bk8t7xzzC7DeICrWvb39rh4lUEijg93UFL7631V6s%3D” # <- SAS key
$destContainer      = “goldimages” # <- Container name
$destFilename       = “f6939bb2-a88d-43b6-811a-fe8ad41f5c20.vhd” # <- VHD name, can be seen in the command line from RemoteApp
$destUri            = [String]::Format(“https://{0}{1}/{2}”, $destStorageAccount, $destContainer, $destFilename)

# This is where the magic happens

Write-host “Uploading your image…”
$sourceCredentials = New-Object Microsoft.WindowsAzure.Storage.Auth.StorageCredentials($sourceStorageAccount, $sourceStorageKey)
$sourceContainer = New-Object Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer($sourceContainerUri, $sourceCredentials)
$sourceBlob = $sourceContainer.GetBlobReferenceFromServer($sourceFilename)
$sourceStream = $sourceBlob.OpenRead()

$destCredentials = New-Object Microsoft.WindowsAzure.Storage.Auth.StorageCredentials($destStorageSAS)
$destBlob = New-Object Microsoft.WindowsAzure.Storage.Blob.CloudPageBlob($destUri, $destCredentials)

$destBlob.Metadata[“Status”] = “UploadComplete”


A good idea is to run this script from a VM in Azure too. That’ll speed up the process. Azcopy would be able to do the same thing if it supported SAS-usage across subscriptions.

Nya tider, ny teknik, nytt datacenter

När Microsoft tidigare har gjort affärer med företag och även privatpersoner har vi sålt licenser. Du köper X antal licenser av oss som ger dig rätt att använda Windows, Office och kanske några andra produkter. Det har historiskt sett varit en väl fungerande affärsmodell och alla parter har varit nöjda med det upplägget. Windows som klientoperativsystem, stationär PC som arbetsstation och fysiska arbetsplatser är däremot tre områden där det hänt väldigt mycket. Många företag som tidigare kanske hade en bärbar dator / Windows-tablet för sin personal klarar sig idag med en telefon. Se t.ex. Mathem där man som kund signerar sin leverans direkt på chaufförens mobilskärm. Den stationära PC’n är något som också fått stå tillbaka, de bärbara datorerna har kraftigt sjunkit i pris, särskilt om användningsområdet är Office, epost och surf. En portabel arbetsstation för t.ex. grafiskt arbete kostar fortfarande mycket pengar. Numera använder personal allt ifrån mobiltelefoner, plattor och vanliga datorer.


Tittar vi på datacentret så går utvecklingen rasande fort där också. Virtualisering var det som först ändrade hur vi ser på datacentret. Det har gått från att virtualisera själva servern till att vi nu pratar ”software defined X”. Där X numera är compute, lagring och nätverk. Alla delar i vårt datacenter kan numera virtualiseras. Ser vi till vad Microsoft vill åstadkomma med Azure så är det kanske inte i första hand virtualisering vi tänker på, även om IAAS-delarna erbjuder detta. Vi vill att företag till ett konkurrenskraftigt pris ska kunna bygga ut sitt datacenter när man är i behov av testmiljöer, utveckling, belastningstoppar och självklart även ”vanliga” servrar. Lanseringen av nya funktioner sker regelbundet, t.ex. ”network security groups” för att filtrera trafik mellan subnät och multi-nic-maskiner för att kunna ha flera nätverkskort i virtuella servrar. Övrig arkitektur bygger väldigt mycket på att tänka nytt, särskilt om man ska flytta ut eller migrera servrar t.ex. nu när Windows Server 2003 skall ut. Man bör se över hur man gör med applikationer och vara medveten om Azure Web Sites, Azure SQL mfl funktioner som möjliggör modern drift.


Det som är viktigt att komma ihåg både som företagsledare, it-chef och driftschef är att verksamheten ofta är känslig för byråkrati, pris och leveranstider. Begreppet ”skugg-it” torde vara välkänt vid det här laget. Det är det som uppstår när verksamheten skaffar sig tillgång till SAAS-applikationer utan att passera IT-avdelningen. Några som är vanligt förekommande är Salesforce och Projectplace. Inte nog med att IT-avdelningen inte har koll på den leveransen, identiteterna som används kan vara användarnas egna gmail/ Problemet med det är inte uppenbart förräns någon beter sig illa eller slutar. Då har man inte längre kontroll på vem som kan logga in och var. Azure Active Directory är ett exempel på hur vi dagligen hjälper företag att hålla koll på vilka användare som har tillgång till vilka applikationer. Funktioner som att återställa sitt lösenord om man glömt det eller att ha multifaktorsauthenticiering för att säkra känsliga applikationer kan vi också lösa.


Vi på Microsoft hjälper dig gärna. Från ett första möte där vi diskuterar allt från hur Microsoft förändras i dessa tider, till legala krav i din verksamhet och tekniska aspekter. Vill du gå vidare hjälper vi dig självklart med workshops och designsessioner i hur din verksamhet skulle kunna fungera med modern IT som stöd.

Vill du lära dig mer om Microsoft Azure rekommenderar jag varmt MVA – Microsoft Virtual Academy. Kolla in följande kurser:

Introduktion till IAAW och Microsoft Azure – Med Ola Skoog
Moving to Hybrid Cloud with Microsoft Azure
Microsoft Azure IaaS Deep Dive Jump Start
The Microsoft Hybrid Cloud: Best practices guidelines
Microsoft Azure: Site-to-site VPN