<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: David</title>
    <description>The latest articles on Forem by David (@azurenoob).</description>
    <link>https://forem.com/azurenoob</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3658781%2Fe1b53592-39b6-450a-a616-af04d8f19b56.png</url>
      <title>Forem: David</title>
      <link>https://forem.com/azurenoob</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/azurenoob"/>
    <language>en</language>
    <item>
      <title>You Can’t Govern What You Can’t Explain on a Napkin</title>
      <dc:creator>David</dc:creator>
      <pubDate>Mon, 22 Dec 2025 10:58:04 +0000</pubDate>
      <link>https://forem.com/azurenoob/you-cant-govern-what-you-cant-explain-on-a-napkin-1ln8</link>
      <guid>https://forem.com/azurenoob/you-cant-govern-what-you-cant-explain-on-a-napkin-1ln8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on Azure-Noob:&lt;br&gt;&lt;br&gt;
&lt;a href="https://azure-noob.com/blog/azure-governance-napkin-test/" rel="noopener noreferrer"&gt;https://azure-noob.com/blog/azure-governance-napkin-test/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every platform team eventually gets asked the same question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Why does cloud cost this much?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your answer starts with &lt;em&gt;“let me pull a dashboard”&lt;/em&gt;, you’ve already lost.&lt;/p&gt;

&lt;p&gt;The CFO walks into your office with a printout.&lt;/p&gt;

&lt;p&gt;“Why did Azure cost $2.3M this quarter?”&lt;/p&gt;

&lt;p&gt;You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Policy enforcing compliance&lt;/li&gt;
&lt;li&gt;A Landing Zone with perfect architecture&lt;/li&gt;
&lt;li&gt;Tags on every resource&lt;/li&gt;
&lt;li&gt;Workbooks showing metrics&lt;/li&gt;
&lt;li&gt;Dashboards with pretty graphs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you can’t answer the question.&lt;/p&gt;

&lt;p&gt;Not in 30 seconds.&lt;br&gt;&lt;br&gt;
Not on a whiteboard.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Not on a napkin.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the governance failure no one talks about.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Tools Enforce Rules, Not Understanding
&lt;/h2&gt;

&lt;p&gt;Every enterprise Azure environment has the same stack:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: Azure Policy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SKU restrictions&lt;/li&gt;
&lt;li&gt;Required tags&lt;/li&gt;
&lt;li&gt;Security baselines&lt;/li&gt;
&lt;li&gt;Audit findings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Layer 2: Landing Zones&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Management groups&lt;/li&gt;
&lt;li&gt;Subscription design&lt;/li&gt;
&lt;li&gt;Network topology&lt;/li&gt;
&lt;li&gt;Identity hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Layer 3: Tagging Standards&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CostCenter&lt;/li&gt;
&lt;li&gt;Owner&lt;/li&gt;
&lt;li&gt;Environment&lt;/li&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Layer 4: Reporting Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Monitor Workbooks&lt;/li&gt;
&lt;li&gt;Power BI dashboards&lt;/li&gt;
&lt;li&gt;Cost Management exports&lt;/li&gt;
&lt;li&gt;Custom queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This stack gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Compliance&lt;/li&gt;
&lt;li&gt;✅ Security controls&lt;/li&gt;
&lt;li&gt;✅ Resource inventory&lt;/li&gt;
&lt;li&gt;✅ Cost visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it doesn’t give you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ &lt;strong&gt;Defensibility&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there’s a critical difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compliance ≠ Defensibility
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Compliance means:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“Our resources follow the rules we wrote.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defensibility means:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“I can explain why this costs what it costs — and justify it to someone who doesn’t trust me.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliant Azure bill:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“All resources are tagged correctly. Policy enforced. Landing Zone followed. Here’s the report.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defensible Azure bill:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“Application X costs $180K/month because it serves 2,400 users across 12 regions with 99.95% SLA requirements. Storage is $40K due to 7-year retention for SOX compliance. Network is $25K for dual ExpressRoute. Compute scales between $95K–$140K based on usage.”&lt;/p&gt;

&lt;p&gt;The first answer is compliant.&lt;br&gt;&lt;br&gt;
The second answer is defensible.&lt;/p&gt;

&lt;p&gt;And most Azure environments can only produce the first one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Napkin Test
&lt;/h2&gt;

&lt;p&gt;Can you explain your Azure costs on a napkin?&lt;/p&gt;

&lt;p&gt;Not “here’s a dashboard.”&lt;br&gt;&lt;br&gt;
Not “let me pull a report.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Right now. On a napkin. In 60 seconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Draw three boxes: Production, Staging, Development
&lt;/li&gt;
&lt;li&gt;Write the monthly cost in each box
&lt;/li&gt;
&lt;li&gt;Break Production into: Apps, Data, Network, Security
&lt;/li&gt;
&lt;li&gt;For the largest app: What does it do? How many users? What’s the SLA?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;If you can’t do this without looking anything up:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your governance isn’t working.&lt;/p&gt;

&lt;p&gt;It doesn’t matter how good your policies are.&lt;br&gt;&lt;br&gt;
It doesn’t matter how clean your Landing Zone is.&lt;br&gt;&lt;br&gt;
It doesn’t matter how consistent your tags are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the person responsible can’t explain it simply, it’s not governed — it’s just compliant.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Tools Fail the Napkin Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tags Report Facts, Not Meaning
&lt;/h3&gt;

&lt;p&gt;Tags tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CostCenter: 4200&lt;/li&gt;
&lt;li&gt;Environment: Production&lt;/li&gt;
&lt;li&gt;Owner: John Smith&lt;/li&gt;
&lt;li&gt;Application: CustomerPortal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don’t tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does it cost $340K/month?&lt;/li&gt;
&lt;li&gt;Is that reasonable?&lt;/li&gt;
&lt;li&gt;What breaks if we cut 30%?&lt;/li&gt;
&lt;li&gt;Which business capability disappears?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tags group resources.&lt;br&gt;&lt;br&gt;
They don’t create understanding.&lt;/p&gt;




&lt;h3&gt;
  
  
  Landing Zones Organize, They Don’t Explain
&lt;/h3&gt;

&lt;p&gt;Landing Zones give you beautiful structure.&lt;/p&gt;

&lt;p&gt;They don’t explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why one subscription costs 3× another&lt;/li&gt;
&lt;li&gt;Which decisions drove last month’s increase&lt;/li&gt;
&lt;li&gt;What trade-offs were made&lt;/li&gt;
&lt;li&gt;What the ROI actually is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structure without narrative isn’t governance.&lt;br&gt;&lt;br&gt;
It’s just organized chaos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Policy Audits the Past, Not the Future
&lt;/h3&gt;

&lt;p&gt;Azure Policy tells you what’s non-compliant.&lt;/p&gt;

&lt;p&gt;It doesn’t tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the resource should exist&lt;/li&gt;
&lt;li&gt;What business problem it solves&lt;/li&gt;
&lt;li&gt;What happens if you remove it&lt;/li&gt;
&lt;li&gt;Whether the rule still makes sense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Policy enforces rules you already wrote.&lt;br&gt;&lt;br&gt;
It doesn’t tell you if they were good rules.&lt;/p&gt;




&lt;h3&gt;
  
  
  Dashboards Show Data, Not Decisions
&lt;/h3&gt;

&lt;p&gt;Dashboards show &lt;em&gt;what happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Leadership asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why did costs go up?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You click through visuals.&lt;/p&gt;

&lt;p&gt;They ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What decision caused this?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your dashboard has no answer.&lt;/p&gt;

&lt;p&gt;Because dashboards don’t explain &lt;em&gt;why&lt;/em&gt; —&lt;br&gt;&lt;br&gt;
or &lt;em&gt;whether it should have happened at all&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Defensibility Actually Requires
&lt;/h2&gt;

&lt;p&gt;Defensible cloud costs have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Business context per dollar&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decision history&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trade-off awareness&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear owner accountability&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More dashboards&lt;/li&gt;
&lt;li&gt;More tags&lt;/li&gt;
&lt;li&gt;More policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But &lt;strong&gt;clear narratives&lt;/strong&gt; that survive CFO scrutiny.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hard Truth
&lt;/h2&gt;

&lt;p&gt;You can’t govern what you can’t explain.&lt;/p&gt;

&lt;p&gt;And if you can’t explain it on a napkin —&lt;br&gt;&lt;br&gt;
in 60 seconds,&lt;br&gt;&lt;br&gt;
in business terms,&lt;br&gt;&lt;br&gt;
to someone who doesn’t trust you —&lt;/p&gt;

&lt;p&gt;you don’t understand it well enough to govern it.&lt;/p&gt;

&lt;p&gt;Until then, governance isn’t governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s just expensive infrastructure with extra steps.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>finops</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Modernizing Azure Workbooks - Taking Billy York's Inventory from 50 to 200+ Services</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 18:56:22 +0000</pubDate>
      <link>https://forem.com/azurenoob/modernizing-azure-workbooks-taking-billy-yorks-inventory-from-50-to-200-services-3fc6</link>
      <guid>https://forem.com/azurenoob/modernizing-azure-workbooks-taking-billy-yorks-inventory-from-50-to-200-services-3fc6</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with Azure Inventory
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Azure Portal:&lt;/strong&gt; Shows resources one subscription at a time&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Need:&lt;/strong&gt; See ALL resources across 44 subscriptions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Billy York's solution:&lt;/strong&gt; Azure Monitor Workbook with Resource Graph queries&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Only covers ~50 Azure services. Azure has 200+.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Billy York Built (And Why It's Great)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Original workbook:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queries Azure Resource Graph&lt;/li&gt;
&lt;li&gt;Shows VMs, storage, networking&lt;/li&gt;
&lt;li&gt;Organized by resource type&lt;/li&gt;
&lt;li&gt;Open source on GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it's excellent:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Actually works (many don't)&lt;/li&gt;
&lt;li&gt;Clean UI&lt;/li&gt;
&lt;li&gt;Copy-paste KQL queries&lt;/li&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it needs enhancement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing 150+ services&lt;/li&gt;
&lt;li&gt;No security hygiene checks&lt;/li&gt;
&lt;li&gt;No cost context&lt;/li&gt;
&lt;li&gt;Manual updates for new Azure services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What We Added
&lt;/h2&gt;

&lt;h3&gt;
  
  
  150+ Additional Services
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Original:&lt;/strong&gt; VMs, Storage, VNets, NSGs, Load Balancers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Added:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure AI (OpenAI, Cognitive Services, ML)&lt;/li&gt;
&lt;li&gt;Databases (SQL, Cosmos, PostgreSQL, MySQL)&lt;/li&gt;
&lt;li&gt;Integration (Logic Apps, Service Bus, Event Grid)&lt;/li&gt;
&lt;li&gt;Security (Key Vault, Defender, Sentinel)&lt;/li&gt;
&lt;li&gt;Monitoring (Application Insights, Log Analytics)&lt;/li&gt;
&lt;li&gt;Arc (Hybrid servers, Kubernetes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; 200+ service types&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Hygiene Checks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query for public-facing resources:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend hasPublicIP = isnotnull(properties.networkProfile.networkInterfaces[0].properties.ipConfigurations[0].properties.publicIPAddress)
| where hasPublicIP == true
| project name, resourceGroup, location
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Query for unencrypted storage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.storage/storageaccounts'
| where properties.encryption.services.blob.enabled != true
| project name, resourceGroup, location
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Query for expired certificates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.keyvault/vaults/certificates'
| extend expiry = todatetime(properties.attributes.exp)
| where expiry &amp;lt; now() + 30d
| project name, expiry, resourceGroup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cost Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Added cost data to resource views:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend vmSize = tostring(properties.hardwareProfile.vmSize)
| join kind=leftouter (
    CostManagementExports
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId
| project name, vmSize, MonthlyCost, resourceGroup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Global Filters
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Original:&lt;/strong&gt; Filter per-section&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced:&lt;/strong&gt; Global subscription/resource group filter applies to ALL sections&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dropdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Subscriptions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ResourceContainers | where type == 'microsoft.resources/subscriptions' | project name, subscriptionId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isMultiSelect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Select subscriptions once, affects entire workbook&lt;/p&gt;

&lt;h2&gt;
  
  
  The Enhancement Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Clone Billy York's Repo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/scautomation/Azure-Inventory-Workbook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Identify Missing Services
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query all resource types:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| distinct type
| order by type asc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compare to workbook:&lt;/strong&gt; Find gaps&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add Service Sections
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Template for new section:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Azure OpenAI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resources | where type =~ 'microsoft.cognitiveservices/accounts' | where kind == 'OpenAI' | project name, sku.name, location, resourceGroup"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Add Security Checks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For each service, add:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public exposure check&lt;/li&gt;
&lt;li&gt;Encryption status&lt;/li&gt;
&lt;li&gt;Certificate expiration&lt;/li&gt;
&lt;li&gt;Compliance flags&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 5: Add Cost Columns
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Join cost data to resource queries:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ '[service-type]'
| join kind=leftouter (
    CostManagementExports
    | where TimeGenerated &amp;gt; ago(30d)
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real Example: SQL Databases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Original section (basic):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.sql/servers/databases'
| project name, resourceGroup, location
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Enhanced section (with security + cost):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.sql/servers/databases'
| extend 
    serverName = split(id, '/')[8],
    tier = properties.sku.tier,
    encrypted = properties.transparentDataEncryption.status,
    publicAccess = properties.publicNetworkAccess
| join kind=leftouter (
    CostManagementExports
    | where TimeGenerated &amp;gt; ago(30d)
    | summarize MonthlyCost = sum(Cost) by ResourceId
) on $left.id == $right.ResourceId
| project 
    Database = name, 
    Server = serverName,
    Tier = tier,
    Encrypted = encrypted,
    PublicAccess = publicAccess,
    MonthlyCost = round(MonthlyCost, 2),
    ResourceGroup = resourceGroup,
    Location = location
| order by MonthlyCost desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shows SQL databases&lt;/li&gt;
&lt;li&gt;Security status (encryption, public access)&lt;/li&gt;
&lt;li&gt;Monthly cost&lt;/li&gt;
&lt;li&gt;Sorted by expense&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Performance Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem: Workbook Timeout
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Original:&lt;/strong&gt; Single massive query for all subscriptions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced:&lt;/strong&gt; Paginated queries with limits&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.compute/virtualmachines'
| take 1000  // Pagination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problem: Slow Joins
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Original:&lt;/strong&gt; Join every resource to cost data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhanced:&lt;/strong&gt; Pre-aggregate cost data&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Pre-aggregate costs
let costs = CostManagementExports
| where TimeGenerated &amp;gt; ago(30d)
| summarize MonthlyCost = sum(Cost) by ResourceId;

// Then join
Resources
| where type =~ 'microsoft.compute/virtualmachines'
| join kind=leftouter costs on $left.id == $right.ResourceId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  UI/UX Improvements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conditional Visibility
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Only show sections with resources:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"conditionalVisibility"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parameterName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HasOpenAI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"comparison"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"isEqualTo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Color Coding
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Red:&lt;/strong&gt; Security issues (public access, unencrypted)&lt;br&gt;
&lt;strong&gt;Yellow:&lt;/strong&gt; Warnings (expiring certs, high cost)&lt;br&gt;
&lt;strong&gt;Green:&lt;/strong&gt; Compliant resources&lt;/p&gt;
&lt;h3&gt;
  
  
  Export Functionality
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Added:&lt;/strong&gt; Export to CSV for each section&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"export"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"csv"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Import JSON
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to Azure Monitor → Workbooks&lt;/li&gt;
&lt;li&gt;Click "New"&lt;/li&gt;
&lt;li&gt;Click "Advanced Editor"&lt;/li&gt;
&lt;li&gt;Paste enhanced JSON&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Option 2: ARM Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Insights/workbooks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-03-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[guid('azure-inventory-enhanced')]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[resourceGroup().location]"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"displayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Azure Inventory Enhanced"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"serializedData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[parameters('workbookContent')]"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az deployment group create &lt;span class="nt"&gt;--resource-group&lt;/span&gt; Monitoring-RG &lt;span class="nt"&gt;--template-file&lt;/span&gt; workbook.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before (Billy York original):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50 service types&lt;/li&gt;
&lt;li&gt;No security context&lt;/li&gt;
&lt;li&gt;No cost data&lt;/li&gt;
&lt;li&gt;Good for small environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After (enhanced):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200+ service types&lt;/li&gt;
&lt;li&gt;Security hygiene checks&lt;/li&gt;
&lt;li&gt;Cost context&lt;/li&gt;
&lt;li&gt;Production-ready for enterprise&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time to generate inventory:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before: Multiple tools, 2 hours&lt;/li&gt;
&lt;li&gt;After: Single workbook, 30 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Community Contribution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Billy York's original:&lt;/strong&gt; &lt;a href="https://github.com/scautomation/Azure-Inventory-Workbook" rel="noopener noreferrer"&gt;https://github.com/scautomation/Azure-Inventory-Workbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our enhancements:&lt;/strong&gt; Fork + pull request with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;150+ additional services&lt;/li&gt;
&lt;li&gt;Security checks&lt;/li&gt;
&lt;li&gt;Cost integration&lt;/li&gt;
&lt;li&gt;Performance fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Attribution:&lt;/strong&gt; Billy York deserves credit for building the foundation. We just scaled it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Enhanced Workbook
&lt;/h2&gt;

&lt;p&gt;Complete workbook JSON, deployment templates, and contribution guide:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/modernizing-azure-workbooks/" rel="noopener noreferrer"&gt;Enhanced Azure Inventory Workbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also on GitHub: [github.com/dswann101164/azure-inventory-workbook-enhanced]&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Using Azure Workbooks?&lt;/strong&gt; Start with community workbooks like Billy York's, then enhance for your needs. Don't build from scratch—extend what works.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>monitoring</category>
      <category>workbooks</category>
      <category>kql</category>
    </item>
    <item>
      <title>Building Azure Dashboards for Cloud NOC Teams (What Actually Gets Used vs What Gets Ignored)</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 18:54:13 +0000</pubDate>
      <link>https://forem.com/azurenoob/building-azure-dashboards-for-cloud-noc-teams-what-actually-gets-used-vs-what-gets-ignored-3o75</link>
      <guid>https://forem.com/azurenoob/building-azure-dashboards-for-cloud-noc-teams-what-actually-gets-used-vs-what-gets-ignored-3o75</guid>
      <description>&lt;h2&gt;
  
  
  The Dashboard Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we built:&lt;/strong&gt; 47 tiles showing metrics, logs, alerts, compliance, costs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What NOC uses:&lt;/strong&gt; 3 tiles&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt; Dashboard answered "what's our resource count?" not "what's broken?"&lt;/p&gt;

&lt;h2&gt;
  
  
  What NOC Teams Actually Need
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Question #1: "What's Down Right Now?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; 15 charts showing healthy services&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes:&lt;/strong&gt; List of failures, ranked by business impact&lt;/p&gt;

&lt;h3&gt;
  
  
  Question #2: "What Needs My Attention?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; 200 active alerts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes:&lt;/strong&gt; 5 critical alerts requiring human action&lt;/p&gt;

&lt;h3&gt;
  
  
  Question #3: "Is This Normal?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Not:&lt;/strong&gt; Current CPU usage&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes:&lt;/strong&gt; Current vs 7-day baseline with "normal range" shading&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard Design That Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tile 1: Critical Incidents (Top Priority)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AzureActivity
| where Level == "Critical" or Level == "Error"
| where TimeGenerated &amp;gt; ago(1h)
| summarize Count=count() by ResourceGroup, OperationNameValue
| order by Count desc
| take 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Red alert icon&lt;/li&gt;
&lt;li&gt;Resource name&lt;/li&gt;
&lt;li&gt;Error count&lt;/li&gt;
&lt;li&gt;Time since first occurrence&lt;/li&gt;
&lt;li&gt;Business impact (if known)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tile 2: Service Health Issues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ServiceHealthResources
| where type == "microsoft.resourcehealth/events"
| where properties.status == "Active"
| project ServiceName = properties.service, 
          Issue = properties.title,
          Impact = properties.impact
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure service name&lt;/li&gt;
&lt;li&gt;Issue description
&lt;/li&gt;
&lt;li&gt;Affected regions&lt;/li&gt;
&lt;li&gt;Link to status page&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tile 3: Failed Deployments
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AzureActivity
| where OperationNameValue contains "Microsoft.Resources/deployments/write"
| where ActivityStatusValue == "Failed"
| where TimeGenerated &amp;gt; ago(24h)
| project TimeGenerated, Caller, ResourceGroup, ErrorMessage = Properties
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who tried to deploy&lt;/li&gt;
&lt;li&gt;What failed&lt;/li&gt;
&lt;li&gt;Error message&lt;/li&gt;
&lt;li&gt;Time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tile 4: Abnormal Resource Consumption
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Perf
| where TimeGenerated &amp;gt; ago(1h)
| where CounterName == "% Processor Time"
| summarize AvgCPU = avg(CounterValue) by Computer
| where AvgCPU &amp;gt; 85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM name&lt;/li&gt;
&lt;li&gt;Current CPU %&lt;/li&gt;
&lt;li&gt;Comparison to 7-day average&lt;/li&gt;
&lt;li&gt;Threshold breach time&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tile 5: Budget Alerts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AzureActivity
| where OperationNameValue contains "Microsoft.Consumption"
| where Level == "Warning" or Level == "Error"
| where TimeGenerated &amp;gt; ago(24h)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription name&lt;/li&gt;
&lt;li&gt;Current spend&lt;/li&gt;
&lt;li&gt;Budget amount&lt;/li&gt;
&lt;li&gt;Forecast end-of-month&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What NOT to Include
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Resource Counts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why NOC doesn't care:&lt;/strong&gt; "We have 847 VMs" doesn't help incident response&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who cares:&lt;/strong&gt; Capacity planning team&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it belongs:&lt;/strong&gt; Monthly capacity review, not NOC dashboard&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Compliance Metrics
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why NOC doesn't care:&lt;/strong&gt; "72% compliant with tag policy" isn't urgent at 2 AM&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who cares:&lt;/strong&gt; Governance team&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it belongs:&lt;/strong&gt; Weekly governance report&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Cost Breakdown Charts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why NOC doesn't care:&lt;/strong&gt; "Compute is 45% of spend" doesn't help fix outages&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who cares:&lt;/strong&gt; FinOps team&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it belongs:&lt;/strong&gt; Monthly cost review&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ "Healthy" Status
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Why NOC doesn't care:&lt;/strong&gt; If it's working, they don't need to see it&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt; Only show failures. If dashboard is empty, everything's fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real NOC Dashboard Example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Our 5-tile dashboard:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Critical Alerts&lt;/strong&gt; (red box, top-left)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently: 0&lt;/li&gt;
&lt;li&gt;If &amp;gt;0: Shows alert details&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Health&lt;/strong&gt; (orange box, top-right)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently: 1 (Azure DevOps degraded, East US)&lt;/li&gt;
&lt;li&gt;Impact: Low&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Failed Deployments&lt;/strong&gt; (yellow box, middle-left)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Last 24h: 3 failures&lt;/li&gt;
&lt;li&gt;Links to logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;High CPU VMs&lt;/strong&gt; (yellow box, middle-right)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Currently: 2 VMs over 85%&lt;/li&gt;
&lt;li&gt;Shows VM names, current %&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Budget Status&lt;/strong&gt; (green box, bottom)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;67% of monthly budget used&lt;/li&gt;
&lt;li&gt;45% of month elapsed&lt;/li&gt;
&lt;li&gt;Forecast: On track&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Total tiles:&lt;/strong&gt; 5&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to understand status:&lt;/strong&gt; 10 seconds&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard Refresh Strategy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Real-Time Data (1-minute refresh)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Critical alerts&lt;/li&gt;
&lt;li&gt;Service health&lt;/li&gt;
&lt;li&gt;High CPU/memory&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Near Real-Time (5-minute refresh)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Failed deployments&lt;/li&gt;
&lt;li&gt;Error logs&lt;/li&gt;
&lt;li&gt;Network issues&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hourly Refresh
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Budget status&lt;/li&gt;
&lt;li&gt;Backup failures&lt;/li&gt;
&lt;li&gt;Compliance alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #1: Too Many Tiles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; 47 tiles, can't see critical issues&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Maximum 10 tiles, prioritize by urgency&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #2: Showing "Green"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; "99% of services healthy" takes space&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Only show failures. Empty dashboard = everything's fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #3: No Business Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; "VM-SQL-12 is down" (which app is that?)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Map VMs to apps in dashboard query&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #4: Metrics Without Baselines
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; "CPU is 45%" (is that normal?)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Show current vs 7-day average&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Empty Dashboard Is Good" Philosophy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Traditional thinking:&lt;/strong&gt; Dashboard must always show data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better thinking:&lt;/strong&gt; Dashboard shows PROBLEMS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard empty most of the time&lt;/li&gt;
&lt;li&gt;When something appears, it's urgent&lt;/li&gt;
&lt;li&gt;NOC knows exactly what to fix&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multi-Team Dashboard Strategy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't:&lt;/strong&gt; One dashboard for everyone&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do:&lt;/strong&gt; Separate dashboards per team:&lt;/p&gt;

&lt;h3&gt;
  
  
  NOC Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Incidents requiring immediate action&lt;/li&gt;
&lt;li&gt;5 tiles, 10-second understanding&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  FinOps Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cost trends&lt;/li&gt;
&lt;li&gt;Budget tracking&lt;/li&gt;
&lt;li&gt;Reservation coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security alerts&lt;/li&gt;
&lt;li&gt;Compliance violations&lt;/li&gt;
&lt;li&gt;Vulnerability scans&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Capacity Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Resource utilization&lt;/li&gt;
&lt;li&gt;Growth trends&lt;/li&gt;
&lt;li&gt;Forecast capacity needs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Dashboard Templates
&lt;/h2&gt;

&lt;p&gt;Complete KQL queries, Azure Monitor Workbook templates, and multi-team dashboard architecture:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/azure-dashboards-cloud-noc/" rel="noopener noreferrer"&gt;Azure NOC Dashboard Complete Guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Building dashboards for NOC teams?&lt;/strong&gt; Show problems, not status. Empty dashboard = everything's working. That's success.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>monitoring</category>
      <category>dashboards</category>
      <category>operations</category>
    </item>
    <item>
      <title>Azure Tag Governance Reality - Why 247 Variations of "Environment" Collapse Your Cost Reports</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 18:49:56 +0000</pubDate>
      <link>https://forem.com/azurenoob/azure-tag-governance-reality-why-247-variations-of-environment-collapse-your-cost-reports-3408</link>
      <guid>https://forem.com/azurenoob/azure-tag-governance-reality-why-247-variations-of-environment-collapse-your-cost-reports-3408</guid>
      <description>&lt;h2&gt;
  
  
  The Tag Governance Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Policy:&lt;/strong&gt; "All resources must have Environment tag"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Teams create resources with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Environment: Production&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Env: Prod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environment: production&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Enviroment: Production&lt;/code&gt; (typo)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Environment: PRODUCTION&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Env: P&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Cost reports show 247 variations. Finance can't group costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Example: Our Tag Chaos
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Query all "Environment" tags:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| extend envTag = tostring(tags.Environment)
| summarize count() by envTag
| order by count_ desc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Production&lt;/code&gt; - 847 resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Prod&lt;/code&gt; - 312 resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PRODUCTION&lt;/code&gt; - 156 resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;production&lt;/code&gt; - 89 resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;P&lt;/code&gt; - 67 resources&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PRD&lt;/code&gt; - 43 resources&lt;/li&gt;
&lt;li&gt;241 more variations...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; 247 unique values for "Production" alone&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Tag Governance Fails
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem #1: Azure Policy Doesn't Validate Values
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Policy:&lt;/strong&gt; "Require Environment tag"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it checks:&lt;/strong&gt; Tag key exists&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Value is valid&lt;/li&gt;
&lt;li&gt;Capitalization is consistent&lt;/li&gt;
&lt;li&gt;Spelling is correct&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Tag exists but value is garbage&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem #2: Teams Work Around Policies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Policy:&lt;/strong&gt; "Environment tag required"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; Creates resource with &lt;code&gt;Environment: "TODO"&lt;/code&gt; to pass policy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Later:&lt;/strong&gt; Never fixes it&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem #3: No Enforcement at Portal
&lt;/h3&gt;

&lt;p&gt;Portal lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free-type tag values&lt;/li&gt;
&lt;li&gt;Ignore suggested values&lt;/li&gt;
&lt;li&gt;Create typos&lt;/li&gt;
&lt;li&gt;Use any capitalization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Problem #4: Terraform/ARM Templates Don't Help
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;  &lt;span class="c1"&gt;# What's in the variable?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If variable contains "prod" or "PROD" or "Production", all valid Terraform. All wrong for governance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Impact
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Finance request:&lt;/strong&gt; "Show me Production costs vs Non-Production"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without governance:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| extend env = tostring(tags.Environment)
| where env in ("Production", "Prod", "PRODUCTION", "production", 
               "PRD", "prd", "P", "p", "Prod1", "Production1"...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Missing costs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;43 resources tagged &lt;code&gt;PRD&lt;/code&gt; instead of &lt;code&gt;Production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;$12,000/month unaccounted for in reports&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tag Governance That Actually Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Define Standard Values
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Environment tag allowed values:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Production&lt;/code&gt; (only this, exactly)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Staging&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Development&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sandbox&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That's it.&lt;/strong&gt; No abbreviations. No variations. No typos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Azure Policy with Value Enforcement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Indexed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"policyRule"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"if"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"anyOf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags['Environment']"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"exists"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"false"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tags['Environment']"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"notIn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sandbox"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"then"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deny"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Invalid values blocked at creation&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Fix Existing Resources
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Find resources with non-standard values
Resources
| extend env = tostring(tags.Environment)
| where env !in ("Production", "Staging", "Development", "Sandbox")
| project name, resourceGroup, currentValue = env
| extend suggestedValue = case(
    env in~ ("Prod", "PRD", "P", "PRODUCTION", "production"),
        "Production",
    env in~ ("Stage", "STG", "S", "STAGING"),
        "Staging",
    env in~ ("Dev", "D", "DEVELOPMENT", "development"),
        "Development",
    "Sandbox"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remediation script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get resources with wrong tags&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$resources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-AzResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Environment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-notin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="s2"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sandbox"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Fix them&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;foreach&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$resources&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$currentValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Environment&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Map to standard value&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Regex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$currentValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"^[Pp](rod|RD)?$"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Production"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"^[Ss](tage|taging|TG)?$"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Staging"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"^[Dd](ev|EV)?$"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Development"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sandbox"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="c"&gt;# Update tag&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Environment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Set-AzResource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ResourceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ResourceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Tag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$resource&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Tags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Terraform Value Validation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"environment"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Environment name"&lt;/span&gt;

  &lt;span class="nx"&gt;validation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
      &lt;span class="s2"&gt;"Production"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Staging"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="s2"&gt;"Development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"Sandbox"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;error_message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Environment must be exactly: Production, Staging, Development, or Sandbox"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Tag Taxonomy That Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Required tags for ALL resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Environment&lt;/code&gt; - Production | Staging | Development | Sandbox&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CostCenter&lt;/code&gt; - 4-digit code from finance&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Owner&lt;/code&gt; - Email address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Application&lt;/code&gt; - App name from CMDB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Optional tags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Project&lt;/code&gt; - Project code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Backup&lt;/code&gt; - Daily | Weekly | None&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Compliance&lt;/code&gt; - PCI | HIPAA | SOX | None&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key principle:&lt;/strong&gt; Every tag has DEFINED allowed values. No free text except Owner email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enforcement Timeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Week 1: Policy Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy deny policies for new resources&lt;/li&gt;
&lt;li&gt;Existing resources not affected&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 2-4: Remediation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run KQL queries to find non-compliant resources&lt;/li&gt;
&lt;li&gt;Bulk fix with PowerShell scripts&lt;/li&gt;
&lt;li&gt;Team meetings to explain standards&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Week 5: Full Enforcement
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All resources compliant&lt;/li&gt;
&lt;li&gt;Deny policies block non-standard values&lt;/li&gt;
&lt;li&gt;Cost reports finally accurate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;247 Environment tag variations&lt;/li&gt;
&lt;li&gt;Cost reports required 2 hours of Excel cleanup&lt;/li&gt;
&lt;li&gt;Finance didn't trust Azure cost data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 Environment tag values (only valid ones)&lt;/li&gt;
&lt;li&gt;Cost reports accurate in 30 seconds&lt;/li&gt;
&lt;li&gt;Finance trusts data, uses it for budgeting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #1: Too Many Tags
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt; Require 15 tags on every resource&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Teams copy-paste garbage to pass policy&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; 4 required tags that matter&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #2: Free-Text Values
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt; Allow any value for "Owner" tag&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; "John", "john.doe", "&lt;a href="mailto:j.doe@company.com"&gt;j.doe@company.com&lt;/a&gt;", "IT Team"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; Validate email format with policy&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #3: No Remediation Plan
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt; Deploy deny policy, existing resources broken&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Production deploys fail, emergency policy exemptions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; Fix existing resources BEFORE enforce mode&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Governance Framework
&lt;/h2&gt;

&lt;p&gt;Complete tag taxonomy, Azure Policy templates, remediation scripts, and enforcement timeline:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/tag-governance-247-variations/" rel="noopener noreferrer"&gt;Azure Tag Governance Complete Guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Implementing tag governance?&lt;/strong&gt; Define allowed values, enforce with policy, remediate existing resources, then enable deny mode. In that order.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>governance</category>
      <category>finops</category>
      <category>tagging</category>
    </item>
    <item>
      <title>50 Windows Commands Every Azure VM Admin Needs (PowerShell + Active Directory)</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 18:47:28 +0000</pubDate>
      <link>https://forem.com/azurenoob/50-windows-commands-every-azure-vm-admin-needs-powershell-active-directory-29a1</link>
      <guid>https://forem.com/azurenoob/50-windows-commands-every-azure-vm-admin-needs-powershell-active-directory-29a1</guid>
      <description>&lt;h2&gt;
  
  
  Why This List Exists
&lt;/h2&gt;

&lt;p&gt;Azure Portal is great until:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RDP is slow&lt;/li&gt;
&lt;li&gt;You need to fix networking&lt;/li&gt;
&lt;li&gt;Active Directory breaks&lt;/li&gt;
&lt;li&gt;You're troubleshooting 50 VMs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you need actual Windows commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check IP Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetIPAddress&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InterfaceAlias&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PrefixLength&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test DNS Resolution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Resolve-DnsName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;azure-noob.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trace Route to Endpoint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tracert 10.0.1.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Open Ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Test-NetConnection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ComputerName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10.0.1.4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Routing Table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;route print
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flush DNS Cache
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ipconfig /flushdns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Active Connections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netstat -ano | findstr ESTABLISHED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Active Directory Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Join Domain
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Add-Computer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DomainName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;contoso.com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Restart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Domain Join
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nltest /dsgetdc:contoso.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check AD Replication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repadmin /replsummary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Find Domain Controllers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ADDomainController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;IPv4Address&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reset Computer Account
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Reset-ComputerMachinePassword&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DC01&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Domain Trust
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nltest /sc_query:contoso.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Disk Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List All Disks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FriendlyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PartitionStyle&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Initialize New Disk
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Initialize-Disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-PartitionStyle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GPT&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create New Partition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;New-Partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DiskNumber&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseMaximumSize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DriveLetter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Format-Volume&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DriveLetter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;F&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FileSystem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;NTFS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NewFileSystemLabel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Data"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Extend Volume
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Resize-Partition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DriveLetter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-PartitionSupportedSize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DriveLetter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SizeMax&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Disk Health
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-PhysicalDisk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FriendlyName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HealthStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OperationalStatus&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Service Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List All Services
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Running"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-Table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Start/Stop Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Start-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"W32Time"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Stop-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Spooler"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Set Service Startup Type
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wuauserv"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-StartupType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Manual&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Service Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"W32Time"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExpandProperty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DependentServices&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance &amp;amp; Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check CPU Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\Processor(_Total)\% Processor Time'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-SampleInterval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-MaxSamples&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Memory Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="nx"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"FreeGB"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{[&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FreePhysicalMemory&lt;/span&gt;&lt;span class="n"&gt;/1MB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Top CPU Processes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PM&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Disk I/O
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Counter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'\PhysicalDisk(_Total)\Disk Reads/sec'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;'\PhysicalDisk(_Total)\Disk Writes/sec'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Uptime
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_OperatingSystem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LastBootUpTime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Windows Updates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check for Updates
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-WindowsUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Updates
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Install-WindowsUpdate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AcceptAll&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AutoReboot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Update History
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_QuickFixEngineering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;HotFixID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;InstalledOn&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  User &amp;amp; Permission Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List Local Admins
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-LocalGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrators"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add User to Local Admin
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Add-LocalGroupMember&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Administrators"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Member&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CONTOSO\john.doe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Logged-in Users
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Force Logoff User
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logoff 2 /server:localhost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check File Permissions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Acl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Important\File.txt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Format-List&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Firewall Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Show Firewall Rules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;DisplayName&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Firewall Rule
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;New-NetFirewallRule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DisplayName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow SQL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Direction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Inbound&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LocalPort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1433&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Allow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Disable Firewall (Testing Only!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-NetFirewallProfile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Public&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;False&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Event Log Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Show Recent Errors
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-EntryType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Newest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Search Event Logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*SQL*"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Security Events
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-EventLog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Security&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-InstanceId&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;4624&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Newest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Azure-Specific Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check Azure VM Agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WindowsAzureGuestAgent&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Azure Metadata Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Headers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@{&lt;/span&gt;&lt;span class="s2"&gt;"Metadata"&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Method&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://169.254.169.254/metadata/instance?api-version=2021-02-01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Azure VM Extensions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-AzVMExtension&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ResourceGroupName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RG-Prod"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-VMName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VM-SQL-01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  System Information
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Show OS Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-ComputerInfo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WindowsProductName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WindowsVersion&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OsBuildNumber&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Installed Programs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-WmiObject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Product&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check System Drivers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-WindowsDriver&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Show Environment Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reset Windows Update
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net stop wuauserv
del C:\Windows\SoftwareDistribution\*.* /s /q
net start wuauserv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clear Temp Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\*"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ErrorAction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SilentlyContinue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Rebuild Windows Search Index
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Get-Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;WSearch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Restart-Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Full Command Reference
&lt;/h2&gt;

&lt;p&gt;Complete command library with parameters, examples, and troubleshooting guides:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/50-windows-commands-azure/" rel="noopener noreferrer"&gt;50 Windows Commands Complete Guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Managing Azure VMs?&lt;/strong&gt; Bookmark this. The Azure Portal can't do everything—sometimes you need actual Windows commands.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>windows</category>
      <category>powershell</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Azure Arc Ghost Registrations - 64% of Our Arc Servers Don't Exist</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 15:32:44 +0000</pubDate>
      <link>https://forem.com/azurenoob/azure-arc-ghost-registrations-64-of-our-arc-servers-dont-exist-3beh</link>
      <guid>https://forem.com/azurenoob/azure-arc-ghost-registrations-64-of-our-arc-servers-dont-exist-3beh</guid>
      <description>&lt;h2&gt;
  
  
  The Compliance Report Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Azure Policy dashboard:&lt;/strong&gt; "850 Arc-enabled servers, 72% compliant"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VMware vCenter:&lt;/strong&gt; "547 VMs total"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Math:&lt;/strong&gt; 850 - 547 = &lt;strong&gt;303 ghost registrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our compliance data was fiction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are Ghost Registrations?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; When you delete a VM, Azure Arc registration persists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compliance reports include servers that don't exist&lt;/li&gt;
&lt;li&gt;Cost tracking is wrong&lt;/li&gt;
&lt;li&gt;Security dashboards show phantom vulnerabilities&lt;/li&gt;
&lt;li&gt;Nobody knows which servers are real&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Happens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: Delete VM Without Removing Arc Agent
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Most common&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VMware admin deletes VM&lt;/li&gt;
&lt;li&gt;Arc agent never uninstalls (VM gone)&lt;/li&gt;
&lt;li&gt;Arc registration stays in Azure&lt;/li&gt;
&lt;li&gt;Shows as "offline" forever&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Scenario 2: VM Name Reuse
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Delete VM named "SQL-PROD-01"&lt;/li&gt;
&lt;li&gt;Create new VM with same name&lt;/li&gt;
&lt;li&gt;Now TWO Arc registrations for "SQL-PROD-01"&lt;/li&gt;
&lt;li&gt;Which one is real? Nobody knows.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Scenario 3: Failed Deletions
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Try to delete Arc registration&lt;/li&gt;
&lt;li&gt;API times out&lt;/li&gt;
&lt;li&gt;Azure portal shows "deleted"&lt;/li&gt;
&lt;li&gt;Resource Graph still shows it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Impact
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compliance Reports Are Fiction
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Azure Policy:&lt;/strong&gt; "347 servers need patches"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; 64% of those are ghosts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finance:&lt;/strong&gt; "Why are we patching 347 servers when we only have 220?"&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Tracking Is Wrong
&lt;/h3&gt;

&lt;p&gt;Arc costs $5/server/month if you exceed free tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bill:&lt;/strong&gt; $4,250/month (850 servers)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; $2,735/month (547 servers)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overpayment:&lt;/strong&gt; $1,515/month = $18K/year&lt;/p&gt;

&lt;h3&gt;
  
  
  Security False Positives
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Defender:&lt;/strong&gt; "Critical vulnerabilities on 150 servers"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOC team:&lt;/strong&gt; Spends 40 hours investigating&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; 96 of those servers don't exist&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Detect Ghosts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Resource Graph Query
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
kql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>azure</category>
      <category>arc</category>
      <category>hybrid</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Azure OpenAI Pricing Reality - $2 Demo Becomes $4,000/Month in Production</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 15:19:36 +0000</pubDate>
      <link>https://forem.com/azurenoob/azure-openai-pricing-reality-2-demo-becomes-4000month-in-production-1577</link>
      <guid>https://forem.com/azurenoob/azure-openai-pricing-reality-2-demo-becomes-4000month-in-production-1577</guid>
      <description>&lt;h2&gt;
  
  
  The Demo vs Production Gap
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; "We'll use GPT-4 for customer support. Costs $2/day in testing!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 1 production:&lt;/strong&gt; $4,200 bill arrives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 2:&lt;/strong&gt; $6,800.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finance:&lt;/strong&gt; "What happened to $2/day?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Microsoft's Calculator Is Wrong
&lt;/h2&gt;

&lt;p&gt;Microsoft's Azure OpenAI pricing calculator shows token costs. It doesn't show:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hosting fees:&lt;/strong&gt; $1,836/month minimum for fine-tuning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PTU costs:&lt;/strong&gt; $2,448/month minimum for dedicated capacity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedding costs:&lt;/strong&gt; Often more expensive than completions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token ratio reality:&lt;/strong&gt; Output tokens cost 3x input tokens&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real Pricing (December 2025)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GPT-4o (Newest, Cheapest GPT-4 Class)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Input: $0.005 per 1K tokens&lt;/li&gt;
&lt;li&gt;Output: $0.015 per 1K tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GPT-4 Turbo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Input: $0.01 per 1K tokens&lt;/li&gt;
&lt;li&gt;Output: $0.03 per 1K tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GPT-3.5 Turbo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Input: $0.0015 per 1K tokens&lt;/li&gt;
&lt;li&gt;Output: $0.002 per 1K tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Text Embedding (ada-002)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$0.0001 per 1K tokens&lt;/li&gt;
&lt;li&gt;(Sounds cheap until you embed millions of documents)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Token Math That Actually Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1,000 tokens ≈ 750 words&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical customer support query:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User question: 50 tokens&lt;/li&gt;
&lt;li&gt;System prompt: 200 tokens&lt;/li&gt;
&lt;li&gt;Context from knowledge base: 1,000 tokens&lt;/li&gt;
&lt;li&gt;Response: 300 tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total:&lt;/strong&gt; 1,550 tokens per interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost per interaction (GPT-4o):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: 1,250 tokens × $0.005 / 1,000 = $0.00625&lt;/li&gt;
&lt;li&gt;Output: 300 tokens × $0.015 / 1,000 = $0.0045&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total:&lt;/strong&gt; $0.01075 per interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;At scale:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,000 queries/day = $10.75/day = $323/month&lt;/li&gt;
&lt;li&gt;10,000 queries/day = $107/day = $3,225/month&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hidden Costs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fine-Tuning Hosting Fee
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;$1,836/month minimum&lt;/strong&gt; just to host a fine-tuned model. Even if you use it zero times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When worth it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-volume specialized use case (&amp;gt;1M tokens/month)&lt;/li&gt;
&lt;li&gt;Accuracy improvement justifies $22K/year fixed cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When not worth it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Let's fine-tune for better results" (try prompt engineering first)&lt;/li&gt;
&lt;li&gt;Low-volume use cases&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>ai</category>
      <category>openai</category>
      <category>finops</category>
    </item>
    <item>
      <title>SCCM vs WSUS vs Azure Update Manager vs Intune - Which One Do I Actually Use?</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 15:05:41 +0000</pubDate>
      <link>https://forem.com/azurenoob/sccm-vs-wsus-vs-azure-update-manager-vs-intune-which-one-do-i-actually-use-4m56</link>
      <guid>https://forem.com/azurenoob/sccm-vs-wsus-vs-azure-update-manager-vs-intune-which-one-do-i-actually-use-4m56</guid>
      <description>&lt;h2&gt;
  
  
  Three Different Microsoft Reps, Three Different Answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Configuration Manager rep:&lt;/strong&gt; "Keep using SCCM for everything, including Azure."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure architect:&lt;/strong&gt; "Use Azure Update Manager, it's cloud-native and free."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modern Management rep:&lt;/strong&gt; "Migrate to Intune. SCCM is legacy."&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actual Answer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You need all of them.&lt;/strong&gt; Here's why.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Each Tool Actually Does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SCCM (Configuration Manager)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; On-prem servers, complex patch orchestration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing 500+ on-prem Windows servers&lt;/li&gt;
&lt;li&gt;Need staged deployments with approval workflows&lt;/li&gt;
&lt;li&gt;Require detailed compliance reporting for audits&lt;/li&gt;
&lt;li&gt;Have existing SCCM infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-only VMs (expensive licensing)&lt;/li&gt;
&lt;li&gt;Simple patch-and-reboot scenarios&lt;/li&gt;
&lt;li&gt;Mobile devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WSUS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Simple on-prem patching, tight budgets&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small environment (&amp;lt;100 servers)&lt;/li&gt;
&lt;li&gt;No budget for SCCM&lt;/li&gt;
&lt;li&gt;Just need "apply patches monthly"&lt;/li&gt;
&lt;li&gt;Windows updates only (no 3rd party apps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anything requiring reporting&lt;/li&gt;
&lt;li&gt;Azure VMs (why manage another server?)&lt;/li&gt;
&lt;li&gt;macOS or Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure Update Manager
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Azure VMs, hybrid Windows + Linux&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patching Azure VMs (Windows or Linux)&lt;/li&gt;
&lt;li&gt;Want cloud-native management&lt;/li&gt;
&lt;li&gt;Need automatic patching schedules&lt;/li&gt;
&lt;li&gt;No SCCM infrastructure in Azure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On-prem servers (requires Arc)&lt;/li&gt;
&lt;li&gt;3rd party app updates&lt;/li&gt;
&lt;li&gt;Complex orchestration workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Intune
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Endpoints (laptops, tablets, phones)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing user devices&lt;/li&gt;
&lt;li&gt;Remote/hybrid workforce&lt;/li&gt;
&lt;li&gt;Modern cloud-native management&lt;/li&gt;
&lt;li&gt;Windows 10/11 endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers&lt;/li&gt;
&lt;li&gt;Legacy Windows Server 2012/2016&lt;/li&gt;
&lt;li&gt;Complex patch orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload Type&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;On-prem servers&lt;/td&gt;
&lt;td&gt;SCCM or WSUS&lt;/td&gt;
&lt;td&gt;Network access, existing infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Windows VMs&lt;/td&gt;
&lt;td&gt;Azure Update Manager&lt;/td&gt;
&lt;td&gt;Cloud-native, no agent install&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Linux VMs&lt;/td&gt;
&lt;td&gt;Azure Update Manager&lt;/td&gt;
&lt;td&gt;Only option for Azure Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid Arc servers&lt;/td&gt;
&lt;td&gt;Azure Update Manager + Arc&lt;/td&gt;
&lt;td&gt;Unified management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User laptops/desktops&lt;/td&gt;
&lt;td&gt;Intune&lt;/td&gt;
&lt;td&gt;Modern management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy endpoints&lt;/td&gt;
&lt;td&gt;SCCM&lt;/td&gt;
&lt;td&gt;Still need complex deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real-World Example: Our 850-VM Environment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What we use:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SCCM
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;300 on-prem Windows servers&lt;/li&gt;
&lt;li&gt;Why: Existing infrastructure, complex approval workflows for production&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure Update Manager
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;400 Azure Windows VMs&lt;/li&gt;
&lt;li&gt;150 Azure Linux VMs&lt;/li&gt;
&lt;li&gt;Why: Cloud-native, no SCCM licensing cost in Azure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Intune
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;1,200 user endpoints&lt;/li&gt;
&lt;li&gt;Why: Modern management, remote workforce&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WSUS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nothing (deprecated for us)&lt;/li&gt;
&lt;li&gt;Why: SCCM replaced it years ago&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migration Timeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't migrate everything at once.&lt;/strong&gt; Do it by workload:&lt;/p&gt;

&lt;h3&gt;
  
  
  Year 1
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep SCCM for on-prem servers&lt;/li&gt;
&lt;li&gt;Deploy Azure Update Manager for Azure VMs&lt;/li&gt;
&lt;li&gt;Pilot Intune for 10% of endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Year 2
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scale Intune to 100% of endpoints&lt;/li&gt;
&lt;li&gt;Migrate hybrid servers to Arc + Update Manager&lt;/li&gt;
&lt;li&gt;Keep SCCM for legacy servers only&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Year 3
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Retire SCCM as on-prem servers migrate to Azure&lt;/li&gt;
&lt;li&gt;Full Azure Update Manager + Intune environment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Cost Comparison
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SCCM:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$100-$200 per server/year (licensing)&lt;/li&gt;
&lt;li&gt;Plus: Infrastructure costs (servers, SQL, management)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;WSUS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free (Windows Server license includes it)&lt;/li&gt;
&lt;li&gt;But: Manual effort, limited reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Azure Update Manager:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free (included with Azure VMs)&lt;/li&gt;
&lt;li&gt;Pay for Arc agent if managing on-prem ($5/server/month)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Intune:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$6-$8 per user/month (part of M365 bundles)&lt;/li&gt;
&lt;li&gt;Cloud service, no infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #1: "We'll use Intune for servers"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt; Intune is for endpoints, not servers. Use Azure Update Manager.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #2: "We'll keep SCCM in Azure"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Expensive.&lt;/strong&gt; SCCM licensing in Azure costs more than the VMs themselves. Use Update Manager.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Mistake #3: "We'll migrate everything to Intune"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Won't work.&lt;/strong&gt; SCCM has orchestration capabilities Intune doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Guide
&lt;/h2&gt;

&lt;p&gt;Complete decision matrix, migration timeline, and cost calculator:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/sccm-wsus-azure-update-manager-intune-confusion/" rel="noopener noreferrer"&gt;SCCM vs Update Manager Complete Guide&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Patching Azure VMs?&lt;/strong&gt; Azure Update Manager. &lt;strong&gt;Patching on-prem?&lt;/strong&gt; SCCM or WSUS. &lt;strong&gt;Patching laptops?&lt;/strong&gt; Intune. Use the right tool for each workload.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>sccm</category>
      <category>patching</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Azure Hybrid Benefit Mistake That Cost Us $50K</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 15:00:10 +0000</pubDate>
      <link>https://forem.com/azurenoob/the-azure-hybrid-benefit-mistake-that-cost-us-50k-41ga</link>
      <guid>https://forem.com/azurenoob/the-azure-hybrid-benefit-mistake-that-cost-us-50k-41ga</guid>
      <description>&lt;h2&gt;
  
  
  The Audit Email
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Subject:&lt;/strong&gt; Azure Hybrid Benefit Compliance Review&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our reaction:&lt;/strong&gt; "We're compliant. We have SA licenses."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft's finding:&lt;/strong&gt; "Your documentation doesn't prove it."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bill:&lt;/strong&gt; $78,000 back-payment + penalties.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Azure Hybrid Benefit?
&lt;/h2&gt;

&lt;p&gt;Use existing Windows Server or SQL Server licenses in Azure. Saves 40-55% on VM costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; Microsoft audits it. You must prove compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Did Wrong
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mistake #1: No License Inventory
&lt;/h3&gt;

&lt;p&gt;We knew we had Software Assurance (SA). We didn't know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many licenses&lt;/li&gt;
&lt;li&gt;Which SKUs&lt;/li&gt;
&lt;li&gt;When SA expires&lt;/li&gt;
&lt;li&gt;Which VMs were using them&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mistake #2: Assumed Core Mapping
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;We thought:&lt;/strong&gt; 1 license = 1 Azure VM&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; License cores must match Azure VM cores. A 16-core Azure VM needs 16 Windows Server core licenses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mistake #3: No Documentation
&lt;/h3&gt;

&lt;p&gt;Applied AHB in portal. Didn't document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which on-prem license covered which Azure VM&lt;/li&gt;
&lt;li&gt;SA renewal dates&lt;/li&gt;
&lt;li&gt;Core count calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Audit Process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Day 1:&lt;/strong&gt; Microsoft requests license documentation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Day 3:&lt;/strong&gt; We scramble to find Volume License agreements&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2:&lt;/strong&gt; Discover 40% of AHB-enabled VMs lack proper coverage&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4:&lt;/strong&gt; $78K bill arrives&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Do It Right
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: License Inventory
&lt;/h3&gt;

&lt;p&gt;Before enabling AHB:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Count on-prem Windows Server licenses with active SA&lt;/li&gt;
&lt;li&gt;Verify SA expiration dates&lt;/li&gt;
&lt;li&gt;Calculate available Azure core count&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Core Math
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Formula:&lt;/strong&gt; On-prem license cores ÷ 2 = Azure cores covered&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 Windows Server licenses (2-core each) = 200 cores&lt;/li&gt;
&lt;li&gt;200 ÷ 2 = 100 Azure cores covered&lt;/li&gt;
&lt;li&gt;Can apply AHB to VMs totaling 100 cores&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Documentation
&lt;/h3&gt;

&lt;p&gt;Track in spreadsheet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure VM name&lt;/li&gt;
&lt;li&gt;VM core count&lt;/li&gt;
&lt;li&gt;On-prem license ID covering it&lt;/li&gt;
&lt;li&gt;SA expiration date&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Ongoing Monitoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Monthly AHB usage report&lt;/li&gt;
&lt;li&gt;SA renewal tracking&lt;/li&gt;
&lt;li&gt;New VM AHB approval process&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 8-Question Checklist
&lt;/h2&gt;

&lt;p&gt;Before enabling AHB on ANY VM:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do you have Windows Server or SQL Server licenses with active SA?&lt;/li&gt;
&lt;li&gt;Are those licenses assigned to on-prem servers?&lt;/li&gt;
&lt;li&gt;Can you shut down those on-prem servers? (Can't use same license twice)&lt;/li&gt;
&lt;li&gt;Do you have enough license cores for the Azure VM size?&lt;/li&gt;
&lt;li&gt;Is SA expiration &amp;gt; 6 months away?&lt;/li&gt;
&lt;li&gt;Is this documented in your tracking spreadsheet?&lt;/li&gt;
&lt;li&gt;Who approved this AHB usage?&lt;/li&gt;
&lt;li&gt;Can you produce documentation for a Microsoft audit?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any answer is "no" or "I'm not sure" → &lt;strong&gt;Don't enable AHB&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When AHB Makes Sense
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Good use case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrating 100 on-prem VMs to Azure&lt;/li&gt;
&lt;li&gt;Those VMs have SA licenses&lt;/li&gt;
&lt;li&gt;Shutting down on-prem datacenter&lt;/li&gt;
&lt;li&gt;Clear license mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ &lt;strong&gt;Bad use case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev/test VMs (use Dev/Test pricing instead)&lt;/li&gt;
&lt;li&gt;"We think we have SA somewhere"&lt;/li&gt;
&lt;li&gt;Can't find license documentation&lt;/li&gt;
&lt;li&gt;On-prem servers staying active&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Full Guide
&lt;/h2&gt;

&lt;p&gt;Complete AHB compliance checklist, core calculation templates, and documentation requirements:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/azure-hybrid-benefit-50k/" rel="noopener noreferrer"&gt;Azure Hybrid Benefit Complete Guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>licensing</category>
      <category>finops</category>
      <category>compliance</category>
    </item>
    <item>
      <title>The 55-Question Assessment That Prevents Azure Migration Failures</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 14:57:35 +0000</pubDate>
      <link>https://forem.com/azurenoob/the-55-question-assessment-that-prevents-azure-migration-failures-5198</link>
      <guid>https://forem.com/azurenoob/the-55-question-assessment-that-prevents-azure-migration-failures-5198</guid>
      <description>&lt;h2&gt;
  
  
  The Meeting That Should Scare You
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CIO:&lt;/strong&gt; "We're migrating to Azure. How much will it cost?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consultant:&lt;/strong&gt; "$800K, 18 months."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; $2.3M, 28 months, half the apps still on-prem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Migrations Fail
&lt;/h2&gt;

&lt;p&gt;Not technical problems. &lt;strong&gt;Organizational problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nobody knows what applications exist&lt;/li&gt;
&lt;li&gt;Teams can't find installation media&lt;/li&gt;
&lt;li&gt;License compliance is "figure it out later"&lt;/li&gt;
&lt;li&gt;Dependencies discovered in month 14&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The 55 Questions
&lt;/h2&gt;

&lt;p&gt;Before touching Azure Migrate, answer these for EVERY application:&lt;/p&gt;

&lt;h3&gt;
  
  
  Application Basics
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What does this app do? (If nobody knows, retire it)&lt;/li&gt;
&lt;li&gt;Who owns it? (Name + phone number)&lt;/li&gt;
&lt;li&gt;Where's the installation media?&lt;/li&gt;
&lt;li&gt;What's the license model?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dependencies
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What databases does it connect to?&lt;/li&gt;
&lt;li&gt;What APIs does it call?&lt;/li&gt;
&lt;li&gt;What calls it?&lt;/li&gt;
&lt;li&gt;What shared services does it use?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Current State
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;How many VMs?&lt;/li&gt;
&lt;li&gt;What OS versions?&lt;/li&gt;
&lt;li&gt;What's the network topology?&lt;/li&gt;
&lt;li&gt;What's using public IPs?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Business Context
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What's the business impact if it's down?&lt;/li&gt;
&lt;li&gt;When can we migrate it? (Maintenance windows)&lt;/li&gt;
&lt;li&gt;Who approves changes?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Teams skip this.&lt;/strong&gt; They:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy Azure landing zones&lt;/li&gt;
&lt;li&gt;Start Azure Migrate&lt;/li&gt;
&lt;li&gt;Discover in month 6 nobody knows what they own&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Then:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Budget doubles&lt;/li&gt;
&lt;li&gt;Timeline extends&lt;/li&gt;
&lt;li&gt;Political pressure builds&lt;/li&gt;
&lt;li&gt;Consultants suggest "hybrid strategy" (translation: we failed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Actually Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Discovery (Before Azure)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Application inventory&lt;/li&gt;
&lt;li&gt;Dependency mapping&lt;/li&gt;
&lt;li&gt;License audit&lt;/li&gt;
&lt;li&gt;Owner identification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt; 2-3 months&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; $50K-$150K&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Value:&lt;/strong&gt; Prevents $2M+ overruns&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Rationalization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Retire 20-30% of apps (nobody uses them)&lt;/li&gt;
&lt;li&gt;Rehost 40-50% (lift-and-shift)&lt;/li&gt;
&lt;li&gt;Refactor 20-30% (modernize)&lt;/li&gt;
&lt;li&gt;Retain 10% on-prem (compliance, cost)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Azure Deployment
&lt;/h3&gt;

&lt;p&gt;Now you can actually use Azure Migrate successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download the Framework
&lt;/h2&gt;

&lt;p&gt;Complete 55-question assessment with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application questionnaire&lt;/li&gt;
&lt;li&gt;Dependency mapping template&lt;/li&gt;
&lt;li&gt;License compliance checklist&lt;/li&gt;
&lt;li&gt;Week-by-week migration timeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 [Download Migration Assessment Framewor&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloudmigration</category>
      <category>enterprise</category>
      <category>architecture</category>
    </item>
    <item>
      <title>KQL Cheat Sheet for Azure Resource Graph</title>
      <dc:creator>David</dc:creator>
      <pubDate>Fri, 12 Dec 2025 14:54:05 +0000</pubDate>
      <link>https://forem.com/azurenoob/kql-cheat-sheet-for-azure-resource-graph-4pmn</link>
      <guid>https://forem.com/azurenoob/kql-cheat-sheet-for-azure-resource-graph-4pmn</guid>
      <description>&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;No Azure cert teaches operational KQL. AZ-104 shows 2 sample queries. That's it.&lt;/p&gt;

&lt;p&gt;Here's what you actually need: queries for 31,000+ resource environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential Queries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete VM Inventory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type == "microsoft.compute/virtualmachines"
| extend NetworkInterfaceId = tostring(properties.networkProfile.networkInterfaces[0].id)
| join kind=leftouter (
    Resources
    | where type == "microsoft.network/networkinterfaces"
    | project NetworkInterfaceId = id, 
              PrivateIP = tostring(properties.ipConfigurations[0].properties.privateIPAddress)
) on NetworkInterfaceId
| project VMName = name, PrivateIP, resourceGroup, location
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Find Untagged Resources
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where isnull(tags) or array_length(bag_keys(tags)) == 0
| project name, type, resourceGroup
| order by type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Public IP Audit
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resources
| where type =~ 'microsoft.network/publicipaddresses'
| extend ipAddress = properties.ipAddress,
         associatedResource = properties.ipConfiguration.id
| project name, ipAddress, associatedResource, resourceGroup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Performance Tips
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Filter early:&lt;/strong&gt; &lt;code&gt;| where type == ...&lt;/code&gt; before other operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project only needed columns:&lt;/strong&gt; Reduces memory usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;in&lt;/code&gt; for multiple conditions:&lt;/strong&gt; Faster than &lt;code&gt;or&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Full Guide
&lt;/h2&gt;

&lt;p&gt;45+ queries with performance optimization, SQL translation, and advanced techniques:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://azure-noob.com/blog/kql-cheat-sheet-complete/" rel="noopener noreferrer"&gt;Complete KQL Cheat Sheet&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Drop them in comments. Managing Azure at scale? These queries save hours daily.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>kql</category>
      <category>queries</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
