Introduction to Windows Admin Center Extensions
Windows Admin Center (WAC) is a browser-based management interface for Windows Server 2019 that consolidates Server Manager, Failover Cluster Manager, Hyper-V Manager, and many other tools into a single pane of glass. Its extension model allows Microsoft partners and internal teams to add custom tools, integrate third-party products, and automate workflows directly within the WAC interface. This guide covers installing, managing, and developing custom extensions on Windows Server 2019.
Installing Windows Admin Center
# Download the latest WAC installer
$wacUrl = 'https://aka.ms/WACDownload'
Invoke-WebRequest -Uri $wacUrl -OutFile 'C:InstallersWindowsAdminCenter.msi'
# Silent install on port 443 with SSL certificate
$cert = (Get-ChildItem Cert:LocalMachineMy | Where-Object { $_.Subject -like '*mgmt.corp.local*' }).Thumbprint
Start-Process msiexec.exe -Wait -ArgumentList `
'/i C:InstallersWindowsAdminCenter.msi /quiet /L*v C:LogsWACInstall.log SME_PORT=443 SME_THUMBPRINT={0} SSL_CERTIFICATE_OPTION=installed' -f $cert
# Verify WAC service is running
Get-Service ServerManagementGateway | Select-Object Name, Status, StartType
# WAC configuration directory
# C:Program FilesWindows Admin Center
# WAC log location
# C:Program FilesWindows Admin Centerlogs
# Test connectivity
Test-NetConnection -ComputerName mgmt.corp.local -Port 443
Configuring Extension Feed Sources
WAC extensions are distributed as NuGet packages. You can use the Microsoft public feed, a private WSUS-style feed, or a local file path. Configure feeds to control which extensions are available in your environment:
# WAC feed configuration is done via the UI or via the registry
# Default Microsoft extension feed:
# https://aka.ms/sme-extension-feed
# To add a custom internal NuGet feed via registry:
$wacRegPath = 'HKLM:SOFTWAREMicrosoftServerManagementGateway'
$currentFeeds = (Get-ItemProperty $wacRegPath -Name ExtensionFeeds -ErrorAction SilentlyContinue).ExtensionFeeds
# Add internal NuGet server URL
$newFeed = 'https://nuget.corp.local/v3/index.json'
Set-ItemProperty $wacRegPath -Name ExtensionFeeds -Value "$currentFeeds;$newFeed"
# Set up a local NuGet file share as an extension feed
# On the NuGet server, create a local repository
nuget init C:WAC-Extensions C:WAC-Extensions-Feed
# WAC picks up .nupkg files from the share
# Share the feed folder
New-SmbShare -Name 'WACExtensions' -Path 'C:WAC-Extensions-Feed' `
-ReadAccess 'Domain Computers' -FullAccess 'Domain Admins'
# In WAC UI: Settings > Extensions > Add feed > \fileserverWACExtensions
Installing Extensions via WAC UI
The most common extensions available from Microsoft’s feed include:
# Extensions available in WAC Settings > Extensions > Available tab:
# - Azure Backup: integrate Azure backup for on-premises servers
# - Azure File Sync: deploy and manage Azure File Sync agents
# - Azure Network Adapter: connect to Azure VNets without VPN gateway
# - Azure Site Recovery: configure replication to Azure
# - Storage Replica: manage Storage Replica partnerships
# - Packetmon: network packet monitoring
# - DNS: graphical DNS zone management
# - DHCP: DHCP server management
# After installation, extensions appear as new tools in the server view
# Each extension registers a new route in the WAC sidebar
# List installed extensions (PowerShell - WAC CLI)
# WAC doesn't expose a full PowerShell API for extension management
# but you can query the registry:
Get-ChildItem 'HKLM:SOFTWAREMicrosoftServerManagementGatewayExtensions' |
ForEach-Object { Get-ItemProperty $_.PSPath } |
Select-Object PSChildName, Version, Title
Developing a Custom WAC Extension
WAC extensions are Angular web applications built with TypeScript. The WAC SDK provides the framework for creating tools that integrate natively with the gateway’s RPC and PowerShell capabilities:
# Install prerequisites on a development workstation
# Node.js 16+ LTS, Git, VS Code
# Install Windows Admin Center CLI
npm install -g @microsoft/windows-admin-center-cli
# Create a new solution extension
wac create solution-extension-template
# Choose: extension type = solution, name = MyServerTool
# Project structure generated:
# src/app/
# solution.module.ts - Angular module
# solution-routing.ts - Route definitions
# tool/ - Tool component
# tool.component.ts
# tool.component.html
# tool.routing.ts
# Install dependencies
cd MyServerTool
npm install
# Start the development server (targets a running WAC instance)
# Set your WAC gateway URL in src/environments/environment.ts
npm run watch # builds in watch mode
# In WAC, enable developer mode:
# Settings > Advanced > Developer mode > On
# Then import the sideloaded extension by URL
Adding PowerShell Integration to a Custom Extension
Custom extensions can run PowerShell scripts on the managed server through the WAC gateway’s PowerShell API. This is how most data collection and configuration operations work:
// In your Angular service (TypeScript), inject the PowerShell service
import { PowerShellService } from '@microsoft/windows-admin-center-sdk/angular';
@Injectable()
export class ServerInfoService {
constructor(private powershell: PowerShellService) {}
getServerInfo(node: string): Observable {
// PowerShell script that runs on the target server
const script = `
$os = Get-CimInstance Win32_OperatingSystem
$disk = Get-PSDrive C
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
OsVersion = $os.Caption
FreeSpaceGB = [math]::Round($disk.Free / 1GB, 2)
TotalRamGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 2)
UptimeDays = [math]::Round((New-TimeSpan -Start $os.LastBootUpTime -End (Get-Date)).TotalDays, 1)
}
`;
return this.powershell.run(node, PowerShellScripts.GetServerInfo)
.pipe(
map(result => result.results[0])
);
}
restartService(node: string, serviceName: string): Observable {
return this.powershell.run(node, PowerShellScripts.RestartService, { serviceName });
}
}
Packaging and Deploying a Custom Extension
# Build the extension for production
npm run build
# Package as NuGet (.nupkg)
# Edit the .nuspec file in the project root:
# MyServerTool
# 1.0.0
# IT Operations
# Custom server monitoring tool
# Create the NuGet package
nuget pack MyServerTool.nuspec -OutputDirectory C:WAC-Extensions
# Copy to the internal feed
Copy-Item 'C:WAC-ExtensionsMyServerTool.1.0.0.nupkg' `
-Destination '\fileserverWACExtensions'
# In WAC UI: Settings > Extensions > Available (from internal feed) > Install
# For automated deployment across all WAC instances, use a scheduled task
# or DSC to copy the nupkg to the feed and trigger WAC extension refresh
Managing WAC Gateway Settings via PowerShell
# WAC stores its configuration in a SQLite database
# C:Program FilesWindows Admin Centerdata
# Key WAC registry settings
$wacKey = 'HKLM:SOFTWAREMicrosoftServerManagementGateway'
Get-ItemProperty $wacKey
# Configure WAC for Azure integration (Azure registration)
# This is done via WAC UI: Settings > Azure > Register
# Set WAC to use Windows Authentication (Kerberos) instead of CredSSP
# WAC > Settings > Shared Connections > Enable single sign-on
# Restrict WAC access to specific AD groups via Windows Authorization
# IIS Manager > Windows Admin Center site > Authentication > Windows Authentication
# > Advanced Settings > Extended Protection = Accept
# Then use IIS URL Authorization rules:
#
#
#
#
# View WAC audit log (tracks all operations performed through the UI)
Get-WinEvent -LogName 'Microsoft-ServerManagementExperience' -MaxEvents 50 |
Select-Object TimeCreated, Message
Conclusion
Windows Admin Center on Windows Server 2019 is a powerful, extensible management platform that centralizes administration through a browser interface. Its extension model—built on Angular, TypeScript, and the PowerShell execution channel—enables organizations to build custom tooling that integrates natively with the WAC framework. Combined with a private NuGet feed for controlled distribution and Azure integration for hybrid management, WAC extensions provide a modern, auditable approach to server administration at scale.