<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[JMcNairTech | Practical IT & Cybersecurity Tips]]></title><description><![CDATA[Straightforward IT fixes, sysadmin tips, and cybersecurity know-how—built for real-world tech challenges]]></description><link>https://jmcnairtech.com</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1754157275550/2810f4e3-7944-4a91-8493-044ade8af4e3.png</url><title>JMcNairTech | Practical IT &amp; Cybersecurity Tips</title><link>https://jmcnairtech.com</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 18:09:05 GMT</lastBuildDate><atom:link href="https://jmcnairtech.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[AZ-104 Project 2: Secure Azure Networking with Azure Bastion (No Public IPs)]]></title><description><![CDATA[Overview
This project focuses on designing and validating a secure Azure network architecture that allows administrators to manage virtual machines without exposing them directly to the public internet.
Instead of relying on public IP addresses, open...]]></description><link>https://jmcnairtech.com/az-104-project-2-secure-azure-networking-with-azure-bastion-no-public-ips</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-project-2-secure-azure-networking-with-azure-bastion-no-public-ips</guid><category><![CDATA[Azure]]></category><category><![CDATA[az-104]]></category><category><![CDATA[azure bastion]]></category><category><![CDATA[networking]]></category><category><![CDATA[projects]]></category><category><![CDATA[Microsoft Entra]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Thu, 01 Jan 2026 02:27:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767234637033/e97f7daa-af5b-4d4a-b91d-77f53f9271f7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-overview">Overview</h2>
<p>This project focuses on designing and validating a <strong>secure Azure network architecture</strong> that allows administrators to manage virtual machines <strong>without exposing them directly to the public internet</strong>.</p>
<p>Instead of relying on public IP addresses, open RDP ports, or jumpbox VMs, administrative access is enforced through <strong>Azure Bastion</strong>, a Microsoft-managed access service.</p>
<p>The objective of this project was to demonstrate how modern Azure environments reduce attack surface by shifting from <strong>network-based access</strong> to <strong>identity-based access</strong>, a core responsibility of an Azure Administrator and a key concept tested in the AZ-104 exam.</p>
<h2 id="heading-problem-statement">Problem Statement</h2>
<p>Traditionally, virtual machines were managed by:</p>
<ul>
<li><p>Assigning public IP addresses</p>
</li>
<li><p>Opening ports like RDP (3389) or SSH (22) to the internet</p>
</li>
<li><p>Relying on firewall rules and passwords for protection</p>
</li>
</ul>
<p>This model significantly increases attack surface and exposes management ports to:</p>
<ul>
<li><p>Internet scanning</p>
</li>
<li><p>Brute-force attacks</p>
</li>
<li><p>Exploitation of protocol vulnerabilities</p>
</li>
</ul>
<p><strong>Organizations need a way to:</strong></p>
<ul>
<li><p>Manage virtual machines securely</p>
</li>
<li><p>Eliminate public exposure</p>
</li>
<li><p>Enforce identity-based access</p>
</li>
<li><p>Maintain operational simplicity</p>
</li>
</ul>
<h2 id="heading-architecture-overview">Architecture Overview</h2>
<p>This project implements a <strong>private Azure network</strong> where virtual machines are never directly reachable from the internet.</p>
<p>Administrative access is provided exclusively through <strong>Azure Bastion</strong>, which requires authentication through Microsoft Entra ID before any network connectivity is established.</p>
<h3 id="heading-high-level-design">High-level design</h3>
<ul>
<li><p>Virtual machines have <strong>no public IP addresses</strong></p>
</li>
<li><p>No inbound internet access is allowed</p>
</li>
<li><p>Azure Bastion serves as the <strong>only management entry point</strong></p>
</li>
<li><p>Access is authenticated and audited via Entra ID</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767233622266/87d0ffef-ce82-4d2f-a3ba-9f655ff909fc.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-network-design">Network Design</h2>
<h3 id="heading-virtual-network">Virtual Network</h3>
<p>A custom virtual network was created with the following address space:</p>
<ul>
<li><strong>VNet address space:</strong> <code>10.0.0.0/16</code></li>
</ul>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Subnet</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>app-subnet</code></td><td>Hosts application / workload virtual machines</td></tr>
<tr>
<td><code>management-subnet</code></td><td>Reserved for future management resources (unused in this project)</td></tr>
<tr>
<td><code>AzureBastionSubnet</code></td><td>Dedicated subnet required for Azure Bastion</td></tr>
</tbody>
</table>
</div><p>Azure Bastion requires a <strong>dedicated subnet named</strong> <code>AzureBastionSubnet</code> with a minimum /26 address range, which was created using Azure’s Bastion subnet purpose to enforce Microsoft’s requirements.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767233492824/5afda96d-42cc-4770-ab82-ead002f6005a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-azure-bastion-deployment">Azure Bastion Deployment</h2>
<p>Azure Bastion was deployed as a <strong>managed PaaS service</strong> within the virtual network.</p>
<p>Key characteristics:</p>
<ul>
<li><p>Deployed into <code>AzureBastionSubnet</code></p>
</li>
<li><p>Uses HTTPS (443) via the Azure Portal</p>
</li>
<li><p>Requires Microsoft Entra ID authentication</p>
</li>
<li><p>Does not expose RDP or SSH ports publicly</p>
</li>
<li><p>No NSGs or custom routing required</p>
</li>
</ul>
<p>Bastion acts as a <strong>secure access broker</strong>, not a jumpbox VM. Administrators connect <em>through</em> Bastion rather than logging <em>into</em> it.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767233667915/2d0154b2-358c-459e-876d-0a8339d40d6e.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-virtual-machine-deployment">Virtual Machine Deployment</h2>
<p>A Windows Server virtual machine was deployed with the following security controls:</p>
<ul>
<li><p><strong>No public IP address</strong></p>
</li>
<li><p>Placed in <code>app-subnet</code></p>
</li>
<li><p>Default NSG behavior only (no inbound internet rules)</p>
</li>
<li><p>RDP enabled internally for administrative access</p>
</li>
</ul>
<p>Because the VM has no public IP and no inbound internet access, it is completely isolated from direct external connectivity.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767233702304/432ad2be-5974-42e9-b6cd-7ac5179f56d1.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-access-amp-security-model">Access &amp; Security Model</h2>
<h3 id="heading-identity-based-access">Identity-based access</h3>
<p>To connect to the VM:</p>
<ol>
<li><p>The administrator authenticates to <strong>Microsoft Entra ID</strong></p>
</li>
<li><p>Access is authorized through Azure RBAC</p>
</li>
<li><p>The connection is initiated via <strong>Azure Bastion</strong></p>
</li>
<li><p>Bastion establishes a private RDP session to the VM</p>
</li>
</ol>
<p>At no point is the VM exposed to the internet.</p>
<p>This design ensures that:</p>
<ul>
<li><p>Identity is verified <strong>before</strong> network access exists</p>
</li>
<li><p>Unauthorized users cannot probe or reach management ports</p>
</li>
<li><p>All access is authenticated and logged</p>
</li>
</ul>
<h2 id="heading-validation-amp-testing">Validation &amp; Testing</h2>
<h3 id="heading-secure-access-validation">Secure access validation</h3>
<ul>
<li><p>The VM was successfully accessed using <strong>Azure Bastion</strong></p>
</li>
<li><p>The RDP session was established entirely within the browser</p>
</li>
<li><p>No public IP was assigned to the VM</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1767233717037/1cdcf94a-bec7-441b-b648-1383cffb1cbd.png" alt /></p>
<h3 id="heading-exposure-validation">Exposure validation</h3>
<ul>
<li><p>VM networking configuration confirms <strong>Public IP: None</strong></p>
</li>
<li><p>No inbound rules allowing internet traffic exist</p>
</li>
<li><p>Direct RDP from an external machine is not possible</p>
</li>
</ul>
<p>This confirms that administrative access is <strong>fully private and identity controlled</strong>.</p>
<h2 id="heading-key-takeaways">Key Takeaways</h2>
<ul>
<li><p>Public IP addresses are not required for VM management</p>
</li>
<li><p>Azure Bastion reduces attack surface</p>
</li>
<li><p>Identity-based access is more secure than network-based exposure</p>
</li>
<li><p>Secure architectures can be simple and cost-effective</p>
</li>
<li><p>Azure-native services can replace legacy jumpbox patterns</p>
</li>
</ul>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>This project demonstrates how Azure administrators can design secure-by-default environments by eliminating public exposure and enforcing identity-based access. By leveraging Azure Bastion, administrative connectivity is tightly controlled, audited, and aligned with modern Zero Trust principles.</p>
<p>This architecture mirrors real-world Azure environments where security, simplicity, and operational efficiency are prioritized.</p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Project 1: Azure Identity & Access Management (RBAC + MFA)]]></title><description><![CDATA[This project is part of my hands-on preparation for the Microsoft AZ-104 (Azure Administrator) certification. The objective was to design, implement, and validate a secure Azure identity and access model using Microsoft Entra ID, Azure RBAC, and mult...]]></description><link>https://jmcnairtech.com/az-104-project-1-azure-identity-and-access-management-rbac-mfa</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-project-1-azure-identity-and-access-management-rbac-mfa</guid><category><![CDATA[Azure]]></category><category><![CDATA[projects]]></category><category><![CDATA[microsoft-entra-id]]></category><category><![CDATA[rbac]]></category><category><![CDATA[az-104]]></category><category><![CDATA[cloud security]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 27 Dec 2025 00:14:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766794304979/eb79dd12-0076-467b-8de3-6f8278593dea.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This project is part of my hands-on preparation for the Microsoft AZ-104 (Azure Administrator) certification. The objective was to design, implement, and validate a secure Azure identity and access model using Microsoft Entra ID, Azure RBAC, and multi-factor authentication (MFA).</p>
<h2 id="heading-overview">Overview</h2>
<p>Identity is the foundation of security in Azure. Before deploying workloads, organizations must define who can access resources, what actions they are allowed to perform, and how access is protected.</p>
<p>In this project, I implemented a secure identity and access model using Microsoft Entra ID and Azure Role-Based Access Control (RBAC). The focus was on <strong>least-privilege access</strong>, <strong>role separation</strong>, and <strong>MFA enforcement</strong> — core responsibilities of an Azure Administrator in real production environments.</p>
<p>This project aligns directly with <strong>AZ-104 exam objectives</strong> and reflects real-world Azure administration practices.</p>
<h2 id="heading-business-problem">Business Problem</h2>
<p>Organizations must answer three critical questions before creating any resources in Azure:</p>
<ol>
<li><p>Who should be able to access Azure resources?</p>
</li>
<li><p>What level of access does each role require?</p>
</li>
<li><p>How is access protected if credentials are compromised?</p>
</li>
</ol>
<p>Without proper role separation and MFA enforcement, cloud environments are exposed to misconfiguration, unauthorized changes, and security incidents.</p>
<h2 id="heading-architecture-overview">Architecture Overview</h2>
<p>This project uses Microsoft Entra ID for identity management and Azure RBAC for authorization.</p>
<p><strong>Access model:</strong></p>
<ul>
<li><p>Azure administrators manage resources</p>
</li>
<li><p>Helpdesk users have read-only visibility</p>
</li>
<li><p>MFA is required before Azure access is granted</p>
</li>
</ul>
<p><strong>Core components:</strong></p>
<ul>
<li><p>Microsoft Entra ID users and security groups</p>
</li>
<li><p>Azure RBAC at subscription and resource group scopes</p>
</li>
<li><p>Microsoft Entra Security Defaults for MFA enforcement</p>
</li>
<li><p>Audit and sign-in logs for validation</p>
</li>
</ul>
<p><strong>The diagram below illustrates the identity authentication and authorization flow implemented in this project.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766788027726/8e6ec265-21d8-4bec-86a4-e904ceb08608.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-identity-amp-rbac-design">Identity &amp; RBAC Design</h2>
<h3 id="heading-users-and-groups">Users and Groups</h3>
<p>The following users were created for validation:</p>
<ul>
<li><p><strong>cloudadmin.lab</strong> – Azure administrator account</p>
</li>
<li><p><strong>helpdesk.lab</strong> – Helpdesk / support user</p>
</li>
<li><p><strong>breakglass.lab</strong> – Emergency access account</p>
</li>
</ul>
<p>Access was assigned using <strong>security groups</strong> instead of individual users to reflect enterprise best practices:</p>
<ul>
<li><p><strong>Azure-Admins</strong></p>
</li>
<li><p><strong>Helpdesk-Ops</strong></p>
</li>
</ul>
<p>Group-based RBAC simplifies permission management and scales effectively as environments grow.</p>
<h3 id="heading-role-assignments">Role Assignments</h3>
<p>Azure RBAC roles were assigned as follows:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Group</td><td>Role</td><td>Scope</td></tr>
</thead>
<tbody>
<tr>
<td>Azure-Admins</td><td>Contributor</td><td>Subscription</td></tr>
<tr>
<td>Helpdesk-Ops</td><td>Reader</td><td>Resource Group</td></tr>
</tbody>
</table>
</div><p><strong>Why Contributor instead of Owner?</strong><br />Contributor enables full resource management without allowing role assignment changes, reducing the risk of privilege escalation.</p>
<p><strong>Why Reader for Helpdesk?</strong><br />Helpdesk users can view resources and assist with troubleshooting while being prevented from making configuration changes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766788240498/a8a1ab33-5abb-4056-9cb8-cfb20839474f.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-mfa-enforcement">MFA Enforcement</h2>
<p>Custom Conditional Access policies require Microsoft Entra ID Premium licensing. Since this tenant did not include that license, <strong>Microsoft Entra Security Defaults</strong> were enabled instead.</p>
<p>Security Defaults enforce:</p>
<ul>
<li><p>Mandatory MFA for users and administrators</p>
</li>
<li><p>Blocking of legacy authentication protocols</p>
</li>
<li><p>Microsoft-managed Conditional Access policies</p>
</li>
</ul>
<p>MFA enforcement was validated when <strong>helpdesk.lab</strong> was required to register an MFA method before accessing the Azure portal.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766788309126/4d148719-d01d-4956-98fd-7fd9ad0e5631.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-validation-amp-testing">Validation &amp; Testing</h2>
<h3 id="heading-rbac-validation">RBAC Validation</h3>
<p>To confirm least-privilege access enforcement:</p>
<ul>
<li><p>The <strong>helpdesk.lab</strong> account attempted to create an Azure resource</p>
</li>
<li><p>Azure denied the action due to insufficient permissions</p>
</li>
</ul>
<p>This validated that the Reader role was correctly enforced at the resource group scope.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766788470922/c4fd4b3d-0b70-45d8-a9dc-991d6e2778e3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-logging-amp-auditability">Logging &amp; Auditability</h2>
<p>Audit logs confirmed:</p>
<ul>
<li><p>Group membership changes</p>
</li>
<li><p>RBAC role assignments</p>
</li>
<li><p>Security configuration updates</p>
</li>
</ul>
<p>Sign-in logs may experience brief propagation delays in smaller tenants; however, MFA enforcement was verified through mandatory MFA registration and successful authenticated access.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766792520416/c59d1e6a-7d38-47cb-96d8-bc9ccf229bb3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-key-takeaways">Key Takeaways</h2>
<ul>
<li><p>Identity is the primary security perimeter in Azure</p>
</li>
<li><p>Group-based RBAC enables scalable access control</p>
</li>
<li><p>Least-privilege access reduces security and operational risk</p>
</li>
<li><p>MFA enforcement is essential, even in small environments</p>
</li>
<li><p>Azure identity controls behave consistently across lab and production environments</p>
</li>
</ul>
<h2 id="heading-skills-demonstrated">Skills Demonstrated</h2>
<ul>
<li><p>Microsoft Entra ID administration</p>
</li>
<li><p>Azure RBAC design and validation</p>
</li>
<li><p>Least-privilege access modeling</p>
</li>
<li><p>MFA enforcement using Security Defaults</p>
</li>
<li><p>Azure identity and access troubleshooting</p>
</li>
</ul>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>This project demonstrates how Azure identity and access controls are designed, implemented, and validated in real environments. The focus on security, governance, and verification reflects the expectations of an Azure Administrator role rather than a theoretical exercise.</p>
]]></content:encoded></item><item><title><![CDATA[Modern Azure VM Monitoring (2025): AMA, DCR, DCE, Log Analytics & Alerts — Complete Hands-On Lab (AZ-104)]]></title><description><![CDATA[By Joshua McNair — jmcnairtech.com
Monitoring is one of the most critical responsibilities of an Azure Administrator — and one of the most heavily tested subjects on the AZ-104 exam. Azure’s monitoring ecosystem has evolved dramatically, and today it...]]></description><link>https://jmcnairtech.com/modern-azure-vm-monitoring-2025-ama-dcr-dce-log-analytics-and-alerts-complete-hands-on-lab-az-104</link><guid isPermaLink="true">https://jmcnairtech.com/modern-azure-vm-monitoring-2025-ama-dcr-dce-log-analytics-and-alerts-complete-hands-on-lab-az-104</guid><category><![CDATA[Azure]]></category><category><![CDATA[az-104]]></category><category><![CDATA[Azure Monitor]]></category><category><![CDATA[Azure Log Analytics]]></category><category><![CDATA[Cloud Engineering ]]></category><category><![CDATA[Microsoft]]></category><category><![CDATA[Devops]]></category><category><![CDATA[cloud-monitoring]]></category><category><![CDATA[System administration]]></category><category><![CDATA[windows server]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 30 Nov 2025 15:07:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1764513936116/f9543beb-b744-42a4-a060-451455146b38.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>By Joshua McNair —</em> <a target="_blank" href="http://jmcnairtech.com"><em>jmcnairtech.com</em></a></p>
<p>Monitoring is one of the most critical responsibilities of an Azure Administrator — and one of the most heavily tested subjects on the AZ-104 exam. Azure’s monitoring ecosystem has evolved dramatically, and today it revolves around a modern, modular pipeline that gives you full control over what data is collected and where it flows.</p>
<p>In this hands-on lab, you’ll build the <strong>full 2025 Azure monitoring pipeline manually</strong>, including:</p>
<ul>
<li><p><strong>Azure Monitor Agent (AMA)</strong></p>
</li>
<li><p><strong>Data Collection Endpoint (DCE)</strong></p>
</li>
<li><p><strong>Data Collection Rules (DCR)</strong></p>
</li>
<li><p><strong>Log Analytics Workspace (LAW)</strong></p>
</li>
<li><p><strong>Metric alerts + Action Groups</strong></p>
</li>
<li><p><strong>KQL log queries</strong></p>
</li>
<li><p><strong>Azure Monitor Workbooks</strong></p>
</li>
</ul>
<p>This approach is the standard used in many enterprise environments — and it is the version of monitoring Microsoft expects you to understand for the AZ-104 exam as of November 2025.</p>
<p>Unlike the automatic “Enable Insights” button, the manual pipeline ensures:</p>
<ul>
<li><p>You control <em>exactly</em> which counters and event logs are collected</p>
</li>
<li><p>You choose the workspace</p>
</li>
<li><p>You understand the DCE + DCR architecture</p>
</li>
<li><p>Your KQL tables load correctly</p>
</li>
<li><p>No hidden, auto-generated resources</p>
</li>
<li><p>Monitoring is predictable and consistent across environments</p>
</li>
</ul>
<p>This is the cleanest, most exam-accurate, and most professional way to configure Azure VM monitoring</p>
<h1 id="heading-what-youll-build-architecture-overview"><strong>What You’ll Build (Architecture Overview)</strong></h1>
<p>You will deploy the full monitoring chain:</p>
<ol>
<li><p><strong>Log Analytics Workspace (LAW)</strong><br /> Stores performance logs, events, and KQL data.</p>
</li>
<li><p><strong>Data Collection Endpoint (DCE)</strong><br /> The secure endpoint AMA sends data to.</p>
</li>
<li><p><strong>Data Collection Rule (DCR)</strong><br /> Defines which performance counters and logs are collected and where they go.</p>
</li>
<li><p><strong>Azure Monitor Agent (AMA)</strong><br /> Installed on the VM and connected to the DCE + DCR + workspace.</p>
</li>
<li><p><strong>Metric Alerts</strong><br /> Lightweight alerts based on platform metrics.</p>
</li>
<li><p><strong>KQL Queries</strong><br /> Validate Perf, Heartbeat, and InsightsMetrics tables.</p>
</li>
<li><p><strong>Monitor Workbook</strong><br /> Build a dashboard visualizing the collected data.</p>
</li>
</ol>
<p>This architecture is used in real-world monitoring scenarios for Azure VMs, Azure Arc servers, AKS nodes, and hybrid resources.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764450933140/f0ccdc5c-afa7-4142-bec5-9e2462bcff4f.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-lab-requirements"><strong>Lab Requirements</strong></h1>
<ul>
<li><p>Azure subscription (free trial works)</p>
</li>
<li><p>Region: <strong>East US</strong></p>
</li>
<li><p>One VM (Windows Server 2022 recommended)</p>
</li>
<li><p>60–90 minutes</p>
</li>
<li><p>Very small ingestion charges may apply</p>
</li>
</ul>
<h1 id="heading-part-1-create-the-virtual-machine"><strong>PART 1 — Create the Virtual Machine</strong></h1>
<h2 id="heading-step-11-create-a-resource-group"><strong>Step 1.1 — Create a Resource Group</strong></h2>
<p>Azure Portal → <strong>Resource groups → Create</strong></p>
<ul>
<li><p>Name: <strong>rg-az104-monitoring-lab</strong></p>
</li>
<li><p>Region: same region for all resources</p>
</li>
</ul>
<p>Click <strong>Review + create → Create</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764451659125/f1130eea-0bf9-4195-9408-fec4f98093d9.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-12-create-the-vm"><strong>Step 1.2 — Create the VM</strong></h2>
<p>Azure Portal → <strong>Virtual Machines → Create → Azure virtual machine</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Setting</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>VM Name</td><td>LabVM01</td></tr>
<tr>
<td>Region</td><td>East US</td></tr>
<tr>
<td>Image</td><td>Windows Server 2022 Datacenter</td></tr>
<tr>
<td>Size</td><td>Standard_B2s</td></tr>
<tr>
<td>Username</td><td>labadmin</td></tr>
<tr>
<td>Password</td><td>secure password</td></tr>
<tr>
<td>Inbound ports</td><td>RDP (3389)</td></tr>
</tbody>
</table>
</div><p>Click <strong>Next: Disks</strong> → accept defaults.</p>
<p>Click <strong>Next: Networking</strong> → accept defaults.</p>
<p>Click <strong>Next: Management</strong> → Disable everything for this lab:</p>
<p>Click <strong>Next: Monitoring</strong> → Enable <strong>Boot Diagnostics</strong>: Enable with managed storage account (recommended)</p>
<p>Click <strong>Next → Advanced</strong></p>
<ul>
<li><p>Do <strong>NOT</strong> add extensions</p>
</li>
<li><p>Do <strong>NOT</strong> add VM applications</p>
</li>
</ul>
<p>Click <strong>Review + create → Create</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764452102420/488a366b-c25e-4161-badb-c3d5e1daa790.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-part-2-connect-to-the-vm">PART 2 — Connect to the VM</h1>
<h2 id="heading-step-21-navigate-to-the-vm">Step 2.1 — Navigate to the VM</h2>
<p>Azure Portal → <strong>Virtual Machines → LabVM01</strong></p>
<p>Ensure:</p>
<ul>
<li><p>Status: <strong>Running</strong></p>
</li>
<li><p>Public IP assigned</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764453486660/b7359d72-b858-4ee9-8a59-133a26f60259.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-22-connect-using-rdp"><strong>Step 2.2 — Connect using RDP</strong></h2>
<p>Left menu → <strong>Connect → RDP → Download RDP File</strong></p>
<p>Login:</p>
<ul>
<li><p>Username: labadmin</p>
</li>
<li><p>Password: your password</p>
</li>
</ul>
<p>You are now inside the VM.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764453804678/83bb74a4-7224-430d-9f44-f55960c3ac32.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-part-3-check-the-pre-monitoring-state"><strong>PART 3 — Check the Pre-Monitoring State</strong></h1>
<p>Before enabling advanced monitoring:</p>
<p>Azure Portal → <strong>LabVM01 → Insights</strong></p>
<p>You should see:</p>
<ul>
<li><p>Basic CPU graph (host metrics)</p>
</li>
<li><p>Availability</p>
</li>
<li><p>Basic platform data</p>
</li>
</ul>
<p>You will <strong>NOT</strong> see full performance charts yet.</p>
<p>This confirms AMA, DCR, and workspace is not active.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764454161497/865d0dc9-d4bb-40d7-98cf-7830809fed74.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-part-4-create-the-log-analytics-workspace">PART 4 — Create the Log Analytics Workspace</h1>
<p>Azure Portal → <strong>Log Analytics workspaces → Create</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Field</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>Resource group</td><td>rg-az104-monitoring-lab</td></tr>
<tr>
<td>Name</td><td>lab6-monitoring</td></tr>
<tr>
<td>Region</td><td>East US</td></tr>
</tbody>
</table>
</div><p>Click <strong>Review + create → Create</strong></p>
<p>This workspace will store your VM logs.</p>
<h1 id="heading-part-5-create-the-data-collection-endpoint-dce"><strong>PART 5 — Create the Data Collection Endpoint (DCE)</strong></h1>
<p>Azure Portal → <strong>Monitor → Data Collection endpoints → Create</strong></p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Field</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>Name</td><td><strong>dce-az104-monitoring</strong></td></tr>
<tr>
<td>Resource group</td><td>rg-az104-monitoring-lab</td></tr>
<tr>
<td>Region</td><td>East US</td></tr>
</tbody>
</table>
</div><p>You now have:</p>
<ul>
<li><p>A VM</p>
</li>
<li><p>A Log Analytics Workspace</p>
</li>
<li><p>A Data Collection Endpoint</p>
</li>
</ul>
<p>Next, you will create the Data Collection Rule (DCR) that defines <strong>what data the VM will send to the workspace</strong>.</p>
<h1 id="heading-part-6-create-the-data-collection-rule-dcr"><strong>PART 6 — Create the Data Collection Rule (DCR)</strong></h1>
<p>Azure Portal → <strong>Monitor</strong> → <strong>Data Collection Rules</strong> → <strong>Create</strong></p>
<p>Fill out the Basics tab:</p>
<ul>
<li><p><strong>Name:</strong><br />  <code>dcr-az104-monitoring</code></p>
</li>
<li><p><strong>Subscription:</strong><br />  Your subscription</p>
</li>
<li><p><strong>Resource group:</strong><br />  <code>rg-az104-monitoring-lab</code></p>
</li>
<li><p><strong>Region:</strong><br />  Same as your VM (East US)</p>
</li>
<li><p><strong>Platform Type:</strong><br />  <strong>Windows</strong></p>
</li>
<li><p><strong>Data Collection Endpoint:</strong><br />  Select your endpoint:<br />  <code>dce-az104-monitoring</code></p>
</li>
</ul>
<p>Click <strong>Next: Resources</strong></p>
<h2 id="heading-step-62-assign-dcr-to-the-vm"><strong>Step 6.2 — Assign DCR to the VM</strong></h2>
<p>On the <strong>Resources</strong> tab:</p>
<p>Click <strong>Add resources</strong> → select: <code>LabVM01</code></p>
<p>Click <strong>Apply</strong></p>
<p>Click <strong>Next: Collect and deliver</strong></p>
<h2 id="heading-step-63-add-a-data-source"><strong>Step 6.3 — Add a Data Source</strong></h2>
<p>You should now be on the <strong>Collect and deliver</strong> tab.</p>
<p>Click:</p>
<p><strong>+ Add data source</strong></p>
<p>A panel opens with two tabs: <em>Data source</em> and <em>Destination</em>.</p>
<p>Stay on <strong>Data source</strong>.</p>
<h2 id="heading-step-64-configure-performance-counters">Step 6.4 — Configure Performance Counters</h2>
<p>Under <strong>Data source type</strong>, choose: <strong>Performance Counters</strong></p>
<p>Below that, select:</p>
<p><strong>Basic</strong> (recommended)</p>
<p>This automatically enables the 4 standard counters:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Performance Counter</td><td>Sample Rate</td></tr>
</thead>
<tbody>
<tr>
<td>CPU</td><td>60 seconds</td></tr>
<tr>
<td>Memory</td><td>60 seconds</td></tr>
<tr>
<td>Disk</td><td>60 seconds</td></tr>
<tr>
<td>Network</td><td>60 seconds</td></tr>
</tbody>
</table>
</div><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764455513662/5790dafb-cd14-44ec-9e54-7f8ba33d5bb2.png" alt /></p>
<p>Leave all four selected<br />Leave sample rates at <strong>60 seconds</strong></p>
<p>Click <strong>Next (Destination)</strong></p>
<h1 id="heading-65-select-destinations-mandatory"><strong>6.5 — Select Destinations (Mandatory)</strong></h1>
<p>This is where many people get stuck — but the choices are simple:</p>
<p><strong>Destination type:</strong> <code>Azure Monitor Logs</code></p>
<p><strong>Subscription:</strong> Your Subscription</p>
<p><strong>Destination details:</strong> <code>Lab 6 Monitoring</code></p>
<p>This sends the performance logs into the <code>Perf</code> and <code>InsightsMetrics</code> tables.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764504700481/75205db5-31b5-409a-9893-a5853b8070ea.png" alt class="image--center mx-auto" /></p>
<p>Click <strong>Next: Tags</strong><br />(You can skip tags.)</p>
<p>Click <strong>Review + Create</strong> → <strong>Create</strong></p>
<p>Your DCR is now live.</p>
<h2 id="heading-important-ama-is-automatically-installed-on-the-vm-as-soon-as-you-attach-the-vm-to-a-dcr"><strong>Important - AMA is automatically installed on the VM as soon as you attach the VM to a DCR.</strong></h2>
<p>You do <strong>NOT</strong> manually install AMA under Extensions.</p>
<p>You do <strong>NOT</strong> click “Enable Insights” inside the VM.</p>
<p><strong>Assigning the VM to a DCR triggers a background deployment of AMA.</strong></p>
<p>Azure handles it for you.</p>
<h1 id="heading-result-after-part-6"><strong>RESULT AFTER PART 6</strong></h1>
<p>You now have the <strong>full monitoring ingestion pipeline configured:</strong></p>
<ul>
<li><p>AMA (auto-installed when DCR is applied)</p>
</li>
<li><p>DCE created</p>
</li>
<li><p>DCR created and assigned</p>
</li>
<li><p>Performance collection configured</p>
</li>
<li><p>Data flowing to LAW (incoming within ~10 minutes)</p>
</li>
</ul>
<p>This is exactly how Azure Monitor works in production.</p>
<h1 id="heading-part-7-create-a-high-cpu-metric-alert">PART 7 — Create a High-CPU Metric Alert</h1>
<p>Azure Portal → <strong>Virtual Machines → LabVM01 → Alerts</strong></p>
<h2 id="heading-step-71-create-new-alert-rule">Step 7.1 — Create New Alert Rule</h2>
<p>Click <strong>Create alert rule</strong>.</p>
<p>Under <em>Condition</em> → <strong>Add condition</strong></p>
<p>Search for metric: <strong>Percentage CPU</strong></p>
<p>Configure:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Setting</td><td>Value</td></tr>
</thead>
<tbody>
<tr>
<td>Threshold type</td><td>Static</td></tr>
<tr>
<td>Value is</td><td>Greater than</td></tr>
<tr>
<td>Threshold</td><td>75</td></tr>
<tr>
<td>Aggregation type</td><td>Average</td></tr>
<tr>
<td>Check every</td><td>5 minutes</td></tr>
<tr>
<td>Loopback period</td><td>5 minutes</td></tr>
</tbody>
</table>
</div><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764507746008/f4304fd2-c880-4cea-af22-ce2a9179def3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-72-create-an-action-group"><strong>Step 7.2 — Create an Action Group</strong></h2>
<p>Under Action Group → <strong>Create action group</strong></p>
<h2 id="heading-step-73-basics-tab">Step 7.3 — Basics Tab</h2>
<p><strong>Project details:</strong></p>
<ul>
<li><p><strong>Subscription:</strong> Your subscription</p>
</li>
<li><p><strong>Resource group:</strong> <code>rg-az104-monitoring-lab</code></p>
</li>
<li><p><strong>Region:</strong> <code>Global</code><br />  <em>(Action Groups are always Global — this is correct)</em></p>
</li>
</ul>
<p>Click <strong>Next: Notifications</strong></p>
<h4 id="heading-notifications-tab"><strong>Notifications Tab</strong></h4>
<p>Click <strong>+ Add notification</strong></p>
<p>Configuration:</p>
<ul>
<li><p><strong>Notification type:</strong> Email/SMS message/Push/Voice</p>
</li>
<li><p><strong>Name:</strong> <code>emailNotify</code></p>
</li>
<li><p><strong>Channel:</strong> Email</p>
</li>
<li><p><strong>Email address:</strong> your email address</p>
</li>
</ul>
<p>Click <strong>OK</strong>, then <strong>Next: Actions</strong></p>
<h4 id="heading-actions-tab"><strong>Actions Tab</strong></h4>
<p>Leave blank → Click <strong>Next: Tags</strong><br />Skip tags → Click <strong>Review + create</strong> → <strong>Create</strong></p>
<p>Your Action Group is now created.</p>
<h2 id="heading-step-74-attach-action-group-to-the-alert-rule"><strong>Step 7.4 — Attach Action Group to the Alert Rule</strong></h2>
<p>Back in the alert rule wizard:</p>
<ul>
<li>Under <strong>Actions</strong>, select the new Action Group:<br />  <strong>ag-az104-notify</strong></li>
</ul>
<p>Click <strong>Next: Details</strong></p>
<h2 id="heading-step-75-complete-the-alert-rule">Step 7.5 - Complete the Alert Rule</h2>
<p>Set:</p>
<ul>
<li><p><strong>Alert rule name:</strong> <code>ar-az104-highcpu</code></p>
</li>
<li><p><strong>Severity:</strong> 2 (Warning)</p>
</li>
<li><p><strong>Enable upon creation:</strong></p>
</li>
</ul>
<p>Click <strong>Review + create</strong> → <strong>Create</strong></p>
<p>Your CPU alert is now active.</p>
<h1 id="heading-part-8-validate-log-ingestion-with-kql"><strong>PART 8 — Validate Log Ingestion with KQL</strong></h1>
<p>Now that AMA + DCR are attached to the VM, we verify that logs are flowing into your Log Analytics Workspace.</p>
<h2 id="heading-step-81-open-the-kql-query-interface">Step 8.1 — Open the KQL Query Interface</h2>
<p>Azure Portal → <strong>Monitor</strong><br />Left menu → <strong>Logs</strong></p>
<p>If prompted for a scope:</p>
<ul>
<li><p>Resource type: <strong>Log Analytics Workspace</strong></p>
</li>
<li><p>Workspace: <strong>lab6-monitoring</strong></p>
</li>
</ul>
<p>Click <strong>Apply</strong>.</p>
<p>You are now inside the KQL query editor.</p>
<h2 id="heading-step-82-validate-vm-connectivity-heartbeat">Step 8.2 — Validate VM Connectivity (Heartbeat)</h2>
<p>Run:</p>
<p><code>Heartbeat | where Computer == "LabVM01" | sort by TimeGenerated desc</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764510020243/c620d63e-92f8-4eff-94b7-68d454d8afca.png" alt class="image--center mx-auto" /></p>
<p>If you see rows → AMA is connected and reporting.</p>
<h2 id="heading-step-83-validate-performance-counters-perf-table">Step 8.3 — Validate Performance Counters (Perf Table)</h2>
<p>Run:</p>
<p><code>Perf | where Computer == "LabVM01" | summarize Count = count() by ObjectName, CounterName | sort by ObjectName asc</code></p>
<p>You should see:</p>
<ul>
<li><p>Processor</p>
</li>
<li><p>Memory</p>
</li>
<li><p>LogicalDisk</p>
</li>
<li><p>Network Interface</p>
</li>
</ul>
<p>This confirms the DCR is collecting CPU, memory, disk, and network counters.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764510271154/3484c11a-e3aa-4f71-8b93-48bdca413a65.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-84-generate-a-cpu-spike-inside-the-vm">Step 8.4 - Generate a CPU Spike (Inside the VM)</h2>
<p>Inside <strong>LabVM01</strong>, open <strong>PowerShell</strong> and temporarily stress the CPU:</p>
<p><code>while ($true) { 1..50000 | ForEach-Object { [Math]::Sqrt($_) } }</code></p>
<p>Let this run for 60–90 seconds.<br />It will push CPU to 80–100%.</p>
<p>Close the PowerShell window to stop the loop.</p>
<p>This generates real performance data for the Perf table and will also trigger the High-CPU alert we created earlier.</p>
<h1 id="heading-step-85-validate-the-cpu-spike-in-log-analytics"><strong>Step 8.5 — Validate the CPU Spike in Log Analytics</strong></h1>
<p>Run the following KQL in your Log Analytics Workspace:</p>
<p><code>Perf | where Computer == "LabVM01" | where CounterName == "% Processor Time" | sort by TimeGenerated desc</code></p>
<p>You should see:</p>
<ul>
<li><p>A sharp jump in CPU percentage</p>
</li>
<li><p>Several Perf entries around the timestamp when the spike occurred</p>
</li>
</ul>
<p>This confirms:</p>
<ul>
<li><p>AMA is functioning</p>
</li>
<li><p>DCR is collecting Perf</p>
</li>
<li><p>The VM is sending data to LAW</p>
</li>
<li><p>Alerts will fire correctly</p>
</li>
<li><p>Monitoring pipeline is working</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764511873377/3d94e935-7758-4daf-914c-014218f83ba1.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-result-after-part-8"><strong>RESULT AFTER PART 8</strong></h1>
<p>You have verified:</p>
<ul>
<li><p>AMA is installed</p>
</li>
<li><p>Heartbeat data is flowing</p>
</li>
<li><p>Perf counters are flowing</p>
</li>
<li><p>CPU spike is visible in KQL</p>
</li>
<li><p>Alert rule will trigger</p>
</li>
<li><p>Log Analytics Workspace is receiving data</p>
</li>
</ul>
<p>Your VM is successfully sending monitoring data into Azure Monitor.</p>
<h1 id="heading-part-9-build-an-azure-monitor-workbook-visual-dashboard"><strong>PART 9 — Build an Azure Monitor Workbook (Visual Dashboard)</strong></h1>
<p>Workbooks let you visualize performance and insights from your VM.</p>
<h2 id="heading-step-91-create-a-new-workbook"><strong>Step 9.1 — Create a New Workbook</strong></h2>
<p>Azure Portal → <strong>Monitor</strong><br />Left menu → <strong>Workbooks</strong><br />Click <strong>+ New</strong></p>
<p>A blank workbook opens.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764512211096/0d390826-d9bc-416d-a994-d9ca5b00cb63.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-92-add-a-cpu-chart"><strong>Step 9.2 — Add a CPU Chart</strong></h2>
<ol>
<li><p>Click <strong>Add</strong> → <strong>Add query</strong></p>
</li>
<li><p>Ensure your workspace is set to <strong>lab6-monitoring</strong></p>
</li>
<li><p>Run:</p>
<p> <code>Perf | where Computer == "LabVM01" | where CounterName == "% Processor Time" | summarize AvgCPU = avg(CounterValue) by bin(TimeGenerated, 5m)</code></p>
</li>
<li><p>Visualization → <strong>Line chart</strong></p>
</li>
<li><p>Title: <strong>CPU Usage (5m Average)</strong></p>
</li>
</ol>
<p>Click <strong>Save</strong> inside the query pane.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764512482775/d5ae80c3-bd99-4d35-ba43-9b4aa606ea21.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-93-add-a-memory-chart"><strong>Step 9.3 — Add a Memory Chart</strong></h2>
<p><code>Perf | where Computer == "LabVM01" | where CounterName == "Available MBytes" | summarize AvgMem = avg(CounterValue) by bin(TimeGenerated, 5m)</code></p>
<p>Visualization → <strong>Line chart</strong><br />Title: <strong>Available Memory (MB)</strong></p>
<h2 id="heading-step-94-add-a-disk-activity-chart">Step 9.4 — Add a Disk Activity Chart</h2>
<p><code>Perf | where Computer == "LabVM01" | where ObjectName == "LogicalDisk" | summarize AvgIO = avg(CounterValue) by bin(TimeGenerated, 5m)</code></p>
<p>Visualization → <strong>Line chart</strong><br />Title: <strong>Disk Activity</strong></p>
<h2 id="heading-step-95-add-heartbeat-table">Step 9.5 — Add Heartbeat Table</h2>
<p><code>Heartbeat | where Computer == "LabVM01" | sort by TimeGenerated desc</code></p>
<p>Visualization → <strong>Table</strong><br />Title → <strong>Heartbeat Logs</strong></p>
<h2 id="heading-step-96-save-the-workbook"><strong>Step 9.6 — Save the Workbook</strong></h2>
<p>Top: <strong>Save</strong></p>
<p>Name:<br /><strong>Azure VM Monitoring Dashboard</strong></p>
<p>Resource Group:<br /><strong>rg-az104-monitoring-lab</strong></p>
<p>Click <strong>Save</strong></p>
<p>You now have a complete, custom dashboard.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1764512797693/75b084a1-9cbd-40c2-a7d0-a905fd6d7778.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-part-10-final-validation-checklist-2025-azure-monitor-pipeline"><strong>PART 10 — Final Validation Checklist (2025 Azure Monitor Pipeline)</strong></h1>
<p>Before closing the lab, verify that each component in your monitoring pipeline is working as expected. This ensures your configuration matches real-world Azure monitoring architecture and AZ-104 exam requirements.</p>
<h2 id="heading-log-analytics-workspace-law"><strong>Log Analytics Workspace (LAW)</strong></h2>
<ul>
<li><p>Workspace exists in <strong>East US</strong></p>
</li>
<li><p>Data tables (<strong>Perf</strong>, <strong>Heartbeat</strong>) are receiving entries</p>
</li>
<li><p>KQL queries return results without errors</p>
</li>
</ul>
<h2 id="heading-data-collection-endpoint-dce"><strong>Data Collection Endpoint (DCE)</strong></h2>
<ul>
<li><p>Provisioning state = <strong>Succeeded</strong></p>
</li>
<li><p>Region matches the VM, LAW, and DCR</p>
</li>
<li><p>Connected to the DCR</p>
</li>
</ul>
<h2 id="heading-data-collection-rule-dcr"><strong>Data Collection Rule (DCR)</strong></h2>
<ul>
<li><p>Assigned to <strong>LabVM01</strong></p>
</li>
<li><p>Platform Type = Windows</p>
</li>
<li><p>Collects <strong>Basic Performance Counters</strong> (CPU, Memory, Disk, Network)</p>
</li>
<li><p>Sends data to <strong>lab6-monitoring</strong></p>
</li>
</ul>
<h2 id="heading-azure-monitor-agent-ama"><strong>Azure Monitor Agent (AMA)</strong></h2>
<ul>
<li><p>Automatically installed when the DCR was applied</p>
</li>
<li><p>No need to manually install or enable VM Insights</p>
</li>
<li><p>Heartbeat entries appear every 1–5 minutes</p>
</li>
</ul>
<h2 id="heading-kql-log-validation"><strong>KQL Log Validation</strong></h2>
<ul>
<li><p><strong>Heartbeat</strong> table shows connectivity</p>
</li>
<li><p><strong>Perf</strong> table shows performance metrics</p>
</li>
<li><p>CPU spike appears in recent Perf logs</p>
</li>
<li><p>Workspace ingestion pipeline is healthy</p>
</li>
</ul>
<h2 id="heading-azure-monitor-workbook"><strong>Azure Monitor Workbook</strong></h2>
<ul>
<li><p>Custom dashboard created</p>
</li>
<li><p>CPU, Memory, Disk, Heartbeat visualizations display correctly</p>
</li>
<li><p>Shows real metric data collected via DCR</p>
</li>
</ul>
<h2 id="heading-alerts-action-group"><strong>Alerts + Action Group</strong></h2>
<ul>
<li><p>High-CPU alert rule created</p>
</li>
<li><p>Action Group configured with Email/SMS/Push</p>
</li>
<li><p>Alerts will fire when CPU spike occurs</p>
</li>
<li><p>Demonstrates end-to-end monitoring and notification flow</p>
</li>
</ul>
<h1 id="heading-final-summary-azure-monitoring-lab-2025-pipeline"><strong>FINAL SUMMARY — Azure Monitoring Lab (2025 Pipeline)</strong></h1>
<p>In this lab, you built the <strong>complete modern Azure Monitor ingestion pipeline</strong> exactly as used in production environments and expected on the AZ-104 exam. Instead of relying on auto-generated resources from VM Insights, you deployed everything manually:</p>
<ul>
<li><p>A <strong>Log Analytics Workspace</strong> for storing telemetry</p>
</li>
<li><p>A <strong>Data Collection Endpoint</strong> for secure ingestion</p>
</li>
<li><p>A <strong>Data Collection Rule</strong> defining what data to collect</p>
</li>
<li><p>The <strong>Azure Monitor Agent</strong>, automatically deployed</p>
</li>
<li><p>Performance data flowing into <strong>Perf</strong> and <strong>Heartbeat</strong></p>
</li>
<li><p>A <strong>High-CPU Alert Rule</strong> with email notifications</p>
</li>
<li><p>A <strong>Custom Azure Monitor Workbook</strong> for visualization</p>
</li>
</ul>
<p>You validated the entire workflow using a real CPU spike, confirming that the VM is sending logs to your workspace and that Azure Monitor is capturing, storing, analyzing, and alerting on activity.</p>
<p>This hands-on approach gives you a <strong>deep understanding of how Azure monitoring really works</strong>, helps you stand out in job interviews, and builds exactly the skills needed to pass the AZ-104 exam.</p>
<p>Your monitoring environment is now fully operational.<br />You're ready for <strong>advanced monitoring labs</strong> or for integrating this pipeline into real enterprise deployments.</p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Lab 5 — Secure Azure VM Secrets Using Key Vault & Managed Identity]]></title><description><![CDATA[Week 5 of the AZ-104 Learning Labs on jmcnairtech.com
Week 5 Goal
This week, you will learn how to secure sensitive application secrets using:

Azure Key Vault (Secrets Management)

System-Assigned Managed Identity

RBAC roles for Key Vault

PowerShe...]]></description><link>https://jmcnairtech.com/az-104-lab-5-secure-azure-vm-secrets-using-key-vault-and-managed-identity</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-lab-5-secure-azure-vm-secrets-using-key-vault-and-managed-identity</guid><category><![CDATA[Azure]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[azure-storage]]></category><category><![CDATA[AzureKeyVault]]></category><category><![CDATA[Devops]]></category><category><![CDATA[cloud security]]></category><category><![CDATA[#microsoft-azure]]></category><category><![CDATA[az-104]]></category><category><![CDATA[CloudComputing]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 22 Nov 2025 03:47:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1763783015978/ce81f310-47be-4a18-ad37-28390f30bd6a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Week 5 of the AZ-104 Learning Labs on <a target="_blank" href="http://jmcnairtech.com">jmcnairtech.com</a></p>
<h1 id="heading-week-5-goal"><strong>Week 5 Goal</strong></h1>
<p>This week, you will learn how to secure sensitive application secrets using:</p>
<ul>
<li><p><strong>Azure Key Vault (Secrets Management)</strong></p>
</li>
<li><p><strong>System-Assigned Managed Identity</strong></p>
</li>
<li><p><strong>RBAC roles for Key Vault</strong></p>
</li>
<li><p><strong>PowerShell secret retrieval from inside an Azure VM</strong></p>
</li>
</ul>
<p>This is an important skill for Azure Administrators — useful to learn for the exam and will be necessary on the job.</p>
<h1 id="heading-why-this-lab-matters-real-azure-admin-scenario"><strong>Why This Lab Matters (Real Azure Admin Scenario)</strong></h1>
<p>Suppose you’re supporting an application that runs on an Azure Virtual Machine.<br />The application needs to securely access:</p>
<ul>
<li><p>Application passwords</p>
</li>
<li><p>API keys</p>
</li>
<li><p>Database connection strings</p>
</li>
<li><p>Sensitive configuration values</p>
</li>
</ul>
<p>Storing these secrets inside the VM or code repository is insecure.</p>
<p><strong>Instead, you will:</strong></p>
<ul>
<li><p>Store secrets in <strong>Azure Key Vault</strong></p>
</li>
<li><p>Give the VM a <strong>Managed Identity</strong></p>
</li>
<li><p>Assign the VM one specific role: <strong>Key Vault Secrets User</strong></p>
</li>
<li><p>Retrieve secrets securely using Azure AD authentication</p>
</li>
<li><p>No passwords, No access keys, No service principals, No SAS</p>
</li>
</ul>
<p>This is the modern, recommended way to secure secrets across Azure.</p>
<h1 id="heading-lab-prerequisites"><strong>Lab Prerequisites</strong></h1>
<ul>
<li><p>Active Azure Subscription</p>
</li>
<li><p>Basic familiarity with Azure Portal</p>
</li>
<li><p>Region: <em>East US (recommended)</em></p>
</li>
<li><p>RDP access to one Windows VM (we will create it)</p>
</li>
</ul>
<h1 id="heading-step-1-create-the-resource-group"><strong>Step 1 — Create the Resource Group</strong></h1>
<ul>
<li><p>In the Azure Portal search bar, type <strong>Resource groups</strong>.</p>
<ol>
<li><p>Click <strong>+ Create</strong>.</p>
</li>
<li><p>Fill in:</p>
<ul>
<li><p><strong>Subscription:</strong> your default</p>
</li>
<li><p><strong>Resource group name:</strong> <code>rg-week5-keyvault</code></p>
</li>
<li><p><strong>Region:</strong> East US</p>
</li>
</ul>
</li>
<li><p>Click <strong>Review + create → Create</strong>.</p>
</li>
</ol>
</li>
</ul>
<p>    This will hold your Key Vault, VM, and related resources.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763774500579/b1158aea-0c35-4092-b7da-c714e55c00d1.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-step-2-create-the-azure-key-vault-2025-portal-ui"><strong>Step 2 — Create the Azure Key Vault (2025 Portal UI)</strong></h1>
<p>Azure has updated the Key Vault creation wizard, so follow this carefully.</p>
<h3 id="heading-21-open-the-key-vault-creation-blade"><strong>2.1 Open the Key Vault creation blade</strong></h3>
<ul>
<li><p>In the Azure Portal search bar, type <strong>Key Vaults</strong>.</p>
</li>
<li><p>Click <strong>+ Create</strong>.</p>
</li>
</ul>
<h3 id="heading-22-basics-tab"><strong>2.2 — Basics Tab</strong></h3>
<p><strong>Project Details:</strong></p>
<ul>
<li><p>Subscription: your subscription</p>
</li>
<li><p>Resource Group: <code>rg-week5-keyvault</code></p>
</li>
</ul>
<p><strong>Instance Details:</strong></p>
<ul>
<li><p>Key Vault Name: <code>kv-week5-mcnairtech</code> (must be globally unique)</p>
</li>
<li><p>Region: East US</p>
</li>
<li><p>Pricing Tier: Standard (premium is not required)</p>
</li>
</ul>
<p>Click <strong>Next: Access Configuration →</strong></p>
<h3 id="heading-23-access-configuration"><strong>2.3 — Access Configuration</strong></h3>
<p>Choose:</p>
<p><strong>Azure RBAC</strong> (NOT Vault Access Policy)<br />This is the modern recommended approach.</p>
<h3 id="heading-24-networking-tab"><strong>2.4 — Networking Tab</strong></h3>
<ul>
<li><p>Public access: <strong>Enabled</strong></p>
</li>
<li><p>Firewall: Allow access from all networks (for lab)</p>
</li>
</ul>
<p>Click <strong>Review + create → Create</strong></p>
<p>Wait for deployment to finish.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763774863304/177c7eec-7a94-4eaa-92d5-abd3404068d5.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-your-key-vault-is-now-deployed">Your Key Vault is now deployed.</h3>
<p>Next, you will give <em>your user account</em> permission to create and manage secrets inside the vault (required when using Azure RBAC).</p>
<h1 id="heading-step-3-assign-yourself-key-vault-permissions-amp-add-a-secret"><strong>Step 3 — Assign Yourself Key Vault Permissions &amp; Add a Secret</strong></h1>
<p>Because the vault uses Azure RBAC, your user needs a Key Vault data-plane role to manage secrets.</p>
<p>Without this, you’ll see the error:</p>
<blockquote>
<p><strong>The operation is not allowed by RBAC…</strong></p>
</blockquote>
<p>Let’s fix that and add your first secret.</p>
<h2 id="heading-31-open-access-control-iam"><strong>3.1 — Open Access Control (IAM)</strong></h2>
<ol>
<li><p>Go to your Key Vault: <code>kv-week5-mcnairtech</code></p>
</li>
<li><p>On the left menu → click <strong>Access control (IAM)</strong></p>
</li>
<li><p>Click <strong>+ Add → Add role assignment</strong></p>
</li>
</ol>
<h2 id="heading-32-assign-yourself-a-key-vault-role"><strong>3.2 — Assign yourself a Key Vault role</strong></h2>
<p>In the <strong>Role</strong> tab, search for:</p>
<h3 id="heading-key-vault-secrets-officer"><strong>Key Vault Secrets Officer</strong></h3>
<p>(Recommended — lets you create &amp; read secrets, but not keys/certificates.)</p>
<p>OR, if you want full permissions:</p>
<h3 id="heading-key-vault-administrator"><strong>Key Vault Administrator</strong></h3>
<p>(Admin-level: manage everything in the vault)</p>
<p>Select the role → click <strong>Next</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763776511090/6f085dc2-6744-4cfc-a7c4-b7ef80698128.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-33-choose-your-user-account"><strong>3.3 — Choose your user account</strong></h2>
<p><strong>Assign access to:</strong><br /><em>User, group, or service principal</em></p>
<ol>
<li><p>Click <strong>+ Select members</strong></p>
</li>
<li><p>Search for <strong>your user account</strong> (e.g., ITAdmin@yourdomain.com)</p>
</li>
<li><p>Select → <strong>Next</strong></p>
</li>
<li><p>Click <strong>Review + assign</strong></p>
</li>
</ol>
<p>Wait 30–60 seconds for RBAC propagation.</p>
<h2 id="heading-34-add-a-secret-to-the-vault"><strong>3.4 — Add a secret to the Vault</strong></h2>
<ol>
<li><p>In the left menu, go to <strong>Objects → Secrets</strong></p>
</li>
<li><p>Click <strong>+ Generate/Import</strong></p>
</li>
<li><p>Fill in:</p>
</li>
</ol>
<ul>
<li><p><strong>Name:</strong> <code>dbPassword</code></p>
</li>
<li><p><strong>Value:</strong> <code>SuperSecurePassword123!</code></p>
</li>
</ul>
<ol start="4">
<li>Click <strong>Create</strong></li>
</ol>
<p>Your secret is now stored securely.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763777058579/9f0baf43-a7a1-4f2e-a8a2-1864f2973a68.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-step-4-create-a-virtual-machine-with-a-system-assigned-managed-identity"><strong>Step 4 — Create a Virtual Machine with a System-Assigned Managed Identity</strong></h1>
<p>This VM will securely retrieve the secret you stored in Key Vault.<br />Instead of storing passwords locally, the VM will authenticate using its built-in Managed Identity.</p>
<h2 id="heading-41-open-the-vm-creation-wizard"><strong>4.1 — Open the VM creation wizard</strong></h2>
<ol>
<li><p>In the Azure Portal search bar, type <strong>Virtual machines</strong></p>
</li>
<li><p>Click <strong>+ Create → Azure virtual machine</strong><br /> This opens the modern 2025 VM creation UI.</p>
</li>
</ol>
<h2 id="heading-42-basics-tab"><strong>4.2 — Basics tab</strong></h2>
<p><strong>Instance details:</strong></p>
<ul>
<li><p><strong>Virtual machine name:</strong> <code>vm-week5-client</code></p>
</li>
<li><p><strong>Region:</strong> East US</p>
</li>
<li><p><strong>Availability options:</strong> No infrastructure redundancy required</p>
</li>
<li><p><strong>Security type:</strong> Standard</p>
</li>
<li><p><strong>Image:</strong></p>
<ul>
<li><p>Click <strong>See all images</strong></p>
</li>
<li><p>Search for: <strong>Windows Server 2025 Datacenter: Azure Edition (Gen 2)</strong></p>
</li>
</ul>
</li>
<li><p><strong>Architecture:</strong> x64</p>
</li>
<li><p><strong>Size:</strong></p>
<ul>
<li><p>Recommended: <strong>Standard_B2s</strong></p>
</li>
<li><p>Budget option: <strong>Standard_B1s</strong></p>
</li>
</ul>
</li>
</ul>
<p><strong>Administrator account:</strong></p>
<ul>
<li><p>Username: <code>azureuser</code></p>
</li>
<li><p>Password: (choose a strong password)</p>
</li>
</ul>
<p><strong>Inbound port rules:</strong></p>
<ul>
<li><p>Public inbound ports: <strong>Allow selected ports</strong></p>
</li>
<li><p>Select inbound ports: <strong>RDP (3389)</strong></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763777836857/2b292dee-c6af-462c-a12d-e85fd85a812b.png" alt class="image--center mx-auto" /></p>
<p>Click <strong>Next: Disks →</strong> and keep defaults<br />Click <strong>Next: Networking →</strong> and keep defaults</p>
<h2 id="heading-43-management-tab-enable-managed-identity"><strong>4.3 — Management tab (Enable Managed Identity)</strong></h2>
<p>Scroll to the <strong>Identity</strong> section:</p>
<ul>
<li><strong>System-assigned managed identity:</strong> <strong>On</strong></li>
</ul>
<p>This allows the VM to authenticate to Key Vault without keys or credentials.</p>
<p>Leave all other options at default.</p>
<p>Click <strong>Review + create → Create</strong><br />Deployment takes 1–3 minutes.</p>
<h1 id="heading-step-5-grant-the-vm-permission-to-read-key-vault-secrets-rbac"><strong>Step 5 — Grant the VM Permission to Read Key Vault Secrets (RBAC)</strong></h1>
<p>Your VM now has a Managed Identity — but it has <strong>zero permissions</strong> until you grant them.<br />In this step, you’ll assign the VM the <strong>Key Vault Secrets User</strong> role.</p>
<p>This gives it read-only access to secrets (perfect for lab and real-world scenarios).</p>
<h2 id="heading-51-open-your-key-vaults-iam-blade"><strong>5.1 — Open your Key Vault’s IAM blade</strong></h2>
<ol>
<li><p>Open the vault: <code>kv-week5-mcnairtech</code></p>
</li>
<li><p>Left-hand menu → <strong>Access control (IAM)</strong></p>
</li>
<li><p>Click <strong>+ Add → Add role assignment</strong></p>
</li>
</ol>
<h2 id="heading-52-select-the-correct-role"><strong>5.2 — Select the correct role</strong></h2>
<p>In the <strong>Role</strong> tab:</p>
<ul>
<li><p>Search: <strong>Key Vault Secrets User</strong></p>
</li>
<li><p>Select the role</p>
</li>
<li><p>Click <strong>Next</strong></p>
</li>
</ul>
<p>This role allows your VM to <strong>read secrets</strong>, but not write or delete them.</p>
<h2 id="heading-53-assign-role-to-the-vms-system-assigned-identity"><strong>5.3 — Assign role to the VM’s system-assigned identity</strong></h2>
<p><strong>Assign access to:</strong> <em>Managed identity</em></p>
<ol>
<li><p>Click <strong>+ Select members</strong></p>
</li>
<li><p>In the scope selector:</p>
<ul>
<li><p>Resource type: <strong>Virtual machine</strong></p>
</li>
<li><p>Select: <code>vm-week5-client</code></p>
</li>
</ul>
</li>
<li><p>Click <strong>Select → Next → Review + assign</strong></p>
</li>
</ol>
<p>RBAC propagation usually takes 10–60 seconds.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763778543778/96f0cb43-35d1-403e-9c66-ff3ad66ea881.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-step-6-connect-to-the-vm-amp-retrieve-the-secret-using-managed-identity"><strong>Step 6 — Connect to the VM &amp; Retrieve the Secret Using Managed Identity</strong></h1>
<p>Now it’s time to test the full chain:</p>
<ul>
<li><p>VM authenticates using its identity</p>
</li>
<li><p>Key Vault authorizes the VM through RBAC</p>
</li>
<li><p>PowerShell retrieves the secret through Azure AD</p>
</li>
</ul>
<p>No passwords, no access keys, no SAS tokens — this is exactly how secure workloads operate in Azure.</p>
<h2 id="heading-61-rdp-into-the-vm"><strong>6.1 — RDP into the VM</strong></h2>
<ol>
<li><p>Go to <strong>Virtual machines</strong></p>
</li>
<li><p>Click <code>vm-week5-client</code></p>
</li>
<li><p>Click <strong>Connect → RDP</strong></p>
</li>
<li><p>Download the RDP file and open it</p>
</li>
<li><p>Sign in with:</p>
<ul>
<li><p>Username: <code>azureuser</code></p>
</li>
<li><p>Password: the one you created</p>
</li>
</ul>
</li>
</ol>
<h2 id="heading-62-open-powershell-as-administrator"><strong>6.2 — Open PowerShell (as Administrator)</strong></h2>
<p>Right-click → <strong>Run as administrator.</strong> Install the Az PowerShell module (if needed)</p>
<h2 id="heading-63-install-the-az-powershell-module-if-needed">6.3 — Install the Az PowerShell module (if needed)</h2>
<p><code>Install-Module -Name Az -Repository</code></p>
<p><code>PSGallery -Force Import-Module Az</code></p>
<h2 id="heading-64-authenticate-using-the-vms-managed-identity">6.4 — Authenticate using the VM’s Managed Identity</h2>
<p><code>Connect-AzAccount -Identity</code></p>
<p>Expected output:</p>
<ul>
<li><p><strong>Account:</strong> Managed Identity</p>
</li>
<li><p><strong>Environment:</strong> AzureCloud</p>
</li>
<li><p><strong>Tenant:</strong> your directory</p>
</li>
<li><p><strong>Subscription:</strong> your Azure subscription</p>
</li>
</ul>
<p>If you see that, authentication succeeded.</p>
<h2 id="heading-65-retrieve-the-secret-object-secure-access-validation">6.5 — Retrieve the Secret Object (Secure Access Validation)</h2>
<p>Set variables for readability: <code>$vaultName = "kv-week5-mcnairtech" $secretName = "dbPassword"</code></p>
<p>Retrieve the secret object: <code>$secret = Get-AzKeyVaultSecret -VaultName $vaultName -Name $secretName -ErrorAction Stop</code></p>
<p>Now validate that the VM was able to securely access the secret: <code>$secret</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1763781751792/71ab1bf1-be7c-4111-9437-c5aa3d287a44.png" alt class="image--center mx-auto" /></p>
<p>This proves the VM successfully accessed the secret.</p>
<h1 id="heading-66-secure-handling-keep-the-secret-encrypted"><strong>6.6 — Secure Handling: Keep the Secret Encrypted</strong></h1>
<p>Because the purpose of this lab is to learn <strong>identity-based authentication</strong>, not reveal sensitive values, we will <strong>keep the secret in its secure form</strong>.</p>
<p>The following confirms the secret <em>exists</em> and is usable — without ever exposing the plaintext value:</p>
<p><code>$secret.SecretValue</code></p>
<p>This returns a <strong>SecureString</strong>, which is the recommended format for:</p>
<ul>
<li><p>Applications</p>
</li>
<li><p>Scripts</p>
</li>
<li><p>Automation</p>
</li>
<li><p>Production workloads</p>
</li>
</ul>
<p>No plaintext exposure = best practice.</p>
<h1 id="heading-67-optional-use-the-secure-secret-in-a-script"><strong>6.7 — (Optional) Use the Secure Secret in a Script</strong></h1>
<p>Here’s a common real-world pattern:</p>
<p><code>$securePassword = $secret.SecretValue</code></p>
<p>This is how admins securely use secrets without ever printing them.</p>
<h1 id="heading-final-summary-week-5-azure-key-vault-managed-identity"><strong>Final Summary — Week 5: Azure Key Vault + Managed Identity</strong></h1>
<p>In this lab, you built a complete, real-world Azure security workflow centered around <strong>identity-based access</strong>.<br />By combining <strong>Azure Key Vault</strong>, <strong>RBAC</strong>, and <strong>System-Assigned Managed Identity</strong>, you secured application secrets using the same model enterprises rely on today.</p>
<p>By the end of Week 5, you successfully:</p>
<ul>
<li><p>✔️ Created a new Azure Key Vault using the 2025 Portal UI</p>
</li>
<li><p>✔️ Assigned yourself proper data-plane RBAC to manage secrets</p>
</li>
<li><p>✔️ Added a secret (<code>dbPassword</code>) to the vault</p>
</li>
<li><p>✔️ Created a Windows Server 2025 VM with a system-assigned Managed Identity</p>
</li>
<li><p>✔️ Granted <strong>Key Vault Secrets User</strong> to the VM’s identity</p>
</li>
<li><p>✔️ Connected to the VM using RDP</p>
</li>
<li><p>✔️ Authenticated the VM to Azure AD using <code>Connect-AzAccount -Identity</code></p>
</li>
<li><p>✔️ Retrieved the Key Vault secret securely (as a <strong>SecureString</strong>)</p>
</li>
<li><p>✔️ Verified identity-based access <em>without exposing</em> any sensitive values</p>
<p>  <strong>Identity authentication with RBAC is the recommended design for any secure Azure workload, and it is heavily tested in the AZ-104 exam.</strong></p>
</li>
</ul>
<p>You now understand how to:</p>
<ul>
<li><p>Protect secrets with Key Vault</p>
</li>
<li><p>Leverage Managed Identity</p>
</li>
<li><p>Apply least-privilege RBAC</p>
</li>
<li><p>Authenticate securely inside Azure resources</p>
</li>
</ul>
<p>This is a major skill for Azure Administrators and a powerful addition to your cloud portfolio.</p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Lab 4 — Week 4: Connect an Azure VM to Azure Storage Using Managed Identity (2025 Portal UI)]]></title><description><![CDATA[Series: Week 4 of the AZ-104 Learning Labs on jmcnairtech.com
Goal: Learn how to connect an Azure Virtual Machine to Azure Storage securely using Managed Identities and RBAC — no access keys, no SAS tokens, no secrets.
This is an important task as a ...]]></description><link>https://jmcnairtech.com/az-104-lab-4-week-4-connect-an-azure-vm-to-azure-storage-using-managed-identity-2025-portal-ui</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-lab-4-week-4-connect-an-azure-vm-to-azure-storage-using-managed-identity-2025-portal-ui</guid><category><![CDATA[Azure]]></category><category><![CDATA[az-104]]></category><category><![CDATA[azure-storage]]></category><category><![CDATA[rbac]]></category><category><![CDATA[Devops]]></category><category><![CDATA[#microsoft-azure]]></category><category><![CDATA[azure-blobstorage]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[Powershell]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 09 Nov 2025 19:41:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762716895407/53c6a88f-d3cc-400e-a8a6-0f622675565d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-series-week-4-of-the-az-104-learning-labs-on-jmcnairtechcomhttpjmcnairtechcom">Series: Week 4 of the AZ-104 Learning Labs on <a target="_blank" href="http://jmcnairtech.com">jmcnairtech.com</a></h2>
<p><strong>Goal:</strong> Learn how to connect an Azure Virtual Machine to Azure Storage <em>securely</em> using <strong>Managed Identities</strong> and <strong>RBAC</strong> — no access keys, no SAS tokens, no secrets.</p>
<p>This is an important task as a real-world Azure Administrator skill and a key part of the <strong>AZ-104 exam</strong>.</p>
<h2 id="heading-what-youll-learn-this-week"><strong>What You’ll Learn This Week</strong></h2>
<ul>
<li><p>create a new Azure Storage Account using the 2025 portal interface</p>
</li>
<li><p>create a private Blob container and upload a file</p>
</li>
<li><p>deploy a Virtual Machine using the modern VM creation UI</p>
</li>
<li><p>enable a System-Assigned Managed Identity on a VM</p>
</li>
<li><p>assign RBAC permissions such as Storage Blob Data Reader</p>
</li>
<li><p>access Blob Storage from inside the VM using identity-based authentication</p>
</li>
<li><p>download blobs inside the VM with Azure CLI or PowerShell using</p>
</li>
</ul>
<h2 id="heading-prerequisites"><strong>Prerequisites</strong></h2>
<ul>
<li><p>Active Azure subscription</p>
</li>
<li><p>Basic familiarity with the Azure Portal</p>
</li>
<li><p>We’ll use <strong>East US</strong> as the region (you can choose your own)</p>
</li>
</ul>
<h2 id="heading-lab-scenario-real-azure-admin-task"><strong>Lab Scenario (Real Azure Admin Task)</strong></h2>
<p>You are an Azure Administrator responsible for supporting a line-of-business application that processes files uploaded by employees.<br />These files—images, PDFs, and documents—are stored in an Azure Blob Storage container.</p>
<p>Your application server runs on a Virtual Machine, and the VM needs to:</p>
<ul>
<li><p>download files from the Blob container</p>
</li>
<li><p>process or analyze those files (for example: resize images, scan PDFs, extract text, run scripts, etc.)</p>
</li>
<li><p>upload results or processed outputs back to storage</p>
</li>
</ul>
<p>Instead of using storage account keys or SAS tokens (which are hard to manage and insecure), you’ll give the VM a <strong>System-Assigned Managed Identity</strong> and assign it the <strong>Storage Blob Data Reader</strong> role.</p>
<p>This allows the VM to access Blob Storage securely using Azure AD authentication — <strong>no keys, no secrets, no passwords.</strong></p>
<h3 id="heading-step-1-create-a-resource-group"><strong>Step 1 — Create a Resource Group</strong></h3>
<p>Resource groups help you organize all related resources so you can clean up easily at the end.</p>
<h2 id="heading-11"><strong>1.1</strong></h2>
<p>In the Azure Portal search bar, type <strong>Resource groups</strong> and select it.</p>
<h2 id="heading-12"><strong>1.2</strong></h2>
<p>Click <strong>+ Create</strong>.</p>
<h3 id="heading-13-fill-in"><strong>1.3 Fill in:</strong></h3>
<ul>
<li><p><strong>Subscription:</strong> your default</p>
</li>
<li><p><strong>Resource group name:</strong> <code>rg-week4-lab</code></p>
</li>
<li><p><strong>Region:</strong> East US</p>
</li>
</ul>
<p>Click <strong>Review + create → Create</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762707276140/aeda2871-9a73-49e2-a49c-0cdc7dd864bd.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-2-create-a-new-azure-storage-account"><strong>Step 2 — Create a New Azure Storage Account</strong></h2>
<p>This storage account will hold the files that your Virtual Machine needs to access securely using its Managed Identity.</p>
<h3 id="heading-21-navigate-to-the-storage-center"><strong>2.1 — Navigate to the Storage Center</strong></h3>
<ol>
<li><p>In the Azure Portal search bar, type <strong>Storage accounts</strong>.</p>
</li>
<li><p>Select <strong>Storage accounts</strong> from the results.</p>
</li>
</ol>
<p>You will now see the new <strong>Storage Center</strong> (with tiles for different storage types).</p>
<h3 id="heading-22-choose-the-storage-type-required-in-2025-ui"><strong>2.2 — Choose the Storage Type (Required in 2025 UI)</strong></h3>
<ul>
<li><p>From the Storage Center categories, select <strong>Object storage</strong>.</p>
</li>
<li><p>Then select <strong>Blob Storage</strong>.</p>
</li>
<li><p>The <strong>Create</strong> button will now appear.</p>
</li>
<li><p>Click <strong>+ Create</strong> to begin the Storage Account wizard.</p>
</li>
</ul>
<h3 id="heading-23-basics-tab"><strong>2.3 — Basics tab</strong></h3>
<h3 id="heading-project-details"><strong>Project details</strong></h3>
<ul>
<li><p>Subscription: your active subscription</p>
</li>
<li><p>Resource group: <strong>rg-week4-lab</strong></p>
</li>
</ul>
<h3 id="heading-instance-details"><strong>Instance details</strong></h3>
<ul>
<li><p>Storage account name: <strong>storweek4mcnair</strong></p>
</li>
<li><p>Region: <strong>East US</strong></p>
</li>
<li><p>Preferred storage type: <strong>Azure Blob Storage</strong></p>
</li>
<li><p>Performance: <strong>Standard</strong></p>
</li>
<li><p>Redundancy: <strong>LRS (Locally Redundant Storage)</strong></p>
</li>
</ul>
<p>Click <strong>Next: Advanced →</strong></p>
<h3 id="heading-24-advanced-tab"><strong>2.4 — Advanced tab</strong></h3>
<ul>
<li><p>Minimum TLS version: <strong>TLS 1.2</strong></p>
</li>
<li><p>Enable hierarchical namespace: <strong>Off</strong></p>
</li>
<li><p>SFTP, NFS, and large file shares: <strong>Off</strong></p>
</li>
<li><p>All other settings: leave defaults</p>
</li>
</ul>
<p>Click <strong>Next: Networking →</strong></p>
<h3 id="heading-25-networking-tab-updated-for-2025-portal"><strong>2.5 — Networking tab (Updated for 2025 Portal)</strong></h3>
<h3 id="heading-public-network-access"><strong>Public network access</strong></h3>
<ul>
<li>Enable: <strong>Yes</strong></li>
</ul>
<h3 id="heading-public-access-scope"><strong>Public access scope</strong></h3>
<ul>
<li>Enable from all networks</li>
</ul>
<h3 id="heading-routing-preference"><strong>Routing preference</strong></h3>
<ul>
<li>Microsoft network routing (default)</li>
</ul>
<h3 id="heading-private-endpoints"><strong>Private endpoints</strong></h3>
<ul>
<li>Leave empty</li>
</ul>
<p>Click <strong>Next: Data protection →</strong></p>
<h3 id="heading-26-data-protection-tab"><strong>2.6 — Data protection tab</strong></h3>
<ul>
<li><p>Enable soft delete for blobs: <strong>7 days</strong></p>
</li>
<li><p>Leave all other options at default</p>
</li>
</ul>
<p>Click <strong>Next: Encryption →</strong></p>
<h3 id="heading-27-encryption-tab"><strong>2.7 — Encryption tab</strong></h3>
<ul>
<li><p>Encryption type: Microsoft-managed keys</p>
</li>
<li><p>Enable support for customer-managed keys: Blobs and files only</p>
</li>
<li><p>Enable infrastructure encryption: Unchecked</p>
</li>
</ul>
<p>Click <strong>Review + Create → Create</strong></p>
<p>After deployment completes, your new Storage Account is ready to use.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762709389847/32d02062-5b21-42d3-ab1f-c23d512b0b29.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-3-create-a-blob-container-amp-upload-a-test-file-2025-ui"><strong>Step 3 — Create a Blob Container &amp; Upload a Test File (2025 UI)</strong></h2>
<p><strong>In this step, you will create a secure container inside your Storage Account and upload a sample file that your VM will access later using its Managed Identity.</strong></p>
<h3 id="heading-31-open-your-new-storage-account"><strong>3.1 — Open your new Storage Account</strong></h3>
<ul>
<li><p>After deployment finishes, click <strong>Go to resource</strong><br />  <em>or search for your storage account name:</em></p>
<ul>
<li><code>storweek4mcnair</code></li>
</ul>
</li>
<li><p>In the left-hand menu, scroll to the <strong>Data storage</strong> section.</p>
</li>
<li><p>Click <strong>Containers</strong></p>
</li>
</ul>
<p>This opens the Blob Containers page.</p>
<h3 id="heading-32-create-a-new-blob-container"><strong>3.2 — Create a new Blob Container</strong></h3>
<ul>
<li><p>Click <strong>+ Add Container</strong> (top-left)</p>
</li>
<li><p>Fill in the container details:</p>
<ul>
<li><p><strong>Name:</strong> <code>lab4-files</code></p>
<ul>
<li><p>lowercase</p>
</li>
<li><p>no spaces</p>
</li>
</ul>
</li>
<li><p><strong>Public access level:</strong> <strong>Private (no anonymous access)</strong></p>
<ul>
<li>This ensures files can only be accessed through RBAC, identity, or SAS.</li>
</ul>
</li>
</ul>
</li>
<li><p>Click <strong>Create</strong></p>
</li>
</ul>
<h3 id="heading-33-upload-a-test-file"><strong>3.3 — Upload a test file</strong></h3>
<p>Inside your container:</p>
<ul>
<li><p>Click <strong>lab4-files</strong></p>
</li>
<li><p>Click <strong>Upload</strong> at the top</p>
</li>
<li><p>Browse your computer for a small sample file, for example:</p>
<ul>
<li><p><code>test.txt</code></p>
</li>
<li><p><code>document.pdf</code></p>
</li>
</ul>
</li>
<li><p>Click <strong>Upload</strong></p>
</li>
</ul>
<p>The file will now appear inside your container.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762709782013/5743cf9f-174c-4a94-987e-05169ba24e15.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-34-confirm-the-container-is-private"><strong>3.4 — Confirm the container is private</strong></h3>
<p>You can verify private access by:</p>
<ul>
<li><p>Clicking the file you uploaded</p>
</li>
<li><p>Copying the <strong>Blob URL</strong></p>
</li>
<li><p>Pasting it into a new browser tab</p>
</li>
</ul>
<p>You should see: “Public access not permitted”</p>
<p>This is expected — the container is private and cannot be accessed without identity-based authentication or a SAS token.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762710092227/24006918-4797-4209-a075-35cf5c10c4cf.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-4-create-a-virtual-machine-with-a-system-assigned-managed-identity"><strong>Step 4 — Create a Virtual Machine with a System-Assigned Managed Identity</strong></h2>
<p>This VM will act as your application or processing server.<br />Later in the lab, it will authenticate to Blob Storage <em>without</em> keys or SAS tokens — using Azure AD and RBAC instead.</p>
<h3 id="heading-41-open-the-vm-creation-blade"><strong>4.1 — Open the VM creation blade</strong></h3>
<ul>
<li><p>In the Azure Portal search bar, type <strong>Virtual machines</strong></p>
</li>
<li><p>Click <strong>Virtual machines</strong></p>
</li>
<li><p>Click <strong>+ Create → Azure virtual machine</strong></p>
</li>
</ul>
<p>This opens the modern VM creation wizard.</p>
<h3 id="heading-42-basics-tab"><strong>4.2 — Basics Tab</strong></h3>
<p>Fill out the fields as follows:</p>
<h3 id="heading-instance-details-1"><strong>Instance details</strong></h3>
<ul>
<li><p><strong>Virtual machine name:</strong> <code>vm-week4-client</code></p>
</li>
<li><p><strong>Region:</strong> <code>(US) East US</code></p>
</li>
<li><p><strong>Availability options:</strong></p>
<ul>
<li>Select <strong>No infrastructure redundancy required</strong><br />  <em>(This avoids zone restrictions and keeps the lab simple.)</em></li>
</ul>
</li>
</ul>
<h3 id="heading-security-type"><strong>Security type</strong></h3>
<ul>
<li><strong>Standard</strong><br />  <em>(Trusted Launch is not needed for this scenario.)</em></li>
</ul>
<h3 id="heading-image"><strong>Image</strong></h3>
<ul>
<li><p>Click <strong>See all images</strong></p>
</li>
<li><p>Search for and select:<br />  <strong>Windows Server 2025 Datacenter: Azure Edition (Gen 2)</strong><br />  <em>(Easier for RDP and PowerShell testing.)</em></p>
</li>
</ul>
<h3 id="heading-vm-architecture"><strong>VM architecture</strong></h3>
<ul>
<li><strong>x64</strong></li>
</ul>
<h3 id="heading-size"><strong>Size</strong></h3>
<ul>
<li><p>Click <strong>See all sizes</strong></p>
</li>
<li><p>Choose:</p>
<ul>
<li><p><strong>Standard_B2s</strong> (recommended), or</p>
</li>
<li><p><strong>Standard_B1s</strong> (cheapest option)</p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-administrator-account"><strong>Administrator account</strong></h3>
<ul>
<li><p><strong>Username:</strong> <code>azureuser</code></p>
</li>
<li><p><strong>Password:</strong> a strong password you will remember</p>
</li>
</ul>
<h3 id="heading-inbound-port-rules"><strong>Inbound port rules</strong></h3>
<ul>
<li><p><strong>Public inbound ports:</strong> Allow selected ports</p>
</li>
<li><p><strong>Select inbound ports:</strong> RDP (3389)</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762710679668/5d1e444e-1648-4503-8337-0d55e6828a15.png" alt class="image--center mx-auto" /></p>
<p>Click <strong>Next: Disks</strong></p>
<h3 id="heading-43-disks-tab"><strong>4.3 — Disks Tab</strong></h3>
<ul>
<li><p><strong>OS disk type:</strong> Standard SSD</p>
</li>
<li><p>Leave all other settings at default</p>
</li>
</ul>
<p>Click <strong>Next: Networking</strong></p>
<h3 id="heading-44-networking-tab"><strong>4.4 — Networking Tab</strong></h3>
<ul>
<li><p><strong>Virtual network:</strong> auto-created default VNet</p>
</li>
<li><p><strong>Subnet:</strong> default</p>
</li>
<li><p><strong>Public IP:</strong> Enabled</p>
</li>
<li><p><strong>NIC network security group:</strong> Basic</p>
</li>
<li><p><strong>Inbound port:</strong> RDP (3389)</p>
</li>
</ul>
<p>Click <strong>Next: Management</strong></p>
<h3 id="heading-45-management-tab-enable-managed-identity"><strong>4.5 — Management Tab (Enable Managed Identity)</strong></h3>
<p>Scroll to the <strong>Identity</strong> section:</p>
<ul>
<li><strong>System-assigned managed identity:</strong> <strong>On</strong></li>
</ul>
<p><strong>This identity allows the VM to authenticate to Azure Storage securely later in the lab.</strong></p>
<p><strong>Leave all other settings at default:</strong></p>
<p>Click <strong>Review + Create</strong><br />Then click <strong>Create</strong></p>
<p>Deployment will complete in 1–3 minutes.</p>
<p><strong>Your VM is now deployed and has a system-assigned managed identity enabled.</strong><br />This identity is what will securely access the Blob Storage container in the next steps.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762711408421/db1ea886-893f-4a2a-8326-ab016b5f2ba3.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-5-assign-the-vm-access-to-blob-storage-rbac"><strong>Step 5 — Assign the VM Access to Blob Storage (RBAC)</strong></h2>
<p>Now that your VM has a <strong>System-Assigned Managed Identity</strong>, you must grant that identity the correct permissions so it can access your Blob Storage.</p>
<p>Azure uses <strong>Role-Based Access Control (RBAC)</strong> for this.<br />You will assign the VM’s identity the <strong>Storage Blob Data Reader</strong> role.</p>
<h3 id="heading-51-open-your-storage-account"><strong>5.1 — Open Your Storage Account</strong></h3>
<ul>
<li><p>In the Azure Portal search bar, type <strong>Storage accounts</strong></p>
</li>
<li><p>Select your storage account: <strong>storweek4mcnair</strong></p>
</li>
<li><p>In the left-hand menu, click <strong>Access control (IAM)</strong></p>
</li>
</ul>
<h3 id="heading-52-add-a-role-assignment"><strong>5.2 — Add a Role Assignment</strong></h3>
<ul>
<li><p>Click <strong>+ Add → Add role assignment</strong></p>
</li>
<li><p>Under <strong>Role</strong>, search for:</p>
<ul>
<li><strong>Storage Blob Data Reader</strong></li>
</ul>
</li>
<li><p>Select the role and click <strong>Next</strong></p>
</li>
</ul>
<p><em>This role allows the VM to read blobs but not upload or delete.</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762711650881/a743de17-6013-4282-87d4-217d44fc5f03.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-53-assign-role-to-the-vms-managed-identity"><strong>5.3 — Assign Role to the VM’s Managed Identity</strong></h3>
<p>Under <strong>Assign access to</strong>, choose <strong>Managed identity</strong></p>
<ul>
<li><p>Click <strong>+ Select members</strong></p>
</li>
<li><p>In the identity browser:</p>
<ul>
<li><p>Select <strong>Virtual machine</strong></p>
</li>
<li><p>Choose <strong>vm-week4-client</strong></p>
</li>
</ul>
</li>
<li><p>Click <strong>Select</strong></p>
</li>
<li><p>Click <strong>Review + assign</strong></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762711757996/429943cf-78de-44f4-9f21-a36ba82d830d.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-54-confirm-role-assignment"><strong>5.4 — Confirm Role Assignment</strong></h3>
<p>  After the assignment completes:</p>
<ul>
<li><p>You should now see <strong>Storage Blob Data Reader</strong></p>
</li>
<li><p>Assigned to: <strong>vm-week4-client (Managed Identity)</strong></p>
</li>
<li><p>Scope: <strong>This storage account</strong></p>
</li>
</ul>
</li>
</ul>
<p>    This means the VM can now authenticate to Blob Storage using its Azure AD identity.</p>
<p>    If you want your VM to also <strong>upload files</strong>, you can assign <strong>Storage Blob Data Contributor</strong></p>
<p>    But for this lab, <strong>Reader</strong> is enough.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762712009816/8c0b05d1-2993-4e8e-9ae2-fbb112101caa.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-6-connect-to-the-vm-and-access-blob-storage-using-powershell-data-plane-managed-identity"><strong>Step 6 — Connect to the VM and Access Blob Storage Using PowerShell (Data-Plane, Managed Identity)</strong></h2>
<p>In this step, you’ll RDP into the VM, sign in with its <strong>Managed Identity</strong>, create a <strong>data-plane storage context</strong>, list containers, and download a blob — all <strong>without keys or SAS</strong>.</p>
<h3 id="heading-61-connect-to-the-virtual-machine-rdp"><strong>6.1 — Connect to the Virtual Machine (RDP)</strong></h3>
<ul>
<li><p>In the Azure Portal, go to <strong>Virtual machines</strong></p>
</li>
<li><p>Click <strong>vm-week4-client</strong></p>
</li>
<li><p>Click <strong>Connect → RDP</strong></p>
</li>
<li><p>Click <strong>Download RDP file</strong></p>
</li>
<li><p>Open the RDP file</p>
</li>
<li><p>Log in using:</p>
<ul>
<li><p>Username: <code>azureuser</code></p>
</li>
<li><p>Password: the one you created</p>
</li>
</ul>
</li>
</ul>
<p>Once logged in, wait a moment for Windows Server to load.</p>
<h3 id="heading-62-open-powershell-on-the-vm"><strong>6.2 — Open PowerShell on the VM</strong></h3>
<ul>
<li><p>Click <strong>Start</strong></p>
</li>
<li><p>Search for <strong>PowerShell</strong></p>
</li>
<li><p>Right-click → <strong>Run as administrator</strong></p>
</li>
</ul>
<p>This ensures all commands run properly.</p>
<h3 id="heading-63-install-the-az-powershell-module-if-needed"><strong>6.3 — Install the Az PowerShell Module (if needed)</strong></h3>
<p>If <code>Connect-AzAccount</code> is not recognized, install the module:</p>
<p><code>Install-Module -Name Az -Repository PSGallery -Force</code></p>
<p><code>Import-Module Az</code></p>
<h3 id="heading-64-authenticate-using-the-vms-managed-identity">6.4 — Authenticate Using the VM’s Managed Identity</h3>
<p>Run this inside PowerShell: <code>Connect-AzAccount -Identity</code></p>
<p>You should see output similar to:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762713869033/51ec01e4-eaa9-4f0a-b1c1-a2b9b27eed3f.png" alt class="image--center mx-auto" /></p>
<p>This means the VM is now authenticated to Azure using its Managed Identity.</p>
<p>No passwords.<br />No keys.<br />No SAS tokens.<br />Modern Azure Admin technique.</p>
<h3 id="heading-65-build-a-data-plane-storage-context-no-management-rights-needed"><strong>6.5 — Build a <em>data-plane</em> Storage Context (no management rights needed)</strong></h3>
<pre><code class="lang-powershell"><span class="hljs-comment"># Replace with your storage account name</span>
<span class="hljs-variable">$accountName</span> = <span class="hljs-string">"storweek4mcnair"</span>

<span class="hljs-comment"># Create a context that uses the current connected identity</span>
<span class="hljs-variable">$ctx</span> = <span class="hljs-built_in">New-AzStorageContext</span> <span class="hljs-literal">-StorageAccountName</span> <span class="hljs-variable">$accountName</span> <span class="hljs-literal">-UseConnectedAccount</span>
</code></pre>
<p>This avoids management-plane APIs (like <code>Get-AzStorageAccount</code>) and uses only the <strong>blob data plane</strong>, which your <strong>Storage Blob Data Reader</strong> role allows.</p>
<h3 id="heading-66-list-containers-data-plane"><strong>6.6 — List containers (data plane)</strong></h3>
<p><code>Get-AzStorageContainer -Context $ctx</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762714890813/516571ea-ccc1-4a30-8c64-9b1d14ccdbf0.png" alt class="image--center mx-auto" /></p>
<hr />
<h3 id="heading-67-download-a-blob-data-plane"><strong>6.7 — Download a blob (data plane)</strong></h3>
<p><strong>Replace the blob name with the file you uploaded earlier</strong> (e.g., <code>test.txt</code>, <code>photo.jpg</code>)</p>
<p><code>$container = "lab4-files"</code></p>
<p><code>$blobName = "&lt;yourfilename&gt;"</code></p>
<p><code>$destPath = "C:\Users\azuser\Desktop\$blobName"</code></p>
<p><code>Get-AzStorageBlobContent -Container $container -Blob $blobName -Destination $destPath -Context $ctx</code></p>
<h3 id="heading-68-verify-the-downloaded-file-on-the-vm"><strong>6.8 — Verify the Downloaded File on the VM</strong></h3>
<p>Now that you downloaded the blob onto your VM, let’s confirm it’s there and readable.</p>
<p><code>Get-Item "C:\Users\azuser\Desktop$blobName"</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762716468336/1820d055-5550-47b4-99bb-5b2ac3e98397.png" alt class="image--center mx-auto" /></p>
<p>At this point, you have fully validated that:</p>
<ul>
<li><p>The VM authenticated using <strong>Managed Identity</strong></p>
</li>
<li><p>RBAC allowed access</p>
</li>
<li><p>Your <strong>Storage Blob Data Reader</strong> assignment is working</p>
</li>
<li><p>The VM downloaded the file through Azure AD (not keys or SAS)</p>
</li>
</ul>
<h2 id="heading-week-4-summary-azure-vm-to-blob-storage-access-with-managed-identity"><strong>Week 4 Summary — Azure VM to Blob Storage Access with Managed Identity</strong></h2>
<p>In this lab, you built a complete, real-world Azure scenario: a Virtual Machine securely accessing a Blob Storage container using a <strong>System-Assigned Managed Identity</strong>.</p>
<p>This is the modern, recommended way to authenticate Azure workloads — without keys, without SAS tokens, and without storing any secrets inside scripts.</p>
<p>By the end of the lab, you successfully:</p>
<ul>
<li><p>created a new Storage Account using the updated 2025 Azure Portal</p>
</li>
<li><p>created a private Blob container and uploaded a test file</p>
</li>
<li><p>deployed a Windows Server VM with a System-Assigned Managed Identity</p>
</li>
<li><p>connected to the VM via RDP and installed the Az PowerShell modules</p>
</li>
<li><p>authenticated the VM using <code>Connect-AzAccount -Identity</code></p>
</li>
<li><p>built a data-plane storage context using the VM’s identity</p>
</li>
<li><p>listed containers and downloaded a blob directly to the VM desktop</p>
</li>
<li><p>accessed everything through Azure AD and RBAC only</p>
</li>
</ul>
<p><strong>This lab mirrors exactly how Azure administrators secure compute-to-storage communication in real enterprise environments. Please stay tuned for more labs if you’re interested in Azure or currently studying for the AZ-104 certification from Microsoft.</strong></p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Lab 3: Create, Secure, and Manage Azure Storage (Step-by-Step)]]></title><description><![CDATA[Series: Week 3 of the AZ-104 Learning Labs on jmcnairtech.comGoal: learn how to create an Azure Storage Account, create and secure blob containers, use SAS, — all things that show up on the AZ-104 exam and in real Azure admin jobs.
What you’ll learn
...]]></description><link>https://jmcnairtech.com/az-104-lab-3-create-secure-and-manage-azure-storage-step-by-step</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-lab-3-create-secure-and-manage-azure-storage-step-by-step</guid><category><![CDATA[AZ-104 Labs]]></category><category><![CDATA[Shared Access Signature]]></category><category><![CDATA[azure-storage]]></category><category><![CDATA[Azure Administrator Associate AZ-104]]></category><category><![CDATA[azure-blobstorage]]></category><category><![CDATA[cloudsecurity]]></category><category><![CDATA[#microsoft-azure]]></category><category><![CDATA[AzureNetworking ]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 02 Nov 2025 20:41:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762115859369/ad78daa4-8d03-4f25-a3ea-c958a7cf9806.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Series:</strong> Week 3 of the AZ-104 Learning Labs on <a target="_blank" href="http://jmcnairtech.com">jmcnairtech.com</a><br /><strong>Goal:</strong> learn how to create an Azure Storage Account, create and secure blob containers, use SAS, — all things that show up on the AZ-104 exam and in real Azure admin jobs.</p>
<h2 id="heading-what-youll-learn">What you’ll learn</h2>
<ul>
<li><h3 id="heading-what-youll-learn-1"><strong>What You’ll Learn</strong></h3>
<ul>
<li><p>How to create and configure an <strong>Azure Storage Account</strong></p>
</li>
<li><p>The difference between <strong>redundancy types</strong> (LRS, GRS, ZRS)</p>
</li>
<li><p>How to secure access using <strong>SAS tokens</strong></p>
</li>
<li><p>How to upload and manage <strong>Blob Containers</strong></p>
</li>
<li><p>How to revoke access by <strong>rotating keys</strong></p>
</li>
<li><p>Best practices for <strong>network security and HTTPS-only connections</strong></p>
</li>
</ul>
</li>
</ul>
<h3 id="heading-prerequisites">Prerequisites</h3>
<ul>
<li><p>Azure subscription</p>
</li>
<li><p>Portal access</p>
</li>
<li><p>We’ll use <strong>East US</strong> for the lab (you can change it based on your location)</p>
</li>
</ul>
<h2 id="heading-step-1-create-a-resource-group">Step 1 — Create a resource group</h2>
<p>    <strong>Why:</strong> keeps everything in one place so you can delete it later.</p>
<h3 id="heading-11">1.1</h3>
<p>    In the Azure Portal search bar, type <strong>Resource groups</strong> and select it.</p>
<h3 id="heading-12">1.2</h3>
<p>    Click <strong>+ Create</strong>.</p>
<h3 id="heading-13">1.3</h3>
<p>    Fill in:</p>
<ul>
<li><p><strong>Subscription:</strong> your default</p>
</li>
<li><p><strong>Resource group:</strong> <code>rg-lab3-storage</code></p>
</li>
<li><p><strong>Region:</strong> <strong>East US</strong></p>
</li>
</ul>
<p>    Click <strong>Review + create → Create</strong>.</p>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762101568695/092d3673-3365-4861-bc11-8306d6f88028.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-2-create-an-azure-storage-account-updated-for-new-2025-portal">Step 2 — Create an Azure Storage Account <em>(Updated for new 2025 portal)</em></h2>
<p>    <strong>Goal:</strong> create a storage account that will hold your blob containers, files, and other data types — while learning the different redundancy and performance options.</p>
<h3 id="heading-21-open-the-storage-account-creation-wizard"><strong>2.1 — Open the Storage Account creation wizard</strong></h3>
<ol>
<li><p>In the Azure Portal search bar, type <strong>Storage accounts</strong>.</p>
</li>
<li><p>Click <strong>+ Create</strong>.</p>
</li>
<li><p>The new “Storage Center | Blob Storage” interface opens.</p>
</li>
</ol>
<h3 id="heading-22-basics-tab"><strong>2.2 — Basics tab</strong></h3>
<p>    <strong>Project details</strong></p>
<ul>
<li><p><strong>Subscription:</strong> your active Azure subscription</p>
</li>
<li><p><strong>Resource group:</strong> <code>rg-lab3-storage</code> (Create it first if you haven’t already.)</p>
</li>
</ul>
<p>    <strong>Instance details</strong></p>
<ul>
<li><p><strong>Storage account name:</strong> <code>storlab3mcnair</code></p>
<ul>
<li>must be all lowercase, 3–24 characters, globally unique.</li>
</ul>
</li>
<li><p><strong>Region:</strong> <code>(US) East US</code></p>
</li>
<li><p><strong>Preferred storage type:</strong> <strong>Azure Blob Storage or Azure Data Lake Storage Gen 2</strong></p>
<p>  <em>Microsoft recently updated this field. Choose “Azure Blob Storage” because this lab focuses on blob containers, SAS, and lifecycle management (all AZ-104 exam topics).</em></p>
</li>
<li><p><strong>Performance:</strong> <strong>Standard (General-purpose v2)</strong></p>
<p>  Premium is for high-throughput or low-latency scenarios; Standard keeps costs low.</p>
</li>
<li><p><strong>Redundancy</strong> = LRS</p>
<p>  LRS stores three copies of your data <em>within one datacenter</em>. It’s low-cost and perfect for lab work or testing.</p>
</li>
</ul>
<p>    Click <strong>Next: Advanced →</strong> at the bottom.</p>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762102687288/07fdc6d9-3b4a-465a-83fa-269e553d157b.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-23-advanced-tab"><strong>2.3 — Advanced tab</strong></h3>
<p>    Leave defaults for now, but confirm:</p>
<ul>
<li><p><strong>Minimum TLS version:</strong> <strong>TLS 1.2</strong></p>
</li>
<li><p><strong>Allow large file shares:</strong> Disabled</p>
</li>
<li><p><strong>Enable hierarchical namespace (Data Lake Gen2):</strong> Leave unchecked (not needed for this lab)</p>
</li>
</ul>
<p>    Click <strong>Next: Networking →</strong></p>
<h3 id="heading-24-networking-tab"><strong>2.4 — Networking tab</strong></h3>
<p>    The Networking tab controls how your Storage Account is accessed — publicly, privately, or only from specific networks.</p>
<p>    For this lab, we’ll keep it open so you can test uploads, SAS links, and RBAC access later.</p>
<h3 id="heading-public-network-access"><strong>Public network access</strong></h3>
<p>Select:</p>
<p><strong>Enable</strong><br />This allows inbound and outbound traffic to your Storage Account over the public Azure network.</p>
<p><em>Explanation:</em><br />Azure gives you three levels here:</p>
<ul>
<li><p><strong>Enable</strong> → open access (best for labs and learning)</p>
</li>
<li><p><strong>Disable</strong> → blocks all network traffic except private endpoints</p>
</li>
<li><p><strong>Secure by perimeter</strong> → used in enterprise networks with perimeter controls</p>
</li>
</ul>
<h3 id="heading-public-network-access-scope"><strong>Public network access scope</strong></h3>
<p>Select:</p>
<p><strong>Enable from all networks</strong></p>
<p><em>Explanation:</em><br />This makes the Storage Account reachable from any public IP address or Azure service (perfect for practicing SAS and RBAC access).<br />Later, in production or advanced labs, you’d restrict this to specific virtual networks or IP ranges.</p>
<h3 id="heading-private-endpoint"><strong>Private endpoint</strong></h3>
<p>Leave this section empty for now.</p>
<p><em>Private endpoints let you connect privately to your Storage Account inside a VNet — you’ll explore that later in your AZ-104 journey (network security and hybrid connectivity modules).</em></p>
<p><strong>Result:</strong><br />Your Storage Account is configured for <strong>public access</strong> — allowing you to easily upload blobs, generate SAS tokens, and test access controls during this lab.<br />Later on in the series, you’ll learn how to restrict access securely using Azure RBAC and private endpoints.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762105400697/403479c2-2900-484d-be8b-5b98fbadda3f.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-25-data-protection-tab"><strong>2.5 — Data protection tab</strong></h3>
<p>Enable:</p>
<p><strong>Select Soft delete for blobs (7 days)</strong></p>
<p>Leave everything else default.<br />Click <strong>Next: Encryption →</strong></p>
<h3 id="heading-26-encryption-tab"><strong>2.6 — Encryption tab</strong></h3>
<p>Keep defaults:</p>
<ul>
<li><p><strong>Encryption type:</strong> Microsoft-managed keys</p>
</li>
<li><p><strong>Infrastructure encryption:</strong> Off</p>
</li>
</ul>
<p>Click <strong>Review + Create →</strong></p>
<h2 id="heading-step-3-create-a-blob-container-amp-upload-files-2025-portal-layout">Step 3 — Create a Blob Container &amp; Upload Files <em>(2025 Portal Layout)</em></h2>
<p><strong>Goal:</strong><br />Create a private blob container, upload a test file, and verify access before adding SAS.</p>
<h3 id="heading-31-open-your-new-storage-account">3.1 Open your new Storage Account</h3>
<ol>
<li><p>After deployment, click <strong>Go to resource</strong>.</p>
</li>
<li><p>In the left-side menu, under <strong>Data storage</strong>, click <strong>Containers</strong>.</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762111421805/aabbcaa5-64be-4b2b-a280-3b30cba579f9.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-32-create-a-new-blob-container">3.2 Create a new Blob Container</h3>
<ol>
<li><p>Click <strong>+ Add Container</strong>.</p>
</li>
<li><p>Fill in the fields:</p>
</li>
</ol>
</li>
</ol>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Field</td><td>Value</td><td>Notes</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Name</strong></td><td><code>lab3-files</code></td><td>lowercase, short</td></tr>
<tr>
<td><strong>Public access level</strong></td><td><strong>Private (no anonymous access)</strong></td><td>keeps data secure</td></tr>
<tr>
<td><strong>Advanced options</strong></td><td>default</td><td>—</td></tr>
</tbody>
</table>
</div><p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762111768734/0aaa4626-23f7-4f28-a074-b021ba96242e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-33-upload-a-test-file">3.3 Upload a test file</h3>
<ol>
<li><p>Select <code>lab3-files</code>.</p>
</li>
<li><p>Click <strong>Upload</strong> → <strong>Browse for files</strong>.</p>
</li>
<li><p>Pick a small file (e.g., <code>test.txt</code> or <code>photo.jpg</code>).</p>
</li>
<li><p>Click <strong>Upload</strong>.</p>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762112022631/42f36e20-4122-4a04-aa3a-a270e8052a80.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-34-verify-access-behavior">3.4 Verify access behavior</h3>
<ol>
<li><p>Click your uploaded blob.</p>
</li>
<li><p>Copy the <strong>Blob URL</strong>.</p>
</li>
<li><p>Paste it into a new browser tab (not signed in).</p>
<ul>
<li><p>You should see a <strong>“PublicAccessNotPermitted”</strong> message.</p>
</li>
<li><p>That’s expected—your container is private. Private containers reject anonymous requests; you need an auth token or SAS to access them.</p>
</li>
</ul>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762112456245/22e6fd8f-820c-43c5-a0ef-96d770205d54.png" alt class="image--center mx-auto" /></p>
<p>    <strong>Result:</strong><br />    You’ve successfully created a <strong>private blob container</strong> and uploaded data securely.<br />    Next, you’ll generate a <strong>Shared Access Signature (SAS)</strong> to grant temporary access without making the container public.</p>
<h2 id="heading-step-4-step-4-generate-a-shared-access-signature-sas-in-azure-2025-portal-ui">Step 4 — Step 4 — Generate a Shared Access Signature (SAS) in Azure <em>(2025 Portal UI)</em></h2>
<p>    <strong>Goal:</strong><br />    Grant temporary, permission-based access to your private blob data without exposing your storage account keys.</p>
<h3 id="heading-41-open-the-shared-access-signature-settings"><strong>4.1 —</strong> Open the Shared Access Signature settings</h3>
<ol>
<li><p>In the Azure portal, open your storage account (mine is <strong>storlab3mcnair</strong>.)</p>
</li>
<li><p>In the left-hand menu, scroll to <strong>Security + networking → Shared access signature</strong>.</p>
<p> Do <strong>not</strong> select <em>Access keys</em> — those are full-control root credentials.</p>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762113202382/ea325bd2-87af-4c42-b7fe-38c2bfe2f154.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-42-configure-your-sas-parameters"><strong>4.2 Configure your SAS parameters</strong></h3>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Section</td><td>Setting</td><td>Description</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Allowed services</strong></td><td>Blob</td><td>Only generate SAS for Blob Storage.</td></tr>
<tr>
<td><strong>Allowed resource types</strong></td><td>Service, Container, Object</td><td>Grants access at every blob level.</td></tr>
<tr>
<td><strong>Allowed permissions</strong></td><td>Read, List</td><td>Lets users read and list files (add Write/Delete only for testing).</td></tr>
<tr>
<td><strong>Blob versioning permissions</strong></td><td>Enable deletion of versions</td><td>Safe default; controls old version cleanup.</td></tr>
<tr>
<td><strong>Allowed blob index permissions</strong></td><td>Read/Write, Filter</td><td>Enables metadata queries (new 2025 feature).</td></tr>
<tr>
<td><strong>Start date/time</strong></td><td>Today (e.g., 11/2/2025 2:41 PM)</td><td>Optional; blank = now.</td></tr>
<tr>
<td><strong>End date/time</strong></td><td>+ 1 hour (e.g., 11/2/2025 3:41 PM)</td><td>Sets expiry window.</td></tr>
<tr>
<td><strong>Time zone</strong></td><td>(UTC-05:00) Eastern Time (US &amp; Canada)</td><td>Adjust to your local zone.</td></tr>
<tr>
<td><strong>Allowed IP addresses</strong></td><td><em>(leave blank)</em></td><td>Allows all IPs for this lab.</td></tr>
<tr>
<td><strong>Allowed protocols</strong></td><td><strong>HTTPS only</strong></td><td>Secures all traffic in transit.</td></tr>
<tr>
<td><strong>Preferred routing tier</strong></td><td><strong>Basic (default)</strong></td><td>Uses standard routing tier (Microsoft network routing is disabled until published).</td></tr>
<tr>
<td><strong>Signing key</strong></td><td><strong>key1</strong></td><td>Key used to sign the token; key rotation will revoke SAS.</td></tr>
</tbody>
</table>
</div><p>    Click <strong>Generate SAS and connection string.</strong> Azure will display two outputs:</p>
<ul>
<li><p><strong>SAS token:</strong> the long string starting with <code>?sv=...</code></p>
</li>
<li><p><strong>Blob service SAS URL:</strong> your blob endpoint + token</p>
</li>
</ul>
<h3 id="heading-43-copy-your-sas-and-test-it"><strong>4.3 Copy your SAS and test it</strong></h3>
<ul>
<li><p>Copy the <strong>Blob service SAS URL</strong>.</p>
</li>
<li><p>Paste it into a browser’s address bar.</p>
<ul>
<li><p>You’ll see an XML-style listing error or empty page → That’s expected!</p>
</li>
<li><p>This SAS works at the <em>account</em> level; it isn’t pointing to your file yet.</p>
</li>
</ul>
</li>
<li><p>You may want to keep this SAS token handy if you plan to use it later in Azure CLI or automation.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762114464856/0ca90e41-f9fc-4c3f-98ff-1b075f92eb52.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-44-generate-a-sas-for-a-specific-blob-to-actually-view-the-file">4.4 — Generate a SAS for a specific blob (to actually view the file)</h3>
<ol>
<li><p>Navigate to <strong>Data storage → Containers → lab3-files</strong>.</p>
</li>
<li><p>Click your uploaded blob (e.g., <code>photo.jpg</code>).</p>
</li>
<li><p>Click the link on the file and choose select <strong>Generate SAS</strong> or <strong>Generate SAS token and URL</strong>.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762114771829/2debb2a0-4345-4701-9a2a-0948fa43bdfe.png" alt class="image--center mx-auto" /></p>
<ol start="4">
<li><p>Click <strong>Generate</strong> → Copy the <strong>Blob SAS URL</strong> which should look similar to the example link below.</p>
<p> <a target="_blank" href="https://storlab3mcnair.blob.core.windows.net/lab3-files/photo.jpg?sv=">https://storlab3mcnair.blob.core.windows.net/lab3-files/photo.jpg?sv=</a>...</p>
</li>
<li><p>Open a <strong>Private/Incognito</strong> browser window and paste the URL.<br /> Your image or file should open or download instantly.</p>
<h3 id="heading-45-optional-revoke-the-sas"><strong>4.5 – (Optional) Revoke the SAS</strong></h3>
<p> If you accidentally shared a SAS link or just want to demonstrate revocation, you can instantly invalidate it by rotating the key it was signed with.</p>
<ol>
<li><p>In the Azure Portal, go to <strong>Security + networking → Access keys</strong></p>
</li>
<li><p>Find the key used for your SAS (for example <strong>key1</strong>)</p>
</li>
<li><p>Click <strong>Rotate key</strong> → then <strong>Regenerate</strong></p>
<p> Every SAS signed with that key immediately becomes invalid.<br /> This is a powerful security feature for when credentials are exposed, or a link was shared publicly.</p>
</li>
</ol>
</li>
</ol>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1762115137197/57ea004e-7e2b-4217-8e9e-362c421326db.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-lab-3-complete-secure-azure-storage-with-sas-tokens"><strong>Lab 3 Complete — Secure Azure Storage with SAS Tokens</strong></h2>
<p>    You’ve now:</p>
<ul>
<li><p>Built an Azure Storage Account from scratch</p>
</li>
<li><p>Created a private blob container</p>
</li>
<li><p>Uploaded and verified data access</p>
</li>
<li><p>Generated time-limited <strong>SAS tokens</strong> for secure sharing</p>
</li>
<li><p>Learned how to <strong>revoke access instantly</strong> by rotating keys</p>
</li>
</ul>
<p>    These are core AZ-104 administrator skills — you can now explain and demonstrate how Azure protects data at rest and in transit.</p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Lab 2: Secure Azure Networking –Hands-On Walkthrough]]></title><description><![CDATA[In this lab, we’ll build a secure Azure network from scratch using the Azure Portal.You’ll deploy virtual networks, subnets, network security groups, VNet peering, and Azure Bastion for secure RDP access.
This directly maps to AZ-104 exam objectives ...]]></description><link>https://jmcnairtech.com/az-104-lab-2-secure-azure-networking-hands-on-walkthrough</link><guid isPermaLink="true">https://jmcnairtech.com/az-104-lab-2-secure-azure-networking-hands-on-walkthrough</guid><category><![CDATA[Azure]]></category><category><![CDATA[az-104]]></category><category><![CDATA[CloudComputing]]></category><category><![CDATA[networking]]></category><category><![CDATA[Microsoft]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[ #HandsOnLearning ]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 25 Oct 2025 21:51:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761428726972/deeac014-4b89-4d64-b26d-19283611992b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In this lab, we’ll build a secure Azure network from scratch using the Azure Portal.<br />You’ll deploy virtual networks, subnets, network security groups, VNet peering, and Azure Bastion for secure RDP access.</p>
<p>This directly maps to <strong>AZ-104 exam objectives</strong> under <em>“Manage Virtual Networking.”</em></p>
<h2 id="heading-lab-objectives">Lab Objectives</h2>
<ul>
<li><p>Create and configure Azure VNets and subnets</p>
</li>
<li><p>Apply NSGs for subnet-level security</p>
</li>
<li><p>Connect VNets using peering</p>
</li>
<li><p>Use Azure Bastion for secure, no-public-IP access</p>
</li>
</ul>
<h2 id="heading-what-youll-need">What You’ll Need</h2>
<ul>
<li><p>Active Azure subscription</p>
</li>
<li><p>RDP client or web Bastion access</p>
</li>
<li><p>Your <strong>public IP</strong> (for temporary RDP rule)</p>
</li>
<li><p>Enough credit (free tier is fine if you delete resources afterward)</p>
</li>
</ul>
<h2 id="heading-step-1-create-a-resource-group">Step 1 – Create a Resource Group</h2>
<p><strong>Goal:</strong> keep all lab resources organized and easy to delete later.</p>
<h3 id="heading-step-11">Step 1.1</h3>
<p>In the Azure Portal search bar, type <strong>Resource groups</strong> and select it.</p>
<h3 id="heading-step-12">Step 1.2</h3>
<p>Click <strong>+ Create</strong>.</p>
<h3 id="heading-step-13">Step 1.3</h3>
<ul>
<li><p><strong>Subscription:</strong> your default</p>
</li>
<li><p><strong>Resource group name:</strong> <code>rg-lab2-network</code></p>
</li>
<li><p><strong>Region:</strong> choose your closest (e.g., <em>East US</em>)</p>
</li>
<li><p>Click <strong>Review + Create → Create</strong>.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761411545956/c9c996ec-b74a-4c1c-bc44-5b4c27c0460f.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-2-create-virtual-networks-and-subnets">Step 2 – Create Virtual Networks and Subnets</h2>
<p><strong>Goal:</strong> establish one “hub” (primary) and one “spoke” VNet.</p>
<h3 id="heading-step-21-create-primary-vnet">Step 2.1 – Create Primary VNet</h3>
<ol>
<li><p>In the portal, search <strong>Virtual networks → + Create</strong>.</p>
</li>
<li><p><strong>Basics tab:</strong></p>
<ul>
<li><p>Resource group: <code>rg-lab2-network</code></p>
</li>
<li><p>Name: <code>vnet-lab2-primary</code></p>
</li>
<li><p>Region: <em>East US</em></p>
</li>
</ul>
</li>
<li><p><strong>IP Addresses tab:</strong></p>
<ul>
<li>Address space: <code>10.1.0.0/16</code></li>
</ul>
</li>
<li><p>Add two subnets:</p>
<ul>
<li><p><code>subnet-app</code> → <code>10.1.1.0/24</code></p>
</li>
<li><p><code>subnet-db</code> → <code>10.1.2.0/24</code></p>
</li>
</ul>
</li>
<li><p>Click <strong>Review + Create → Create</strong>.</p>
</li>
</ol>
<h3 id="heading-step-22-create-spoke-vnet">Step 2.2 – Create Spoke VNet</h3>
<ol>
<li><p><strong>+ Create → Virtual Network</strong> again.</p>
</li>
<li><p>Resource group: <code>rg-lab2-network</code></p>
</li>
<li><p>Name: <code>vnet-lab2-spoke</code></p>
</li>
<li><p>Address space: <code>10.2.0.0/16</code></p>
</li>
<li><p>Add subnet: <code>subnet-spoke</code> → <code>10.2.1.0/24</code></p>
</li>
<li><p><strong>Create</strong>.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761414212100/60353bb5-9acf-4159-ac6f-4cd7a3c3351c.png" alt /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761414619923/dfab4591-25f4-402e-91a2-883f7511fea0.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-3-deploy-the-virtual-machines">Step 3 – Deploy the Virtual Machines</h2>
<p><strong>Goal:</strong> create three small servers to test routing and security.</p>
<h3 id="heading-step-31-create-vm-app-1">Step 3.1 – Create vm-app-1</h3>
<ol>
<li><p>In the Portal, search <strong>Virtual machines → + Create → Azure virtual machine</strong>.</p>
</li>
<li><p><strong>Basics:</strong></p>
<ul>
<li><p>RG: <code>rg-lab2-network</code></p>
</li>
<li><p>Name: <code>vm-app-1</code></p>
</li>
<li><p>Region: <em>East US</em></p>
</li>
<li><p>Image: <em>Windows Server 2025 Datacenter</em></p>
</li>
<li><p>Size: <code>Standard D2s</code></p>
</li>
<li><p>Username: <code>itadmin</code></p>
</li>
<li><p>Password: (secure)</p>
</li>
</ul>
</li>
<li><p><strong>Networking tab:</strong></p>
<ul>
<li><p>VNet: <code>vnet-lab2-primary</code></p>
</li>
<li><p>Subnet: <code>subnet-app</code></p>
</li>
<li><p>Public IP: Enabled</p>
</li>
<li><p>NIC NSG: <strong>Basic → RDP (3389)</strong></p>
</li>
</ul>
</li>
<li><p><strong>Review + Create → Create.</strong></p>
</li>
</ol>
<h3 id="heading-step-32-create-vm-db-1">Step 3.2 – Create vm-db-1</h3>
<p>Same process but choose <strong>Subnet:</strong> <code>subnet-db</code>.</p>
<h3 id="heading-step-33-create-vm-spoke-1">Step 3.3 – Create vm-spoke-1</h3>
<ul>
<li><p>VNet: <code>vnet-lab2-spoke</code></p>
</li>
<li><p>Subnet: <code>subnet-spoke</code></p>
</li>
<li><p>Public IP: Enabled</p>
</li>
<li><p>Size: small</p>
</li>
</ul>
<h2 id="heading-step-4-install-iis-on-vm-app-1">Step 4 – Install IIS on vm-app-1</h2>
<p><strong>Goal:</strong> host a test web page.</p>
<h3 id="heading-step-41">Step 4.1</h3>
<p>RDP into <code>vm-app-1</code> using its public IP.</p>
<h3 id="heading-step-42">Step 4.2</h3>
<p>Open <strong>Server Manager → Add roles and features → Web Server (IIS)</strong> → <strong>Install</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761416953382/902d8dee-ae72-4c9c-abd3-1f92001f13ed.png" alt /></p>
<h3 id="heading-step-43">Step 4.3</h3>
<p>After it finishes, open a browser on the VM → visit <a target="_blank" href="http://localhost.￼You"><code>http://localhost</code>.<br />You</a> should see the IIS splash page.</p>
<h3 id="heading-step-44-optional">Step 4.4 (Optional)</h3>
<p>Edit iistart.htm and type “Hello from vm-app-1”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761417838271/47186a3d-4910-44a2-83b5-9adad4706add.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-5-configure-network-security-groups-nsgs">Step 5 – Configure Network Security Groups (NSGs)</h2>
<p><strong>Goal:</strong> allow only needed traffic between subnets.</p>
<h3 id="heading-step-51-create-nsg-for-app-subnet">Step 5.1 – Create NSG for App Subnet</h3>
<ol>
<li><p>In the portal, search <strong>Network security groups → + Create</strong>.</p>
</li>
<li><p>Name: <code>nsg-app-lab2</code>, RG: <code>rg-lab2-network</code>, Region: East US → <strong>Create</strong>.</p>
</li>
<li><p>Open <code>nsg-app-lab2</code> → <strong>Inbound security rules → + Add</strong>.</p>
<ul>
<li><p><strong>Allow-HTTP-From-Internet:</strong></p>
<ul>
<li>Source: Any | Port: 80 | Protocol: TCP | Action: Allow | Priority: 200</li>
</ul>
</li>
<li><p><strong>Allow-RDP-From-Home:</strong></p>
<ul>
<li>Source: <em>Your home IP/32</em> | Port: 3389 | Action: Allow | Priority: 210</li>
</ul>
</li>
</ul>
</li>
<li><p>Under <strong>Subnets</strong>, click <strong>Associate → vnet-lab2-primary → subnet-app.</strong></p>
</li>
</ol>
<h3 id="heading-step-52-create-nsg-for-db-subnet">Step 5.2 – Create NSG for DB Subnet</h3>
<ol>
<li><p>Create <code>nsg-db-lab2</code> similarly.</p>
</li>
<li><p>Add inbound rules:</p>
<ul>
<li><p><strong>Allow-App-to-DB-1433:</strong> Source <code>10.1.1.0/24</code>, Port 1433, Allow, Priority 200.</p>
</li>
<li><p><strong>Allow-App-to-DB-RDP:</strong> Source <code>10.1.1.0/24</code>, Port 3389, Allow, Priority 210.</p>
</li>
</ul>
</li>
<li><p>Associate to <code>subnet-db</code>.</p>
</li>
</ol>
<h3 id="heading-step-53-test-nsgs">Step 5.3 – Test NSGs</h3>
<ul>
<li><p>From your PC → RDP to <code>vm-app-1</code> - allowed</p>
</li>
<li><p>From your PC → RDP to <code>vm-db-1</code> - not allowed</p>
</li>
<li><p>From inside <code>vm-app-1</code> → RDP to <code>vm-db-1</code> - allowed</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761425891033/ebe5a102-b414-43bf-ad64-b7ae5749fd8b.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761425925956/8c77a8be-8022-4966-8d18-e7aef9c93cc8.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-6-peer-the-vnets">Step 6 – Peer the VNets</h2>
<p><strong>Goal:</strong> enable private routing between primary and spoke VNets.</p>
<h3 id="heading-step-61">Step 6.1</h3>
<p>Open <code>vnet-lab2-primary</code> → <strong>Peerings → + Add</strong>.</p>
<ul>
<li><p>Peering name: <code>primary-to-spoke</code></p>
</li>
<li><p>Remote VNet: <code>vnet-lab2-spoke</code></p>
</li>
<li><p>Allow traffic both ways → <strong>Add</strong>.</p>
</li>
</ul>
<h3 id="heading-step-62">Step 6.2</h3>
<p>Check that the reverse peering appears automatically; if not, add it manually on <code>vnet-lab2-spoke</code>.</p>
<h3 id="heading-step-63-test-connectivity">Step 6.3 – Test Connectivity</h3>
<p>RDP into <code>vm-spoke-1</code> → open Command Prompt:</p>
<p><code>ping 10.1.1.x (private IP of vm-app-1)</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761427624248/0535ccf3-8d9b-4adf-81a0-212b3d29a54a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-7-deploy-azure-bastion-zero-public-rdp">Step 7 – Deploy Azure Bastion (Zero Public RDP)</h2>
<p><strong>Goal:</strong> secure management without exposing public IPs.</p>
<h3 id="heading-step-71">Step 7.1</h3>
<p>Open <code>vnet-lab2-primary</code> → <strong>Subnets → + Subnet</strong></p>
<ul>
<li><p>Name: <code>AzureBastionSubnet</code></p>
</li>
<li><p>Address prefix: <code>10.1.3.0/26</code> → <strong>Save</strong></p>
</li>
</ul>
<h3 id="heading-step-72">Step 7.2</h3>
<p>Search <strong>Bastions → + Create</strong></p>
<ul>
<li><p>Name: <code>bastion-lab2</code></p>
</li>
<li><p>RG: <code>rg-lab2-network</code></p>
</li>
<li><p>VNet: <code>vnet-lab2-primary</code></p>
</li>
<li><p>Public IP: new static IP</p>
</li>
<li><p><strong>Create</strong></p>
</li>
</ul>
<h3 id="heading-step-73">Step 7.3</h3>
<p>Once deployed:</p>
<ul>
<li><p>Go to <code>vm-app-1 → Connect → Bastion → Use Bastion</code>.</p>
</li>
<li><p>Enter credentials and connect through browser.</p>
</li>
<li><p>From inside, RDP to <code>vm-db-1</code> using its <strong>private IP</strong>.</p>
<p>  <em>You’re now securely managing both VMs without public exposure.</em></p>
</li>
</ul>
<h3 id="heading-step-74">Step 7.4</h3>
<p>Remove the public IPs from all three VMs:</p>
<ul>
<li>VM → Networking → NIC → IP configurations → dissociate public IP.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761428479903/8ed6a9a8-bc90-4408-9293-44f528fbd1a0.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-8-validation-and-cleanup">Step 8– Validation and Cleanup</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Test</td><td>Expected</td><td>Reason</td></tr>
</thead>
<tbody>
<tr>
<td>Internet → vm-db-1</td><td>❌ Blocked</td><td>No public IP + NSG</td></tr>
<tr>
<td>Internet → vm-app-1 (HTTP)</td><td>✅ Allowed (temp)</td><td>NSG rule</td></tr>
<tr>
<td>vm-app-1 → vm-db-1 (1433)</td><td>✅ Allowed</td><td>NSG permit</td></tr>
<tr>
<td>vm-spoke-1 → vm-app-1</td><td>✅ Allowed</td><td>Peering</td></tr>
<tr>
<td>Bastion → vm-app-1</td><td>✅ Allowed</td><td>Secure TLS access</td></tr>
</tbody>
</table>
</div><p><strong>Cleanup:</strong></p>
<ul>
<li><p>Delete optional LB, public IPs, Bastion if done testing.</p>
</li>
<li><p>Or delete <code>rg-lab2-network</code> entirely to avoid charges.</p>
</li>
</ul>
<p>You’ve now:</p>
<ul>
<li><p>Built hub-and-spoke VNets with unique address spaces.</p>
</li>
<li><p>Secured subnets with NSGs.</p>
</li>
<li><p>Connected networks using peering.</p>
</li>
<li><p>Replaced open RDP with Azure Bastion.</p>
</li>
</ul>
<p><strong>Please reach out to me if you have any questions or need help with the lab. I’d be happy to hear from you!</strong></p>
]]></content:encoded></item><item><title><![CDATA[AZ-104 Lab 1 - Deploying My First Azure Virtual Machine]]></title><description><![CDATA[As part of my journey to earn the Microsoft Azure Administrator Associate (AZ-104) certification, I’ve started documenting my labs here on jmcnairtech.com. Each lab showcases the real-world skills I’m learning to manage and deploy cloud infrastructur...]]></description><link>https://jmcnairtech.com/deploying-my-first-azure-virtual-machine-az-104-lab-1</link><guid isPermaLink="true">https://jmcnairtech.com/deploying-my-first-azure-virtual-machine-az-104-lab-1</guid><category><![CDATA[jmcnairtech]]></category><category><![CDATA[Azure]]></category><category><![CDATA[#microsoft-azure]]></category><category><![CDATA[AZ-104 Certification]]></category><category><![CDATA[azure certified]]></category><category><![CDATA[labs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Thu, 23 Oct 2025 13:00:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1761173053919/1eb06683-fe24-44f7-9ce1-9fee517e90d8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As part of my journey to earn the <strong>Microsoft Azure Administrator Associate (AZ-104)</strong> certification, I’ve started documenting my labs here on <a target="_blank" href="http://jmcnairtech.com"><strong>jmcnairtech.com</strong></a>. Each lab showcases the real-world skills I’m learning to manage and deploy cloud infrastructure in Microsoft Azure.</p>
<p>In this first lab, I built a simple yet essential Azure environment — a <strong>Virtual Network (VNet)</strong> and a <strong>Virtual Machine (VM)</strong> — the basic foundation for everything else in cloud administration.</p>
<h2 id="heading-lab-objective">Lab Objective</h2>
<p>The goal of this lab was to deploy a <strong>Windows Server 2022 virtual machine</strong> inside a <strong>secure virtual network</strong> using best practices like:</p>
<ul>
<li><p>Organizing resources with a <strong>Resource Group</strong></p>
</li>
<li><p>Creating a <strong>Virtual Network</strong> and <strong>Subnet</strong></p>
</li>
<li><p>Deploying a <strong>VM</strong> with secure access controls</p>
</li>
<li><p>Configuring <strong>Network Security Groups (NSGs)</strong></p>
</li>
<li><p>Enabling <strong>monitoring and auto-shutdown</strong></p>
</li>
</ul>
<p>This type of setup is the backbone of most Azure workloads — from application servers to lab environments.</p>
<h2 id="heading-step-1-create-a-resource-group">Step 1: Create a Resource Group</h2>
<p>Resource Groups in Azure act as logical containers to organize and manage related resources.<br />I started by creating a new group called <code>RG-Lab1-AZ104</code> in the <strong>East US</strong> region.</p>
<p><strong>Azure Portal → Resource groups → + Create</strong></p>
<ul>
<li><p><strong>Name:</strong> RG-Lab1-AZ104</p>
</li>
<li><p><strong>Region:</strong> East US</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761141654260/017fefc2-5377-4a55-93f6-34485671f03c.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-11-add-tags-for-organization-and-cost-management">Step 1.1: Add Tags for Organization and Cost Management</h2>
<p>Before finishing the resource group setup, I added <strong>tags</strong> to help identify and manage my resources.</p>
<p>Tags in Azure are key-value pairs that make a big difference in real-world environments. They’re used for:</p>
<ul>
<li><p><strong>Cost tracking</strong> — seeing how much each project or department spends</p>
</li>
<li><p><strong>Automation</strong> — applying policies or scripts based on tags</p>
</li>
<li><p><strong>Organization</strong> — grouping resources logically across regions and subscriptions</p>
</li>
</ul>
<p>For this lab, I added these tags:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Tag Name</td><td>Value</td><td>Purpose</td></tr>
</thead>
<tbody>
<tr>
<td><code>Project</code></td><td><code>AZ104-Lab1</code></td><td>Identifies the lab or project</td></tr>
<tr>
<td><code>Environment</code></td><td><code>Test</code></td><td>Marks this as a non-production environment</td></tr>
<tr>
<td><code>Owner</code></td><td><code>Joshua McNair</code></td><td>Notes who created or manages the resource</td></tr>
<tr>
<td><code>Cost Center</code></td><td><code>Education</code></td><td>Used to track the cost center for billing</td></tr>
</tbody>
</table>
</div><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761141791587/c1f7ba3a-25ae-4001-b75b-c0c391ea03fe.png" alt class="image--center mx-auto" /></p>
<p>Adding tags even in a small lab like this helps build good habits early — Azure administrators rely heavily on tagging for cost analysis and lifecycle management.</p>
<h2 id="heading-step-2-create-a-virtual-network-vnet-and-subnet">Step 2: Create a Virtual Network (VNet) and Subnet</h2>
<p>Next, I set up a private network for my virtual machine to live in.</p>
<p><strong>Azure Portal → Virtual Networks → + Create</strong></p>
<ul>
<li><p><strong>Name:</strong> VNET-Lab1</p>
</li>
<li><p><strong>Address space:</strong> 10.0.0.0/16</p>
</li>
<li><p><strong>Subnet:</strong> Subnet-VMs (10.0.1.0/24)</p>
</li>
</ul>
<p>This subnet acts like a private section of the network where the VM can securely communicate.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761162566983/f9540de8-5aad-46f4-b631-63051d0bde05.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761162906803/f74cefde-37b2-4b01-9fb9-7b54dfef3635.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-3-deploy-a-windows-server-2022-vm">Step 3: Deploy a Windows Server 2022 VM</h2>
<p>With the network in place, I created a virtual machine inside that subnet.</p>
<p><strong>Azure Portal → Virtual Machines → + Create</strong></p>
<ul>
<li><p><strong>Name:</strong> VM-Lab1-Server</p>
</li>
<li><p><strong>Image:</strong> Windows Server 2022 Datacenter (Gen2)</p>
</li>
<li><p><strong>Size:</strong> Standard_D2 (lowest allowed at the time for Windows Server 2022 testing)</p>
</li>
<li><p><strong>Username:</strong> azureuser</p>
</li>
<li><p><strong>Password:</strong> (*******************)</p>
</li>
<li><p><strong>Inbound ports:</strong> RDP (3389)</p>
</li>
</ul>
<p>After validation, I clicked <strong>Create</strong>, and Azure began provisioning the VM.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761163898520/b2070a71-aecd-4712-ae4c-f0f8ed995594.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-4-connect-to-the-vm">🔌 Step 4: Connect to the VM</h2>
<p>Once the deployment finished, I connected to the VM using Remote Desktop.</p>
<ul>
<li><p>From the VM overview page → <strong>Connect → RDP</strong></p>
</li>
<li><p>Downloaded the <code>.rdp</code> file and logged in using my credentials</p>
</li>
</ul>
<p>Seeing the Windows Server desktop for the first time confirmed that the environment was working perfectly.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761164556127/eb24c0e8-c022-4534-a6ec-56cf58d5d86a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-5-monitoring-and-auto-shutdown">Step 5: Monitoring and Auto-Shutdown</h2>
<p>While Azure Monitor VM Insights offers deeper performance tracking, I chose not to enable it for this lab to keep costs low and focus on foundational deployment skills. The default metrics provided by Azure — like CPU and disk usage — were sufficient for validating the VM’s health and connectivity.</p>
<ul>
<li><strong>Auto-shutdown:</strong> Set for 7 PM daily</li>
</ul>
<p>These features help simulate how administrators manage uptime and costs in real production environments.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761165518044/0f86ac9a-4b5d-4db8-9531-de4bd5ed37bf.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761164991816/d19e61e3-63b0-4304-9189-9bcebbd6c79a.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-6-cleanup">Step 6: Cleanup</h2>
<p>Once testing was complete, I cleaned up my environment to avoid extra charges:</p>
<p>az group delete --name RG-Lab1-AZ104 --no-wait --yes</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1761165639441/14600d2c-5280-4150-aef7-acce5e82df09.png" alt class="image--center mx-auto" /></p>
<p>Azure automatically removed every resource inside that resource group.</p>
<h2 id="heading-what-i-learned">What I Learned</h2>
<ul>
<li><p>How Azure resources are logically grouped and connected</p>
</li>
<li><p>The purpose of VNets, subnets, and NSGs in secure networking</p>
</li>
<li><p>How to provision, connect to, and manage a Windows Server VM</p>
</li>
<li><p>Why cost management and monitoring are essential for administrators</p>
</li>
</ul>
<p>This lab helped me connect the dots between <strong>core networking, resource management, and infrastructure deployment</strong> — all key areas of the AZ-104 exam.</p>
<p><strong>Thanks for reading!</strong><br />If you’re learning Azure too, follow along here on <a target="_blank" href="http://jmcnairtech.com"><strong>jmcnairtech.com</strong></a> — I’ll be posting new labs as I work toward the <strong>AZ-104</strong> and my goal of becoming an <strong>Azure Administrator</strong>.</p>
]]></content:encoded></item><item><title><![CDATA[Solving Real Business Problems with Microsoft Intune: A Hands-On Lab for IT Pros]]></title><description><![CDATA[A brief practical walkthrough of compliance, configuration, and Autopilot deployment in a hybrid environment.

Introduction
In today’s hybrid work environment, businesses need more than just antivirus and VPNs—they need a scalable way to manage devic...]]></description><link>https://jmcnairtech.com/solving-real-business-problems-with-microsoft-intune-a-hands-on-lab-for-it-pros</link><guid isPermaLink="true">https://jmcnairtech.com/solving-real-business-problems-with-microsoft-intune-a-hands-on-lab-for-it-pros</guid><category><![CDATA[MicrosoftIntune ]]></category><category><![CDATA[mdm]]></category><category><![CDATA[autopilot]]></category><category><![CDATA[windows 11]]></category><category><![CDATA[bitlocker]]></category><category><![CDATA[cloud security]]></category><category><![CDATA[Homelab]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 16 Aug 2025 13:46:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1755351751601/490aad56-67be-4109-9f07-8d405e53ac77.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-a-brief-practical-walkthrough-of-compliance-configuration-and-autopilot-deployment-in-a-hybrid-environment">A brief practical walkthrough of compliance, configuration, and Autopilot deployment in a hybrid environment.</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754758266342/fa977174-2185-45f1-8070-cc0b50329dcb.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-introduction">Introduction</h3>
<p>In today’s hybrid work environment, businesses need more than just antivirus and VPNs—they need a scalable way to manage devices, enforce security policies, and streamline onboarding. That’s where Microsoft Intune comes in.</p>
<p>This post walks through a real-world lab scenario where Intune is used to meet core business requirements: securing endpoints, ensuring compliance, and automating device provisioning. Whether you're an IT admin or a job seeker building your portfolio, this guide shows how Intune translates business needs into technical solutions.</p>
<h3 id="heading-scenario-the-business-requirements">Scenario: The Business Requirements</h3>
<p>Let’s imagine a mid-sized company with 150 employees, half of whom work remotely. Their IT goals include:</p>
<ul>
<li><p>Enforcing BitLocker encryption and strong password policies</p>
</li>
<li><p>Ensuring devices are compliant before accessing Microsoft 365</p>
</li>
<li><p>Automating new hire onboarding with Autopilot</p>
</li>
<li><p>Monitoring device health and compliance status</p>
</li>
</ul>
<h3 id="heading-lab-walkthrough-building-the-solution-in-intune">Lab Walkthrough: Building the Solution in Intune</h3>
<p>1. <strong>Compliance Policies</strong></p>
<p>We start by creating a compliance policy that enforces:</p>
<ul>
<li><p>BitLocker encryption</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754771595588/0fee74c5-a10a-49c6-8320-154a178c3e90.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Minimum password length (8+ characters)</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754771656073/70f21280-de34-4738-944d-a61a52dfec08.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Firewall enabled</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754771753459/24c1d08d-8b75-4ed2-9a59-30f9d3646c0e.png" alt class="image--center mx-auto" /></p>
<p>  <em>Tip:</em> Devices that fail any of these checks will show as “non-compliant,” which can be used to trigger Conditional Access blocks.</p>
<h4 id="heading-2-configuration-profiles">2. <strong>Configuration Profiles</strong></h4>
<p>  Next, we deploy settings that improve user experience and security:</p>
<ul>
<li><p>OneDrive auto sign-in for file backup</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754772109021/dfe349b4-42a8-401e-8d4e-4764f803008b.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Windows Update ring to enforce patching</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754776270474/ae257404-d20e-44ee-a03a-f5ce535f80db.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Windows Defender settings</p>
</li>
</ul>
</li>
</ul>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1754777219830/83cdfdcc-598b-4de5-9fe5-ebdf92f453d3.png" alt class="image--center mx-auto" /></p>
<h4 id="heading-3-autopilot-deployment">3. <strong>Autopilot Deployment</strong></h4>
<p>    Using a test VM, we register the hardware hash and assign an Autopilot profile:</p>
<ul>
<li><p>Company branding (logo + background)</p>
</li>
<li><p>Pre-installed apps (Office, Teams)</p>
</li>
<li><p>Automatic enrollment into Intune</p>
</li>
</ul>
<p>    As you can see the device has been added to the Intune Tenant for Autopilot enrollment and device is waiting for the chosen 365 Apps to install.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755343738619/4e25b850-a8ab-4166-b402-af2969d77d1c.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1755346620247/7fd50c24-aa2e-4372-b259-fd9771738db0.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-summary-translating-business-needs-into-intune-solutions">Summary: Translating Business Needs into Intune Solutions</h3>
<p>This hands-on lab demonstrates how Microsoft Intune can solve real business challenges in a hybrid work environment. By enforcing compliance policies, deploying secure configuration profiles, and automating onboarding with Autopilot, IT teams can:</p>
<ul>
<li><p>✅ Protect endpoints with BitLocker and password policies</p>
</li>
<li><p>✅ Ensure only compliant devices access Microsoft 365</p>
</li>
<li><p>✅ Streamline new hire setup with branded, pre-configured devices</p>
</li>
<li><p>✅ Monitor device health and enforce patching across the fleet</p>
</li>
</ul>
<p>Whether you're optimizing your current environment or building a portfolio project, Intune offers scalable, cloud-native tools that align technical execution with business goals.</p>
]]></content:encoded></item><item><title><![CDATA[When Intune Auto-Enroll Fails — And WHfB Magically Fixes It]]></title><description><![CDATA[Introduction
You’d think that Intune auto-enrollment would be predictable. This week, I built a fresh Windows 11 VM, applied the usual GPO settings, and expected it to slide right into compliance. But instead of enrolling, the device just sat there. ...]]></description><link>https://jmcnairtech.com/when-intune-auto-enroll-fails-and-whfb-magically-fixes-it</link><guid isPermaLink="true">https://jmcnairtech.com/when-intune-auto-enroll-fails-and-whfb-magically-fixes-it</guid><category><![CDATA[Windows Hello for Business]]></category><category><![CDATA[Azure Hybrid Join]]></category><category><![CDATA[intune]]></category><category><![CDATA[Azure AD]]></category><category><![CDATA[mdm]]></category><category><![CDATA[Group Policy]]></category><category><![CDATA[technology]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 27 Jul 2025 13:42:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753623596697/115a3aaf-aecd-4854-959a-b7180403dc11.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3 id="heading-introduction">Introduction</h3>
<p>You’d think that Intune auto-enrollment would be predictable. This week, I built a fresh Windows 11 VM, applied the usual GPO settings, and expected it to slide right into compliance. But instead of enrolling, the device just sat there. No obvious errors, no status change… just refusing to cooperate.</p>
<p>After retracing my steps, testing registry tweaks, and trying almost everything else I could possibly find on the subject, I ended up enabling Windows Hello for Business — mostly out of curiosity. That’s when everything clicked. Suddenly, the device enrolled, compliance kicked in, and voilà — the “Access work or school” &gt; “Info” sync option finally showed up.</p>
<p>This post documents that journey — not just as a troubleshooting log, but as a case study in how so-called “optional” features like WHfB can unexpectedly become critical in your lab environment. If you're running into strange auto-enrollment issues, this might be the clue you didn’t know you needed.</p>
<h3 id="heading-lab-setup">Lab Setup</h3>
<ul>
<li><p><strong>Platform</strong>: Windows 11 VM hosted on Hyper-V</p>
</li>
<li><p><strong>Domain Context</strong>: Joined to on-prem AD with Azure AD Connect syncing; hybrid join confirmed</p>
</li>
<li><p><strong>Policy Applied</strong>: Group Policy enabling automatic MDM enrollment via user credentials</p>
</li>
<li><p><strong>Expectation</strong>: Device should enroll in Intune after login</p>
</li>
<li><p><strong>Outcome</strong>: No enrollment. No sync button. No errors.</p>
</li>
</ul>
<h3 id="heading-troubleshooting-steps"><strong>Troubleshooting Steps</strong></h3>
<p>Before WHfB entered the picture, I tried nearly everything:</p>
<ul>
<li>Verified hybrid join status via <code>dsregcmd /status</code></li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753620871649/ca347a91-5c0f-4a4d-85f9-9e2dee885ba1.png" alt class="image--center mx-auto" /></p>
<ul>
<li>Confirmed GPOs were applying correctly</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753621017192/558a09b3-8878-44a7-b8d4-89e0eb102240.png" alt class="image--center mx-auto" /></p>
<ul>
<li><p>Cleared MDM-related registry keys under <code>HKLM\SOFTWARE\Microsoft\Enrollments</code></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753621173113/f679df38-9b94-4f26-abd8-f67818f12dc8.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Rebooted multiple times</p>
</li>
<li><p>Ran <code>mdmdiagnosticstool.exe -area Enrollment -cab</code> and reviewed the logs</p>
</li>
</ul>
<p>Still, the device wouldn’t enroll.</p>
<h3 id="heading-windows-hello-for-business-the-unexpected-fix"><strong>Windows Hello for Business: The Unexpected Fix</strong></h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1753621365386/61271804-c9a8-48ad-ac9d-0e3d1c833e7e.png" alt class="image--center mx-auto" /></p>
<p>Eventually, I enabled Windows Hello for Business — just a basic PIN setup. I didn’t expect much. But immediately after configuring WHfB:</p>
<ul>
<li><p>The device enrolled in Intune</p>
</li>
<li><p>Compliance policies began applying</p>
</li>
<li><p>The long-lost “Info” button in the “Access work or school” settings appeared</p>
</li>
</ul>
<p>Something in the token or credential flow had changed.</p>
<h3 id="heading-why-whfb-might-matter-more-than-you-think"><strong>Why WHfB Might Matter More Than You Think</strong></h3>
<p>WHfB is typically framed as a passwordless security feature. But in hybrid or cloud-joined setups, it can affect the authentication context used for token generation — a critical piece of MDM enrollment.</p>
<p>Without WHfB, the device may lack sufficient context to initiate enrollment. Microsoft’s documentation doesn’t make this dependency clear, but in practice, enabling WHfB can resolve silent failures in scenarios like mine.</p>
<h3 id="heading-helpful-commands-and-registry-paths"><strong>Helpful Commands and Registry Paths</strong></h3>
<p><strong>Commands to Run</strong></p>
<ul>
<li><p><code>dsregcmd /status</code> – Confirms Azure AD join and token status</p>
</li>
<li><p><code>mdmdiagnosticstool.exe -area Enrollment -cab</code> – Generates diagnostic output</p>
</li>
</ul>
<p><strong>Registry Locations to Check</strong></p>
<ul>
<li><p><code>HKLM\SOFTWARE\Microsoft\Enrollments</code></p>
</li>
<li><p><code>HKLM\SOFTWARE\Microsoft\PolicyManager\current\device</code></p>
</li>
</ul>
<p><strong>GPO to Review</strong></p>
<ul>
<li><p><strong>Policy</strong>: Enable automatic MDM enrollment using user credentials</p>
</li>
<li><p>Confirm it's applied under the correct scope and timing</p>
</li>
</ul>
<h3 id="heading-conclusion"><strong>Conclusion</strong></h3>
<p>This experience was a reminder of why lab testing matters — not every deployment scenario goes exactly the way you would hope. WHfB, while technically optional, played a key role in enabling successful auto-enrollment in this Hyper-V VM. If you’re seeing similar issues, try setting up Windows Hello — it may be the silent key that unlocks your workflow.</p>
<p>And if you've encountered other unexpected Intune or hybrid join behaviors, share them — the more we surface these edge cases, the better we can guide others through the maze.</p>
]]></content:encoded></item><item><title><![CDATA[How to Clear DNS Cache on Windows (And Why It Actually Matters)]]></title><description><![CDATA[When a user complains that “the site won't load” or insists “the internet is broken,” sometimes the culprit is deceptively simple: stale DNS records.
Whether you’re working helpdesk, managing a fleet of machines, or just solving your cousin’s gaming ...]]></description><link>https://jmcnairtech.com/how-to-clear-dns-cache-on-windows-and-why-it-actually-matters</link><guid isPermaLink="true">https://jmcnairtech.com/how-to-clear-dns-cache-on-windows-and-why-it-actually-matters</guid><category><![CDATA[Windows]]></category><category><![CDATA[networking]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[troubleshooting]]></category><category><![CDATA[dns]]></category><category><![CDATA[command line]]></category><category><![CDATA[techtips]]></category><category><![CDATA[IT Support]]></category><category><![CDATA[windows tips]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 12 Jul 2025 00:09:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1752278405689/01b05941-67d3-4c95-bbfe-df37e60b6650.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a user complains that “the site won't load” or insists “the internet is broken,” sometimes the culprit is deceptively simple: stale DNS records.</p>
<p>Whether you’re working helpdesk, managing a fleet of machines, or just solving your cousin’s gaming Wi-Fi woes—this trick might be the quickest fix in your toolbox.</p>
<h3 id="heading-how-to-flush-dns-cache-in-windows">How to Flush DNS Cache in Windows</h3>
<ol>
<li><p>Press <code>Win + X</code> and select <strong>Command Prompt (Admin)</strong></p>
</li>
<li><p>Type the following and press <strong>Enter</strong>: <code>ipconfig /flushdns</code></p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752274852387/641c03a0-9eb6-4339-a818-373829eb0866.png" alt class="image--center mx-auto" /></p>
<ol start="3">
<li>You’ll get a confirmation: <strong>“Successfully flushed the DNS Resolver Cache.”</strong></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752274920458/16ea183e-36f3-4ee6-86b9-331c9fbb9f5d.png" alt class="image--center mx-auto" /></p>
<p>That’s it—no need to reboot your computer or mess with complicated registry tweaks. This command instantly clears outdated DNS entries, letting Windows re-query servers and fetch the most current domain information.</p>
<h3 id="heading-why-this-fix-works">Why This Fix Works</h3>
<p>Windows keeps a local copy of domain-to-IP address translations—kind of like a shortcut list to get you where you’re going faster online. But over time, those shortcuts can get outdated, like using an old GPS that sends you to a restaurant that’s already closed or moved.</p>
<p>Flushing the DNS cache is like updating your map. It clears out stale directions so your computer can get accurate guidance from DNS servers—avoiding detours, delays, or those dreaded “site not found” errors.</p>
<h2 id="heading-real-world-scenario">Real-World Scenario</h2>
<p>A client’s payroll app kept showing “server not reachable.” Ping tests worked, the browser didn’t reach the page. Flushed the DNS cache. Boom—problem solved.</p>
<p><strong>Follow it up with a browser cache clear, and you’ve just saved 20 minutes of unnecessary troubleshooting.</strong> -- Even after flushing DNS sends your machine to the correct server, your browser might still load outdated visuals like an old login page or broken styles. That’s because it cached things like HTML, images, and JavaScript from a previous visit and didn't bother asking the new server for fresh files. Clearing the browser cache ensures you’re not seeing remnants from the old server—so what shows up on screen actually reflects what’s hosted now.</p>
<h2 id="heading-try-it-yourself">Try It Yourself</h2>
<p>Next time you're faced with a mysterious “site won’t load” error, don't dive straight into deep diagnostics. Start simple: flush the DNS, clear the browser cache, and reload with fresh eyes.</p>
<p>Skip either step, and you might be solving half the problem. Knock them both out and move on to the next trouble ticket. That's how pros troubleshoot.</p>
]]></content:encoded></item><item><title><![CDATA[Fixing Muffled Audio in Five9: A Real-World IT Support Solution]]></title><description><![CDATA[Why This Matters: In IT support, softphone audio issues can create massive communication problems in call centers. This week, I resolved a Five9 issue where a user sounded muffled on every call—even though their headset and PC appeared to be working ...]]></description><link>https://jmcnairtech.com/fixing-muffled-audio-in-five9-a-real-world-it-support-solution</link><guid isPermaLink="true">https://jmcnairtech.com/fixing-muffled-audio-in-five9-a-real-world-it-support-solution</guid><category><![CDATA[audio-issues]]></category><category><![CDATA[five9]]></category><category><![CDATA[IT Support]]></category><category><![CDATA[#techsupport]]></category><category><![CDATA[call center]]></category><category><![CDATA[softphone]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Fri, 04 Jul 2025 23:51:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751672458291/32164891-4f91-45c0-bc9a-488a63aa8671.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Why This Matters:</strong> In IT support, softphone audio issues can create massive communication problems in call centers. This week, I resolved a Five9 issue where a user sounded muffled on every call—even though their headset and PC appeared to be working fine. Here's how I diagnosed and resolved it.</p>
<p><strong>Step One: Verify Mic Settings in Windows -</strong> Start with the basics. I opened Windows Sound settings to ensure the headset was the default input device. Sometimes, Windows switches to an internal mic without warning.</p>
<p><img src="https://tse3.mm.bing.net/th/id/OIP.-3BBYUb1QL4bHb3puDRRFAHaEK?r=0&amp;rs=1&amp;pid=ImgDetMain&amp;o=7&amp;rm=3" alt="Using Headphone Jack as Microphone: What You Need to Know | Headphonesty" /></p>
<blockquote>
<p>Pro tip: If the wrong device is set as default, Five9 may still "look" like it's using the headset but actually route audio through something else.</p>
</blockquote>
<hr />
<p><strong>Step Two: Set the Mic in Five9 Settings -</strong> Inside the Five9 softphone (web-based), I clicked the gear icon and selected the correct headset under Audio Device settings. In many cases, leaving this set to "Default" causes Five9 to pick the wrong mic.</p>
<blockquote>
<p>Lesson learned: Always manually select the exact headset—"Default" is not always reliable.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751671756062/ead99db9-63bb-4d34-8306-b2b2085cc355.png" alt class="image--center mx-auto" /></p>
<p><strong>Step Three: Disable Exclusive Mode in Windows</strong> This was the fix that finally worked. I went to:</p>
<ul>
<li><p>Sound Settings</p>
</li>
<li><p>Right clicked the headset &gt; Properties</p>
</li>
<li><p>Switched to the <strong>Advanced</strong> tab</p>
</li>
<li><p>Unchecked "Allow applications to take exclusive control of this device"</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751671821543/77650630-72f9-4584-b3e1-3a43b53223db.png" alt /></p>
<p>After applying this change, the user's audio was instantly clear.</p>
<blockquote>
<p>Why it works: Exclusive mode lets one app hijack the audio channel. If Five9 and Windows clash here, it can muffle or distort sound.</p>
</blockquote>
<p><strong>Other Fixes I Tried (That Didn't Work but Might Help You):</strong></p>
<ul>
<li><p>Plugging the headset directly into the laptop instead of the docking station</p>
</li>
<li><p>Clearing the Chrome browser cache and restarting Five9</p>
</li>
</ul>
<p>While these didn’t solve it for this case, they’re good steps to include in your troubleshooting process.</p>
<hr />
<p><strong>Takeaway for IT Pros:</strong> Don’t overlook audio settings that seem small. In softphone apps like Five9, fixing muffled audio might come down to a single Windows checkbox. Bookmark this one—it saved my user, and it might save yours too.</p>
]]></content:encoded></item><item><title><![CDATA[How to Join a Windows 11 VM to an Active Directory Domain (Home Lab Guide)]]></title><description><![CDATA[Learn how to join a Windows 11 computer to a Windows Server 2022 Active Directory domain in your home lab. Step-by-step guide for IT beginners and sysadmins.
Why Build a Simple Active Directory Lab?
If you're serious about a career in IT support or s...]]></description><link>https://jmcnairtech.com/how-to-join-a-windows-11-vm-to-an-active-directory-domain-home-lab-guide</link><guid isPermaLink="true">https://jmcnairtech.com/how-to-join-a-windows-11-vm-to-an-active-directory-domain-home-lab-guide</guid><category><![CDATA[Active Directory]]></category><category><![CDATA[windows server]]></category><category><![CDATA[Homelab]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[virtual machine]]></category><category><![CDATA[md-102]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Mon, 30 Jun 2025 00:01:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751241523077/c723da2a-2832-4e2d-bd82-5b285aadc120.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Learn how to join a Windows 11 computer to a Windows Server 2022 Active Directory domain in your home lab. Step-by-step guide for IT beginners and sysadmins.</p>
<h3 id="heading-why-build-a-simple-active-directory-lab">Why Build a Simple Active Directory Lab?</h3>
<p>If you're serious about a career in IT support or system administration, building a home lab is one of the best investments of your time. It gives you hands-on experience with real-world tools like Active Directory — the same tech used by many companies to manage users, devices, and policies.</p>
<p>In this guide, I’ll show you how to join a Windows 11 computer to your own AD domain — a core task every IT pro should know how to do. It’s quick, straightforward, and sets the foundation for more advanced lab scenarios.</p>
<h3 id="heading-what-youll-need">What You’ll Need</h3>
<ul>
<li><p>A Windows Server 2022 VM with Active Directory Domain Services (AD DS) installed and configured</p>
</li>
<li><p>A Windows 11 VM</p>
</li>
<li><p>Both VMs on the same virtual network (via VirtualBox, Hyper-V, VMware, etc.)</p>
</li>
<li><p>Your domain name (e.g., <code>mcnairtech.local</code>)</p>
</li>
<li><p>Admin credentials for your domain</p>
</li>
</ul>
<h3 id="heading-step-1-point-the-windows-11-client-to-the-correct-dns-server">Step 1: Point the Windows 11 Client to the Correct DNS Server</h3>
<p>Active Directory relies heavily on DNS, so make sure your Windows 11 VM is using your domain controller’s IP as its DNS server.</p>
<ol>
<li><p>Go to <strong>Settings &gt; Network &amp; Internet &gt; Ethernet (or Wi-Fi) &gt; Edit IP assignment</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751237615051/c573cc4b-e3f7-47ec-a115-5ee85ad62d64.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Change the DNS settings to <strong>Manual</strong></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751237760750/cdb414a8-a33e-4a9c-acfe-3a1025277f63.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Set the <strong>Preferred DNS</strong> to your DC’s IP address (e.g., 192.168.50.254)</p>
</li>
<li><p>Click <strong>Save</strong></p>
</li>
</ol>
<p><strong>Pro Tip:</strong> If your DNS is misconfigured, the domain join will fail — even if everything else is perfect. This is because Active Directory heavily relies on DNS to locate domain controllers and other essential services within the network. When your Windows 11 client tries to join the domain, it queries DNS for the domain controller's address. If the DNS server is not set to your domain controller’s IP or cannot resolve the domain name, your client won’t be able to find the controller, causing the domain join process to fail.</p>
<h3 id="heading-step-2-join-the-windows-11-computer-to-the-domain">Step 2: Join the Windows 11 Computer to the Domain</h3>
<ol>
<li><p>Open <strong>Settings &gt; System &gt; About</strong></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751238147952/0832c6aa-33b1-43b6-8290-7db5628d0cb6.png" alt class="image--center mx-auto" /></p>
</li>
</ol>
<ol start="2">
<li>Scroll down and click <strong>Domain or Workgroup</strong></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751238440877/35973f62-139c-40ed-b306-58c13e2b8c08.png" alt class="image--center mx-auto" /></p>
<ol start="3">
<li>Select <strong>Join this device to a local Active Directory domain</strong></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751238738368/40dd3388-e4f3-4284-84fd-4c360b0d75a5.png" alt class="image--center mx-auto" /></p>
<ol start="4">
<li><p>Enter your domain name (e.g., <code>mcnairtech.local</code>)</p>
</li>
<li><p>Provide domain admin credentials (like <code>Administrator</code>)</p>
</li>
<li><p>Reboot when prompted</p>
<p> After restarting, your computer will be part of the domain.</p>
</li>
</ol>
<h3 id="heading-step-3-test-the-domain-join">Step 3: Test the Domain Join</h3>
<ol>
<li>On the Windows 11 login screen, choose <strong>Other user</strong></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751238879866/c31711cf-5fc3-4f7e-b8c8-072afe8726c9.png" alt class="image--center mx-auto" /></p>
<ol start="2">
<li>Enter the domain and username, such as:<br /> <code>MCNAIRTECH\Administrator</code></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751239025005/d994932c-f3b4-4ed9-ae3c-e610c4e0209b.png" alt class="image--center mx-auto" /></p>
<ol start="3">
<li>Once logged in, open <strong>Command Prompt</strong> and run: <code>whoami</code></li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1751239154782/edde72fd-4f82-457c-942e-fd83c83aa1aa.png" alt class="image--center mx-auto" /></p>
<ol start="4">
<li><p>You can also test by running:</p>
<p> <code>gpupdate /force</code></p>
</li>
</ol>
<p>If Group Policy updates successfully, you're connected.</p>
<h3 id="heading-whats-next">What’s Next?</h3>
<ul>
<li><p>Create a new user in Active Directory and log in from the Windows 11 VM</p>
</li>
<li><p>Apply a basic Group Policy (like a custom desktop background or password policy)</p>
</li>
<li><p>Set up DHCP and DNS roles on the domain controller</p>
</li>
<li><p>Build toward a multi-site or multi-domain environment</p>
</li>
</ul>
<p>The more you experiment, the more confident you’ll get with AD — and the closer you are to becoming job-ready.</p>
<h3 id="heading-wrapping-up">Wrapping Up</h3>
<p>Joining your Windows 11 VM to an Active Directory domain might seem small, but it’s a key step in getting comfortable with Windows networking and domain management. Once you’ve done this, you’ll have a solid foundation to start exploring more complex AD features in your lab.</p>
<p>If you found this helpful, bookmark the site or share it with someone else working on their IT skills. More easy-to-follow lab guides are coming soon!</p>
]]></content:encoded></item><item><title><![CDATA[10 Windows Keyboard Shortcuts You’ll Actually Use Every Day]]></title><description><![CDATA[If you're working on a Windows computer, keyboard shortcuts can help you get more done with fewer clicks. In this post, I’m sharing 10 shortcuts I use every day to move faster, stay organized, and work smarter — no fluff.
1. Windows + D – Show Deskto...]]></description><link>https://jmcnairtech.com/10-windows-keyboard-shortcuts-youll-actually-use-every-day</link><guid isPermaLink="true">https://jmcnairtech.com/10-windows-keyboard-shortcuts-youll-actually-use-every-day</guid><category><![CDATA[Windows]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[keyboard shortcuts]]></category><category><![CDATA[techtips]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[IT Support]]></category><category><![CDATA[#techsupport]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Thu, 19 Jun 2025 02:28:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751234973267/eece70eb-d13e-42f6-ae8b-32c9b5c6a5e1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you're working on a Windows computer, keyboard shortcuts can help you get more done with fewer clicks. In this post, I’m sharing 10 shortcuts I use every day to move faster, stay organized, and work smarter — no fluff.</p>
<h3 id="heading-1-windows-d-show-desktop">1. Windows + D – Show Desktop</h3>
<p>Minimize everything and jump straight to your desktop.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750334042944/c0bc117e-1fcf-4044-9f4b-c0a211c9d731.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-2-windows-s-open-search">2. Windows + S – Open Search</h3>
<p>Quickly find apps, files, or settings with one shortcut.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750334287706/cef9577d-c2c1-4494-a674-fbde06993314.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-3-ctrl-shift-esc-open-task-manager">3. Ctrl + Shift + Esc – Open Task Manager</h3>
<p>Skip Ctrl + Alt + Delete — this opens Task Manager directly.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750334327554/24bb321b-af92-4830-a750-db8c5af1dc6f.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-4-windows-l-lock-your-pc">4. Windows + L – Lock Your PC</h3>
<p>Great for when you step away and want to secure your screen fast.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750334381771/7333dd56-3998-45a6-8332-a6dae6f837c2.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-5-windows-e-open-file-explorer">5. Windows + E – Open File Explorer</h3>
<p>Instant access to your files and folders without using the mouse.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750334438976/581c06f5-f59d-4857-b40c-141b0bc6df5c.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-6-ctrl-z-ctrl-y-undo-redo">6. Ctrl + Z / Ctrl + Y – Undo / Redo</h3>
<p>Whether you're typing or managing files, this one will save you when you make mistakes.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750336793717/b214f4e0-997d-4227-ac4f-67442d8b4ad6.gif" alt class="image--center mx-auto" /></p>
<h3 id="heading-7-windows-left-right-arrow-snap-windows">7. Windows + Left / Right Arrow – Snap Windows</h3>
<p>Snap apps to each side of the screen for better multitasking.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750335459123/c94c152c-6ce1-45bb-b52b-e8b99d2c1e6b.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-8-ctrl-t-open-new-browser-tab">8. Ctrl + T – Open New Browser Tab</h3>
<p>No need to click — just pop open a fresh tab instantly.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750335523415/1518a0b8-e53c-425b-8302-7380f028da9a.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-9-windows-v-clipboard-history">9. Windows + V – Clipboard History</h3>
<p>Paste beyond your last copy. Just enable clipboard history in settings first.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750335596023/2d16146d-6f9b-40f1-a3ea-92db19e1e637.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-10-ctrl-shift-n-create-a-new-folder">10. Ctrl + Shift + N – Create a New Folder</h3>
<p>Quickly make new folders in File Explorer or on your desktop.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750336292363/a55593f8-be04-4e1a-b00a-e0f1416755a0.gif" alt class="image--center mx-auto" /></p>
<p>These shortcuts save me time every single day — and once you get used to them, you'll fly through your workflow. Got a favorite shortcut I missed? Drop it in the comments below or share it with me on <a target="_blank" href="http://linkedin.com/in/joshuamcnair">LinkedIn</a>.</p>
<p>Want more tips like this? Subscribe to the blog or check out the <a target="_blank" href="https://youtu.be/qtXhL7ACC7I">YouTube video</a> post!</p>
]]></content:encoded></item><item><title><![CDATA[Mapped Drive Not Showing? Here’s What Actually Fixed It]]></title><description><![CDATA[I set up a Group Policy Object (GPO) to map a network drive this weekend, but for some reason, test users weren’t seeing it after logging in.
Everything looked great — the policy was linked, no errors in Group Policy Management Console, and the corre...]]></description><link>https://jmcnairtech.com/mapped-drive-not-showing-heres-what-actually-fixed-it</link><guid isPermaLink="true">https://jmcnairtech.com/mapped-drive-not-showing-heres-what-actually-fixed-it</guid><category><![CDATA[Group Policy]]></category><category><![CDATA[Active Directory]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[windows server]]></category><category><![CDATA[IT Support]]></category><category><![CDATA[techtips]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 15 Jun 2025 23:09:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750636062199/5f3a95e4-417d-4654-98af-f72ecf8c34f7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I set up a Group Policy Object (GPO) to map a network drive this weekend, but for some reason, test users weren’t seeing it after logging in.</p>
<p>Everything looked great — the policy was linked, no errors in Group Policy Management Console, and the correct OU was targeted. Still, the drive wouldn’t show up.</p>
<p>Here’s how I troubleshooted it in my lab and what actually fixed the issue.</p>
<h2 id="heading-1-check-the-gpo-scope-and-ou-placement">1. Check the GPO Scope and OU Placement</h2>
<p>If the drive mapping is set under <strong>User Configuration</strong>, make sure the user account is in the correct OU where the GPO is linked.</p>
<p><strong>Tip:</strong> OU structure matters — it’s easy to overlook which container your user is actually in.</p>
<h2 id="heading-2-verify-security-filtering-and-delegation">2. Verify Security Filtering and Delegation</h2>
<p>In Group Policy Management:</p>
<ul>
<li><p>Go to the GPO → <strong>Scope</strong> tab</p>
</li>
<li><p>Make sure the right users or groups are listed under <strong>Security Filtering</strong></p>
</li>
<li><p>Under <strong>Delegation</strong>, ensure they have both:</p>
<ul>
<li><p><strong>Read</strong></p>
</li>
<li><p><strong>Apply group policy</strong></p>
</li>
</ul>
</li>
</ul>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750027591692/32f827ba-8d18-4d8d-bc81-a8d291fd7b2b.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-3-use-gpresult-or-rsopmsc-to-confirm-application">3. Use <code>gpresult</code> or <code>rsop.msc</code> to Confirm Application</h2>
<p>    Run the following command on the user’s machine to see if the GPO is even applying:</p>
<p>    If it’s missing, the policy isn’t reaching the user at all — often due to filtering or OU issues.</p>
<p>    <mark>gpresult /r /scope:user</mark></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750027098213/77bcaf0c-0b37-48e2-a2fa-1f0acdc1a897.png" alt /></p>
<h2 id="heading-4-switch-gpo-action-from-update-to-replace">4. Switch GPO Action from “Update” to “Replace”</h2>
<p>By default, drive mappings use the <strong>Update</strong> action.</p>
<p>With <strong>“Update,”</strong> the GPO will only act if it detects a change in the mapping—for example, if the drive letter, path, or label has been altered. But if a user’s session has residual mappings from a previous logon or a policy hiccup prevents the drive from showing up, “Update” won’t intervene. It assumes all is well.</p>
<p>In my case, switching to <strong>Replace</strong> ensured the drive was re-created at every logon, which solved the issue.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1750027994822/cfb4b968-ae04-47d5-977e-ffcf3d2e49fb.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-5-double-check-ntfs-and-share-permissions">5. Double-Check NTFS and Share Permissions</h2>
<p>Even with a perfect GPO, the drive won’t appear if users don’t have permission to access the folder.</p>
<p>Check both:</p>
<ul>
<li><p><strong>Share permissions</strong> (right-click → Sharing → Advanced Sharing → Permissions)</p>
</li>
<li><p><strong>NTFS permissions</strong> (right-click → Properties → Security tab)</p>
</li>
</ul>
<p>Make sure the target group has <strong>at least Read</strong> on both levels.</p>
<h2 id="heading-what-worked-for-me">What Worked for Me</h2>
<p>In my lab, the issue turned out to be a combination of:</p>
<ul>
<li><p>GPO not scoped correctly to the user's OU</p>
</li>
<li><p>Incorrect NTFS permissions on the shared folder</p>
</li>
<li><p>GPO action needing to be switched to “Replace”</p>
</li>
</ul>
<p>Once I adjusted all three, the drive showed up consistently at logon.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>Mapped drive issues seem simple — until they aren’t. I always recommend using <code>gpresult</code>, testing with a clean user account, and reviewing both OU placement and folder permissions as your first steps.</p>
<p>Let me know if you’ve run into this one too — it’s one of the most common (and frustrating) help desk tickets out there.</p>
]]></content:encoded></item><item><title><![CDATA[How to Deploy a Desktop Wallpaper Using Group Policy and SYSVOL (Step-by-Step Lab)]]></title><description><![CDATA[Setting a custom desktop wallpaper across your domain’s users is a classic Group Policy task that’s perfect for beginners and intermediate admins. It’s a great way to familiarize yourself with Group Policy Objects (GPOs), SYSVOL shares, and the basic...]]></description><link>https://jmcnairtech.com/how-to-deploy-a-desktop-wallpaper-using-group-policy-and-sysvol-step-by-step-lab</link><guid isPermaLink="true">https://jmcnairtech.com/how-to-deploy-a-desktop-wallpaper-using-group-policy-and-sysvol-step-by-step-lab</guid><category><![CDATA[Active Directory]]></category><category><![CDATA[windows 11]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[hyper-v]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 14 Jun 2025 19:18:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751756122925/3afa6c7e-46a9-4113-ac02-a749a9106b68.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Setting a custom desktop wallpaper across your domain’s users is a classic Group Policy task that’s perfect for beginners and intermediate admins. It’s a great way to familiarize yourself with Group Policy Objects (GPOs), SYSVOL shares, and the basics of Active Directory management.</p>
<p>In this lab, we’ll walk through how to deploy a desktop wallpaper to Windows 11 clients using a centrally stored image in the SYSVOL folder.</p>
<h2 id="heading-why-use-sysvol-for-wallpaper">Why Use SYSVOL for Wallpaper?</h2>
<p>SYSVOL is a shared folder on your domain controllers that replicates across all DCs in the domain. Storing your wallpaper here means:</p>
<ul>
<li><p>Centralized management — one place to update the image</p>
</li>
<li><p>Automatic replication across all DCs</p>
</li>
<li><p>Easy access via UNC path for clients</p>
</li>
</ul>
<h2 id="heading-lab-setup">Lab Setup</h2>
<ul>
<li><p><strong>Domain Controller:</strong> Windows Server 2022 - DC01</p>
</li>
<li><p><strong>Client Machine:</strong> Windows 11 (domain joined) -win11</p>
</li>
<li><p><strong>Domain:</strong> mcnairtech.local</p>
</li>
<li><p><strong>Test OU:</strong> <code>TestOU</code> with test computer inside</p>
</li>
<li><p><strong>Wallpaper file:</strong> default.png (or any .jpg/.png you prefer)</p>
</li>
</ul>
<h2 id="heading-step-1-place-your-wallpaper-in-sysvol">Step 1: Place Your Wallpaper in SYSVOL</h2>
<ol>
<li><p>On your DC, navigate to:<br /> <code>C:\Windows\SYSVOL\sysvol\mcnairtech.local\scripts</code></p>
</li>
<li><p>Create a folder named <code>Wallpaper</code>.</p>
</li>
<li><p>Copy your wallpaper file (<code>default.png</code>) into that folder.</p>
</li>
</ol>
<p>Your image should now be available at:<br /><code>\\mcnairtech.local\SYSVOL\mcnairtech.local\scripts\Wallpaper\default.png</code></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749925804622/04fbb558-6db9-48db-9a12-cce91362f83e.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-2-create-a-gpo-to-set-the-wallpaper">Step 2: Create a GPO to Set the Wallpaper</h2>
<ol>
<li><p>Open <strong>Group Policy Management</strong> on your DC.</p>
</li>
<li><p>Right-click your test OU (<code>TestOU</code>) and choose <strong>Create a GPO in this domain, and Link it here...</strong></p>
</li>
<li><p>Name the new GPO: <strong>Set Desktop Wallpaper</strong></p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749926120501/7add78bd-acdb-470e-b736-453b787fccb4.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749926213492/52f01fdb-bdfa-4cf8-ad69-7a008144d696.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-3-configure-the-gpo">Step 3: Configure the GPO</h2>
<ol>
<li><p>Right-click the new GPO and click <strong>Edit</strong>.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749926288721/ca404536-6d84-4a7a-a395-136d22e83973.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Navigate to:<br /> <code>User Configuration &gt; Policies &gt; Administrative Templates &gt; Desktop &gt; Desktop</code></p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749926427673/57946c0f-05c2-4431-9e28-1256ed8265cb.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Double-click <strong>Desktop Wallpaper</strong>.</p>
</li>
<li><p>Select <strong>Enabled</strong>.</p>
</li>
<li><p>In the <strong>Wallpaper Name</strong> field, enter:<br /> <code>\\mcnairtech.local\SYSVOL\mcnairtech.local\scripts\Wallpaper\default.png</code></p>
</li>
<li><p>Choose your <strong>Wallpaper Style</strong> (Fill, Fit, Stretch, etc.).</p>
</li>
<li><p>Click <strong>OK</strong>.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749928007502/1cf73f21-b7e1-4803-89b3-0ce09d7d3186.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-step-4-test-the-wallpaper-deployment">Step 4: Test the Wallpaper Deployment</h2>
<ol>
<li><p>Ensure your test computer is in the <code>TestOU</code>.</p>
</li>
<li><p>On the Windows 11 client, run:</p>
<pre><code class="lang-plaintext"> gpupdate /force
</code></pre>
</li>
<li><p>Sign out and back in (or reboot).</p>
</li>
</ol>
<p>You should now see your custom wallpaper applied!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749927890406/9d0edd01-05aa-457c-817e-29193470d8bb.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-troubleshooting-tips">Troubleshooting Tips</h2>
<ul>
<li><p>Make sure the user logging in is in the OU where the GPO is linked.</p>
</li>
<li><p>Confirm clients can access the UNC path to the wallpaper.</p>
</li>
<li><p>Check spelling and path accuracy in the GPO setting.</p>
</li>
<li><p>If the wallpaper doesn’t apply, try rebooting the client.</p>
</li>
</ul>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>Deploying a desktop wallpaper via Group Policy is a simple but powerful way to get comfortable with Active Directory GPOs and SYSVOL shares. It’s practical for branding, reminders, or just a better user experience in your organization.</p>
<p>Want help customizing this lab or turning it into a full tutorial with screenshots? Let me know!</p>
]]></content:encoded></item><item><title><![CDATA[Mapping Network Drives with Group Policy in Active Directory]]></title><description><![CDATA[By McNairTech | June 2025 | Hands-On IT Lab Series
Why This Lab?
This week I wanted to document a small but useful task I set up in my home Active Directory lab: using Group Policy to map a network drive for a specific group of users.
It's one of tho...]]></description><link>https://jmcnairtech.com/mapping-network-drives-with-group-policy-in-active-directory</link><guid isPermaLink="true">https://jmcnairtech.com/mapping-network-drives-with-group-policy-in-active-directory</guid><category><![CDATA[Active Directory]]></category><category><![CDATA[windows 11]]></category><category><![CDATA[Homelab]]></category><category><![CDATA[windows server]]></category><category><![CDATA[hyper-v]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Thu, 12 Jun 2025 00:33:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750539799790/1449330c-2ba0-40dd-b824-46f3e2b4a821.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>By McNairTech | June 2025 | Hands-On IT Lab Series</p>
<h3 id="heading-why-this-lab">Why This Lab?</h3>
<p>This week I wanted to document a small but useful task I set up in my home Active Directory lab: using Group Policy to map a network drive for a specific group of users.</p>
<p>It's one of those things that feels simple, but in a real job setting, this kind of automation cuts down on support tickets and keeps users from constantly asking, “Where’s that shared folder again?”</p>
<h3 id="heading-what-i-needed">What I Needed</h3>
<ul>
<li><p>A Windows Server with AD DS and Group Policy Management Console</p>
</li>
<li><p>A Windows 11 VM joined to the domain</p>
</li>
<li><p>A test OU with a few dummy users</p>
</li>
<li><p>A shared folder on the domain controller</p>
</li>
</ul>
<h3 id="heading-step-1-set-up-the-shared-folder">Step 1 – Set Up the Shared Folder</h3>
<p>On my DC, I created a folder at <code>C:\SharedFolder</code>. Right clicked it, went to Properties → Sharing → Advanced Sharing, and shared it as “Shared Folder.”</p>
<p>In Permissions, I gave access to Domain Users just for testing. (In production, I'd scope this to a specific security group instead.)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749685658554/ab995e67-e901-4314-a1e3-fc41111a693f.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749685789555/29ca11bf-5153-4ad1-8160-a2a5c8c9f95c.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749685844210/c6734a03-6dac-4545-bbcd-841f0edf295c.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-2-create-and-link-the-gpo">Step 2 – Create and Link the GPO</h3>
<p>I opened the Group Policy Management Console, found the OU I wanted (in this case, “Sales”), and created a new GPO called “Map Drive Z.”</p>
<p>Then I linked it to that OU so it would only affect users inside Sales.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749686029231/d3b49557-4831-4ae2-9925-91ff71e50555.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-3-configure-the-drive-map">Step 3 – Configure the Drive Map</h3>
<p>In the GPO editor, I went to:<br />User Configuration → Preferences → Windows Settings → Drive Maps</p>
<p>Right-clicked → New → Mapped Drive</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749686164687/81b96381-12dc-4a4b-acff-363dff2ed52e.png" alt class="image--center mx-auto" /></p>
<p>Settings:</p>
<ul>
<li><p>Location: \DC01\Shared Folder</p>
</li>
<li><p>Drive Letter: Z:</p>
</li>
<li><p>Action: Update</p>
</li>
<li><p>Gave it a label of “Company Share”</p>
</li>
</ul>
<p>Saved and closed the editor</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749905897537/80a6f129-e75d-4974-9bcb-5d27c3df68d4.png" alt class="image--center mx-auto" /></p>
<p>.</p>
<h3 id="heading-step-4-testing">Step 4 – Testing</h3>
<p>On my Windows 11 VM (joined to the domain), I logged in as a test user from the Sales OU. After logging in, the Z: drive appeared in File Explorer, mapped to the shared folder on the server. If it doesn’t show up right away, running <code>gpupdate /force</code> helps, or just reboot.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749687996873/46fe5f63-110d-4cef-b5fc-cf102ec152a6.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-a-few-notes">A Few Notes</h3>
<ul>
<li><p>You can also target drives by security group using item-level targeting</p>
</li>
<li><p>Make sure your NTFS permissions on the folder itself match your share permissions, or users will see access denied errors even if the drive maps.</p>
</li>
<li><p>Drive letter conflicts can be an issue if users already have something on Z:. Use an uncommon letter or set “Use first available” if needed.</p>
</li>
</ul>
<h3 id="heading-wrapping-up">Wrapping Up</h3>
<p>This is a small task, but it’s something I’ve done many times in real environments, and it always saves headaches in the long run. If you're working on building a HomeLab or prepping for an IT role, it's worth practicing how to set this up.</p>
]]></content:encoded></item><item><title><![CDATA[Active Directory - How to Test Password and Account Lockout Policies]]></title><description><![CDATA[Setting up proper password and account lockout policies is a key part of hardening an Active Directory (AD) environment. In this hands-on guide, we’ll walk through how to configure these policies using Group Policy and then test them with a real user...]]></description><link>https://jmcnairtech.com/active-directory-how-to-test-password-and-account-lockout-policies</link><guid isPermaLink="true">https://jmcnairtech.com/active-directory-how-to-test-password-and-account-lockout-policies</guid><category><![CDATA[Active Directory]]></category><category><![CDATA[windows server]]></category><category><![CDATA[Group Policy]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Homelab]]></category><category><![CDATA[ITLabs]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sun, 08 Jun 2025 22:25:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750809838014/5b6225aa-5eac-4506-914b-b96e2ef5455a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Setting up proper password and account lockout policies is a key part of hardening an Active Directory (AD) environment. In this hands-on guide, we’ll walk through how to configure these policies using Group Policy and then test them with a real user account.</p>
<h2 id="heading-prerequisites">Prerequisites</h2>
<p>Before you begin, make sure you have the following:</p>
<ul>
<li><p>A Windows Server domain controller (e.g., mcnairtech.local)</p>
</li>
<li><p>Active Directory and DHCP roles already installed</p>
</li>
<li><p>A domain-joined client workstation for testing</p>
</li>
</ul>
<h3 id="heading-step-1-configure-password-and-lockout-policies">Step 1: Configure Password and Lockout Policies</h3>
<ol>
<li><p>Open <strong>Group Policy Management Console</strong> (<code>gpmc.msc</code>)</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749418470207/e6b62905-336d-438a-ad17-fa4dcdd9976e.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Right-click your domain (<code>mcnairtech.local</code>) and choose <strong>Create a GPO in this domain and link it here</strong>. Name it something like:</p>
<blockquote>
<p>Domain Password Policy</p>
</blockquote>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749419020637/09db4930-fdc6-4fd2-a1d5-9ad779275ec6.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Right-click the new GPO and select <strong>Edit</strong></p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749419502550/5fe10ce4-4b65-4aeb-92e3-c19968eb5045.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Navigate to:</p>
<blockquote>
<p>Computer Configuration &gt; Policies &gt; Windows Settings &gt; Security Settings &gt; Account Policies</p>
</blockquote>
</li>
</ol>
<p>Under <strong>Password Policy</strong>, set:</p>
<ul>
<li><p>Minimum password length: 12 characters</p>
</li>
<li><p>Password must meet complexity requirements: Enabled</p>
</li>
<li><p>Enforce password history: 24 passwords remembered</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749419304107/0c5d5f2e-db36-4125-b332-6b0eecda8ed1.png" alt class="image--center mx-auto" /></p>
<p>Under <strong>Account Lockout Policy</strong>, set:</p>
<ul>
<li><p>Account lockout threshold: 5 invalid logon attempts</p>
</li>
<li><p>Account lockout duration: 15 minutes</p>
</li>
<li><p>Reset account lockout counter after: 15 minutes</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749419704235/b7e882f3-0630-4be2-a34a-4fd4c2959a0d.png" alt class="image--center mx-auto" /></p>
<ol start="5">
<li>Close the editor. Ensure the GPO is <strong>linked</strong> to the domain root.</li>
</ol>
<hr />
<h3 id="heading-step-2-force-the-policy-to-apply">Step 2: Force the Policy to Apply</h3>
<p>Group Policy refreshes on a schedule, but you can apply it immediately:</p>
<ol>
<li><p>Open <strong>Command Prompt as Administrator</strong></p>
</li>
<li><p>Run: gpupdate /force</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749419856791/3a17d9c5-5273-4516-a7ff-a7e901257f6d.png" alt class="image--center mx-auto" /></p>
<ol>
<li>Restart your domain controller to ensure all settings apply</li>
</ol>
<p>If you have a domain-joined client, restart that too.</p>
<hr />
<h3 id="heading-step-3-create-a-test-user">Step 3: Create a Test User</h3>
<ol>
<li><p>Open <strong>Active Directory Users and Computers</strong> (<code>dsa.msc</code>)</p>
</li>
<li><p>Right-click the <code>Users</code> container or a test OU, then choose <strong>New &gt; User</strong></p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420054451/78e39052-7c2f-47ef-8566-81330f2784a2.png" alt class="image--center mx-auto" /></p>
<ol>
<li><p>Create a user:</p>
<ul>
<li><p>Full name: Test User</p>
</li>
<li><p>Username: testuser</p>
</li>
<li><p>Password: Try a weak one like <code>pass123</code> (it should be rejected)</p>
</li>
<li><p>Use a valid password like <code>McnairTech!2024</code> to proceed</p>
</li>
</ul>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420203720/6966ecac-38e0-414f-b582-8d4f46a849d3.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420265805/f8429a05-5e29-42a0-b9e2-64a49766ecf9.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-4-test-the-account-lockout-policy">Step 4: Test the Account Lockout Policy</h3>
<ol>
<li><p>On a domain-joined PC or the domain controller:</p>
</li>
<li><p>Try logging in as <code>testuser</code> with the <strong>wrong password</strong> 5 times</p>
</li>
<li><p>You should see a message:</p>
<blockquote>
<p>"The referenced account is currently locked out and may not be logged on to."</p>
</blockquote>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420514253/8fbdd830-3663-4555-9d72-88001e7f5eda.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-step-5-verify-the-lockout-in-active-directory">Step 5: Verify the Lockout in Active Directory</h3>
<ol>
<li><p>Open <strong>Active Directory Users and Computers</strong></p>
</li>
<li><p>Right-click the <code>testuser</code> account &gt; <strong>Properties</strong> &gt; <strong>Account</strong> tab</p>
</li>
<li><p>You should see the checkbox for <strong>"Unlock account"</strong> unchecked</p>
</li>
</ol>
</li>
</ol>
<p>    To unlock it manually:</p>
<ul>
<li><p>check the box and click OK</p>
</li>
<li><p>Or wait for the configured lockout duration to expire</p>
</li>
</ul>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420656244/a8b940d6-7d27-4146-9e3b-e46712539ef1.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-optional-verify-policy-with-gpresult">Optional: Verify Policy with GPResult</h3>
<p>    To confirm the policy applied successfully:</p>
<p>    Run:</p>
<pre><code class="lang-plaintext">    gpresult /h report.html
</code></pre>
<p>    Open <code>report.html</code> in a browser and scroll to <strong>Computer Settings</strong> &gt; <strong>Account Policies</strong>.</p>
<p>    <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749420862588/4a47f2cf-67f7-449a-b38a-3f6efc61e86e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>    With these steps, you’ve enforced and verified password complexity, length, and account lockout policies using Group Policy in Active Directory. This foundational task is essential in any secure Windows domain.</p>
<p>    Stay tuned for more AD and GPO hands-on guides!</p>
]]></content:encoded></item><item><title><![CDATA[Active Directory - Installing DHCP Server Role]]></title><description><![CDATA[Objective
This weekend's exercise was focused on installing and configuring the DHCP (Dynamic Host Configuration Protocol) role on a Windows Server that's part of an Active Directory (AD) environment. DHCP is essential in network management because i...]]></description><link>https://jmcnairtech.com/active-directory-installing-dhcp-server-role</link><guid isPermaLink="true">https://jmcnairtech.com/active-directory-installing-dhcp-server-role</guid><category><![CDATA[Active Directory]]></category><category><![CDATA[hyper-v]]></category><category><![CDATA[Homelab]]></category><category><![CDATA[windows server]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Sat, 07 Jun 2025 15:43:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1750811029712/831448ac-a893-4b45-a107-06cccc55ff09.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-objective">Objective</h2>
<p>This weekend's exercise was focused on installing and configuring the <strong>DHCP (Dynamic Host Configuration Protocol)</strong> role on a Windows Server that's part of an <strong>Active Directory (AD)</strong> environment. DHCP is essential in network management because it automates the assignment of IP addresses to client machines on the network.</p>
<h2 id="heading-lab-setup">Lab Setup</h2>
<ul>
<li><p><strong>Host Machine:</strong> Windows 11 with Hyper-V enabled</p>
<ul>
<li><p><strong>Virtual Machines:</strong></p>
<ul>
<li><p><code>DC01</code>: Windows Server 2022 (Domain Controller + DHCP Server)</p>
</li>
<li><p><code>WIN11</code>: Windows 11 (Client)</p>
</li>
</ul>
</li>
<li><p><strong>Virtual Network:</strong> Private virtual switch (Hyper-V)</p>
</li>
<li><p><strong>Tools Used:</strong> Server Manager, DHCP Management Console (<code>dhcp.msc</code>)</p>
</li>
</ul>
</li>
</ul>
<p>1. Open Server Manager &gt; Add roles and features</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305311576/946c1aaf-771b-46a4-b74f-db420e691004.png" alt class="image--center mx-auto" /></p>
<ol start="2">
<li>Choose Role-based or feature-based installation</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305464308/17c2f469-7087-4efc-b46b-df49ef2c7935.png" alt class="image--center mx-auto" /></p>
<ol start="3">
<li>Select Destination Server</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305549531/2b29ddc7-6433-4ce3-a0d6-b7cfe083905a.png" alt class="image--center mx-auto" /></p>
<ol start="4">
<li>Select Server Role - DHCP Server &gt; Add Features &gt; Choose features</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305604708/a79a1a43-914c-4f0c-aa28-c4f40ced6e60.png" alt class="image--center mx-auto" /></p>
<ol start="5">
<li><p>Confirm Installation Selections &gt; select restart the destination server automatically if required</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305772800/dceaf162-3874-4d98-a39a-536e22d15d61.png" alt class="image--center mx-auto" /></p>
<ol start="6">
<li>Complete Post-deployment Configuration</li>
</ol>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749305989733/fec2a7e2-6fba-4547-90d7-669f83565903.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749306044333/f3bbfb06-e0d1-498d-a143-0e0091bb38df.png" alt class="image--center mx-auto" /></p>
<p><strong>Create new DHCP Scope</strong></p>
<p>Select Tools &gt; DCHP</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749308044293/b295ac9e-b36f-4af0-821a-3152a2d007e5.png" alt class="image--center mx-auto" /></p>
<p>In this example, the scope will be IPV4. Right click and choose new scope &gt; Select scope name</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749308168283/44fa393b-ab60-4e60-81b2-c5b2409819a4.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749308246403/4a19ecb7-dccb-497e-b058-7e26e812ee4a.png" alt class="image--center mx-auto" /></p>
<p>Select scope range</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749310068076/316e438f-a25c-48eb-abd5-687da2dbf316.png" alt class="image--center mx-auto" /></p>
<p>Choose exclusion - Added Domain Controller to exclusion list</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749310127778/9ac85cc4-5376-46dd-8704-47918e010025.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749308867109/f59954e9-23d5-4aa3-a55b-77107ebad48c.png" alt class="image--center mx-auto" /></p>
<p>Select Scope Options</p>
<p>Add the Router (Default Gateway) and any other relevant options if needed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749308974461/f320b4fe-b89d-4dae-9b62-3212ce058969.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-testing-the-setup">Testing the Setup</h2>
<p>After activating the scope, I powered on the Windows 11 client VM (WIN11), which is also connected to the same <strong>Private virtual switch</strong>.</p>
<ul>
<li><p>Ran <code>ipconfig</code> on the client and confirmed it received a <strong>192.168.0.x</strong> address from the DHCP server.</p>
</li>
<li><p>Verified the lease appeared under <strong>Address Leases</strong> in the DHCP Manager on <code>DC01</code>.</p>
</li>
</ul>
<hr />
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749310267810/b8284d16-051e-40ca-98c1-a6f4fe8deda8.png" alt class="image--center mx-auto" /></p>
<p>Confirmed inside of DCHP manager as well.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749310317242/bce1d9f0-36e7-4d17-8b56-51bf3f7b3195.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-lessons-learned">Lessons Learned</h2>
<ul>
<li><p>DHCP does <strong>not</strong> require the client to be joined to the domain—just on the same network.</p>
</li>
<li><p>A <strong>Private virtual switch</strong> in Hyper-V simulates a small, isolated network—perfect for AD labs.</p>
</li>
<li><p>If you get an APIPA address (<code>169.254.x.x</code>), check the DHCP server’s authorization, firewall, and whether the client can reach the server at all.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[🔐 Security+ vs. CySA+: Which CompTIA Certification Should You Choose in 2025?]]></title><description><![CDATA[Choosing the Right Cybersecurity Certification for Your Career Path
If you’re dipping your toes into cybersecurity certifications, you’ve probably heard Security+ and CySA+ mentioned on many technology/learning platforms. But it’s not always clear wh...]]></description><link>https://jmcnairtech.com/security-vs-cysa-which-comptia-certification-should-you-choose-in-2025</link><guid isPermaLink="true">https://jmcnairtech.com/security-vs-cysa-which-comptia-certification-should-you-choose-in-2025</guid><category><![CDATA[it-education]]></category><category><![CDATA[#cybersecurity]]></category><category><![CDATA[comptia]]></category><category><![CDATA[Certifications ]]></category><category><![CDATA[infosec]]></category><dc:creator><![CDATA[JMcNairTech]]></dc:creator><pubDate>Thu, 29 May 2025 00:27:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1751228476146/56acd6d4-c3b7-4a3b-b158-59d621391578.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-choosing-the-right-cybersecurity-certification-for-your-career-path">Choosing the Right Cybersecurity Certification for Your Career Path</h1>
<p>If you’re dipping your toes into cybersecurity certifications, you’ve probably heard <strong>Security+</strong> and <strong>CySA+</strong> mentioned on many technology/learning platforms. But it’s not always clear which one fits <strong>YOUR</strong> background or personal goals. Are you just starting out in tech, or do you already have some on-the-job experience and want to specialize? In this post, I’ll break down the differences between these two popular CompTIA certifications, share the kinds of jobs and salaries you can expect, and give my take on which one might be right for you in 2025.</p>
<hr />
<h2 id="heading-getting-to-know-security-and-cysa">Getting to Know Security+ and CySA+</h2>
<p><strong>Security+</strong> is the classic starting point for anyone who wants to jump into cybersecurity. It covers the basics — network security, common threats, risk management, and all those fundamentals that every security pro should know. Think of it as cybersecurity 101. It touches on a broad range of topics but doesn’t expect you to be an expert in any one area.</p>
<p>On the flip side, <strong>CySA+</strong> (short for Cybersecurity Analyst) dives deeper into hands-on skills. It focuses on detecting threats, analyzing data to spot bad actors, and responding to incidents. This cert is designed for folks who already have some experience and want to move into roles like threat hunting or security operations.</p>
<hr />
<h2 id="heading-whats-the-real-difference">What’s the Real Difference?</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Feature</td><td>Security+</td><td>CySA+</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Who It’s For</strong></td><td>Beginners, new to IT/security</td><td>Intermediate IT/security pros</td></tr>
<tr>
<td><strong>Focus Area</strong></td><td>Broad fundamentals and theory</td><td>Practical threat detection, analysis &amp; response</td></tr>
<tr>
<td><strong>Exam Format</strong></td><td>Multiple choice + performance based</td><td>Multiple choice + scenario-based + hands-on tasks</td></tr>
<tr>
<td><strong>Job Titles</strong></td><td>Security Administrator, Help Desk</td><td>Security Analyst, SOC Analyst</td></tr>
<tr>
<td><strong>Salary Range</strong></td><td>$55K to $75K</td><td>$70K to $100K</td></tr>
</tbody>
</table>
</div><h2 id="heading-when-should-you-pick-which">When Should You Pick Which?</h2>
<p>If you’re just starting out, <strong>Security+</strong> is a fantastic way to get your feet wet. It builds a solid foundation and is often required for entry-level security roles.</p>
<p>But if you’ve got some IT or security experience already and want to get serious about analyzing threats and responding in real time, <strong>CySA+</strong> is the next logical step.</p>
<hr />
<h2 id="heading-what-others-in-the-field-are-saying">What Others in the Field Are Saying</h2>
<p>I found some honest takes from people who’ve earned both certs:</p>
<blockquote>
<p>“Security+ is like learning the rules of the game. CySA+ is actually playing it, reading the field, and making moves.” — Reddit user</p>
<p>“CySA+ made me feel like I was doing real work, not just studying concepts. It’s definitely harder but way more rewarding.” — Another Reddit contributor</p>
</blockquote>
<hr />
<h2 id="heading-a-helpful-video-walkthrough">A Helpful Video Walkthrough</h2>
<p>If you prefer video learning, check out this clear, practical YouTube explanation breaking down the differences:</p>
<p>Heads up: While perspectives may vary, this video offers a clear and practical overview to help you understand the key differences.</p>
<p>📺 <a target="_blank" href="https://www.youtube.com/watch?v=eA3ZJKbyfSg">Security+ vs. CySA+: Which Cert Should YOU Choose?</a></p>
<hr />
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>Choosing between Security+ and CySA+ really boils down to where you are in your career and what you want to do next. Don’t stress — both are respected certifications that can open doors.</p>
<p>Start with <strong>Security+</strong> if you need to build your foundation. Go for <strong>CySA+</strong> when you’re ready to specialize and get hands-on with threat detection and response.</p>
<p>Remember, certifications are just one piece of the puzzle — keep learning, practicing, and gaining real-world experience.</p>
]]></content:encoded></item></channel></rss>