This script sample demonstrates how the Azure Virtual Networks PowerShell cmdlets can be utilized to gather Azure Gateway Diagnostics data. This logging is useful for troubleshooting VPN connection issues, and includes messages such as MainMode SA (Phase 1) and QuickMode SA (Phase 2) negotiation. Output data is saved to your Azure storage account, and then is downloaded to a local text file for viewing.



# Copyright © 2014 Microsoft Corporation.  All rights reserved.   
# PowerShell Source Code   
# NAME:   
#    Azure_Gateway_Diagnostics.ps1   
#    2.0  
"------------------------------------------------------------------------------ " | Write-Host -ForegroundColor Yellow  
""  | Write-Host -ForegroundColor Yellow  
" Copyright © 2014 Microsoft Corporation.  All rights reserved. " | Write-Host -ForegroundColor Yellow  
""  | Write-Host -ForegroundColor Yellow  
"------------------------------------------------------------------------------ " | Write-Host -ForegroundColor Yellow  
""  | Write-Host -ForegroundColor Yellow  
" PowerShell Source Code " | Write-Host -ForegroundColor Yellow  
""  | Write-Host -ForegroundColor Yellow  
" NAME: " | Write-Host -ForegroundColor Yellow  
"    Azure_Gateway_Diagnostics.ps1 " | Write-Host -ForegroundColor Yellow  
"" | Write-Host -ForegroundColor Yellow  
" VERSION: " | Write-Host -ForegroundColor Yellow  
"    2.0" | Write-Host -ForegroundColor Yellow  
""  | Write-Host -ForegroundColor Yellow  
"------------------------------------------------------------------------------ " | Write-Host -ForegroundColor Yellow  
"" | Write-Host -ForegroundColor Yellow  
"`n This script SAMPLE is provided and intended only to act as a SAMPLE ONLY," | Write-Host -ForegroundColor Yellow  
" and is NOT intended to serve as a solution to any known technical issue."  | Write-Host -ForegroundColor Yellow  
"`n By executing this SAMPLE AS-IS, you agree to assume all risks and responsibility associated."  | Write-Host -ForegroundColor Yellow  
$ErrorActionPreference = "SilentlyContinue"  
$ContinueAnswer = Read-Host "`n Do you wish to proceed at your own risk? (Y/N)"  
If ($ContinueAnswer -ne "Y") { Write-Host "`n Exiting." -ForegroundColor Red;Exit }  
#import module 
Write-Host "`n Checking Azure PowerShell module" -ForegroundColor Cyan 
Import-Module Azure 
#check module version 
$modver = (Get-Module azure).version 
$PSMinor =$modver.Minor 
$PSBuild =$modver.Build 
If ($PSMinor -ne 8 -or $PSBuild -lt 11){ Write-Host "`n FAILED: Azure PowerShell update required`n`t`n" -fore red;Exit } Else { Write-Host "`tConfirmed" -fore Green } 
#remove existing subs 
If (Get-AzureSubscription) { Get-AzureSubscription | Remove-AzureSubscription -Force } 
Write-Host "`n Authenticating to your Azure account" -ForegroundColor Cyan 
Add-AzureAccount | Out-Null 
#select sub 
Write-Host "`n Listing available Azure subscriptions:" -ForegroundColor Cyan 
If (Get-AzureSubscription) { Get-AzureSubscription | Select SubscriptionName,SubscriptionId | FT } Else { Write-Host "`n FAILED: No subscriptions found`n" -fore red;Exit } 
$selSub = Read-Host "`n Select SubscriptionID" 
If (!(Get-AzureSubscription -SubscriptionId $selSub -ErrorAction SilentlyContinue)){ Write-Host "`n FAILED: Invalid SubscriptionId`n" -fore red;Exit } 
Select-AzureSubscription -SubscriptionId $selSub | Out-Null 
#select storage 
Write-Host "`n Listing available Storage Accounts:" -ForegroundColor Cyan 
Get-AzureStorageAccount | Select StorageAccountName | FT 
$san=Read-Host "`n Select Storage Account Name" 
If (!(Get-AzureStorageAccount -StorageAccountName $san -ErrorAction SilentlyContinue)){ Write-Host "`n FAILED: Invalid Storage Account Name`n" -fore red;Exit } 
#get storage context 
$key=(Get-AzureStorageKey -StorageAccountName $san).primary 
$cxt=New-AzureStorageContext -StorageAccountName $san -StorageAccountKey $key 
If (!$cxt){ Write-Host "`n FAILED: Storage Key not obtained`n" -fore red;Exit } 
#select container 
Write-Host "`n Listing available Storage Account Containers:" -ForegroundColor Cyan 
Get-AzureStorageContainer -Context $cxt | Select Name | FT 
$container=Read-Host "`n Select Storage Container Name" 
If (!(Get-AzureStorageContainer -Name $container -Context $cxt -ErrorAction SilentlyContinue)){ Write-Host "`n FAILED: Invalid Storage Container Name`n" -fore red;Exit } 
#select VNET 
Write-Host "`n Listing available Virtual Networks (having Gateways):" -ForegroundColor Cyan 
Get-AzureVNetSite | Where GatewayProfile -ne $null | Select Name | FT 
$vnet=Read-Host "`n Select Virtual Network Name" 
If (!(Get-AzureVNetSite -VNetName $vnet -ErrorAction SilentlyContinue)){ Write-Host "`n FAILED: Invalid Virtual Network Name`n" -fore red;Exit } 
#select duration 
[int]$duration=Read-Host "`n Select Duration (seconds with 300 max)" 
If (!($duration -gt 0 -and $duration -le 300)){ Write-Host "`n FAILED: Invalid Duration`n" -fore red;Exit } 
#set output file 
#start diags 
Write-Host "`n Starting diagnostics for VNET $vnet`n" -ForegroundColor Cyan 
$StartDiags=Start-AzureVNetGatewayDiagnostics -VNetName $vnet -CaptureDurationInSeconds $duration -ContainerName $container -StorageContext $cxt 
If ($StartDiags.Status -eq "Successful") { Write-Host "`tSuccessfully started tracing" -fore green } Else { Write-Host "`tFAILED: $($StartDiags.Error)`n" -fore red;Exit } 
Write-Host "`n Waiting $duration seconds" -ForegroundColor Cyan 
Start-Sleep -Seconds $duration 
#check status for up to 5 minutes 
$State = "NotReady" 
$Iterations = 1 
While ($State -ne "Ready" -and $Iterations -lt 150) 
     Write-Host "`n Checking status" -ForegroundColor Cyan 
     $State = (Get-AzureVNetGatewayDiagnostics -VNetName $vnet).State 
     Write-Host "`t$State" 
     Start-Sleep -Seconds 2 
#get diags URL 
$url = (Get-AzureVNetGatewayDiagnostics -VNetName $vnet).DiagnosticsUrl 
#download output 
Write-Host "`n Downloading data" -ForegroundColor Cyan 
$wc = New-Object System.Net.WebClient 
{ $wc.DownloadFile($url$outputFile) } 
Catch [Exception] 
{ Write-Host "`tFAILED: $_`n`n`tTry manually browsing: $url" -fore red;Exit } 
#open output file 
If (Test-Path $outputFile) { Invoke-Item $outputFile } Else { Write-Host "`tFAILED: Output file not found`n`n`tTry manually browsing: $url" -fore red } 
Write-Host "`n Done`n`n" -ForegroundColor Cyan