<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jens Du Four</title>
	<atom:link href="https://jensdufour.be/feed/" rel="self" type="application/rss+xml" />
	<link>https://jensdufour.be/</link>
	<description>Connecting you to the cloud, one endpoint at a time!</description>
	<lastBuildDate>Wed, 01 Apr 2026 12:24:30 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Automating New Device Setup with Nerdio Scripted Sequences</title>
		<link>https://jensdufour.be/2026/04/01/automating-new-device-setup-with-nerdio-scripted-sequences/</link>
					<comments>https://jensdufour.be/2026/04/01/automating-new-device-setup-with-nerdio-scripted-sequences/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Tue, 31 Mar 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automation]]></category>
		<category><![CDATA[Intune]]></category>
		<category><![CDATA[Nerdio]]></category>
		<category><![CDATA[NME]]></category>
		<category><![CDATA[Scripted Sequences]]></category>
		<category><![CDATA[Windows 365]]></category>
		<guid isPermaLink="false">https://jensdufour.be/?p=1009</guid>

					<description><![CDATA[<p>Use Nerdio Scripted Sequences to automate multi-step device setup on Windows 365 and Intune devices. Includes a real-world developer onboarding demo.</p>
<p>The post <a href="https://jensdufour.be/2026/04/01/automating-new-device-setup-with-nerdio-scripted-sequences/">Automating New Device Setup with Nerdio Scripted Sequences</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Introduction</h2>



<p>Setting up a new device for a developer usually means installing tools, cloning repositories, and applying configurations, <strong>all in a specific order</strong>. <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/what-is-intune">Microsoft Intune</a> handles app and script deployment well, but it does not guarantee execution order. A Git install that finishes after the script that clones your repos is a problem.</p>



<p><strong>Nerdio Scripted Sequences</strong> solve this. Introduced in <a href="https://getnerdio.com/">Nerdio Manager for Enterprise</a> (NME), Scripted Sequences let you define complex, multi-step task workflows with a guaranteed order of operations. They target Intune-managed devices, including <a href="https://learn.microsoft.com/en-us/windows-365/overview">Windows 365</a> Cloud PCs, and execute tasks sequentially through the Nerdio Endpoint Worker.</p>



<p>In this post we will build a real-world <strong>developer workstation onboarding sequence</strong> that installs Git, Visual Studio Code, clones team repositories, and confirms completion, all in the right order, every time.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> Scripted Sequences are in Public Preview. Feature scope and limitations may change in future NME releases.</p>
</blockquote>



<h2 class="wp-block-heading">What Are Scripted Sequences?</h2>



<p>Scripted Sequences are an automation feature in NME that lets you create multi-step task workflows deployed to Intune-managed devices. Think of them as a lightweight task sequencer built into the Nerdio console.</p>



<p>Key characteristics:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Aspect</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Supported targets</strong></td>
<td>Intune-managed devices, including Windows 365 Cloud PCs</td>
</tr>
<tr>
<td><strong>Execution engine</strong></td>
<td>Nerdio Endpoint Worker (deployed via Intune platform script)</td>
</tr>
<tr>
<td><strong>Concurrency limit</strong></td>
<td>100 concurrent tasks per sequence</td>
</tr>
<tr>
<td><strong>Task types</strong></td>
<td>PowerShell scripts, Winget installs, and other Intune-deliverable actions</td>
</tr>
</tbody>
</table></figure>



<p>Sequences respect the defined order of operations: Task 2 will not start until Task 1 completes successfully. Tasks can be grouped into <strong>Task Groups</strong> for logical organization. You can <strong>clone</strong> sequences, groups, and individual tasks for faster iteration.</p>



<h2 class="wp-block-heading">Prerequisites</h2>



<p>Before building your first sequence, make sure you have:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Requirement</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Intune integration</strong></td>
<td>Enabled in NME under <strong>Settings &gt; Environment &gt; Integrations &gt; Intune</strong></td>
</tr>
<tr>
<td><strong>Target device</strong></td>
<td>A Windows 365 Cloud PC or Intune-managed Windows device</td>
</tr>
<tr>
<td><strong>Nerdio Endpoint Worker</strong></td>
<td>Deployed to the target device (covered in Step 1)</td>
</tr>
<tr>
<td><strong>Permissions</strong></td>
<td>NME admin role with access to the Automation module</td>
</tr>
</tbody>
</table></figure>



<h2 class="wp-block-heading">The Demo Scenario</h2>



<p>We will automate day-one setup for a developer joining the team. The sequence installs prerequisites first, then tools, then runs a configuration script, in that exact order.</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Order</th>
<th>Task</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Set PowerShell Execution Policy</td>
<td>Allow scripts to run (RemoteSigned)</td>
</tr>
<tr>
<td>2</td>
<td>Install Git</td>
<td>Version control tooling</td>
</tr>
<tr>
<td>3</td>
<td>Install Visual Studio Code</td>
<td>Code editor</td>
</tr>
<tr>
<td>4</td>
<td>Clone repos and configure VS Code</td>
<td>Pull team repos and install extensions</td>
</tr>
<tr>
<td>5a</td>
<td>Add registry key</td>
<td>Create the completion marker key</td>
</tr>
<tr>
<td>5b</td>
<td>Set registry value</td>
<td>Confirm the sequence finished</td>
</tr>
</tbody>
</table></figure>



<p>Let&#8217;s build it.</p>



<h2 class="wp-block-heading">Step 1: Enable the Intune Integration</h2>



<p>Before you can use Scripted Sequences, the Intune integration must be enabled. This is where NME connects to your Intune tenant.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>NME</strong> &gt; <strong>Settings</strong> &gt; <strong>Environment</strong> &gt; <strong>Integrations</strong> &gt; <strong>Intune</strong>.</li>


<li>Ensure the Intune integration is enabled.</li>

</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> The initial Endpoint Worker deployment is controlled by Intune platform script delivery and may take some time. Subsequent tasks to the same device execute within a 15 to 30 minute window.</p>
</blockquote>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6ee49&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6ee49" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Nerdio Endpoint Worker deployment status in the NME console." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">Step 2: Configure Task Automation</h2>



<p>Task Automation must be configured before you can create or run Scripted Sequences.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>NME</strong> &gt; <strong>Settings</strong> &gt; <strong>Nerdio Environment</strong> &gt; <strong>Task Automation</strong>.</li>


<li>Click <strong>Configure</strong>.</li>


<li>Enter a name and select a resource group for the Azure storage account that Nerdio Manager will create.</li>


<li>Click <strong>Save</strong> to complete the configuration.</li>

</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Warning:</strong> If your NME deployment uses the <strong>Enable Private Endpoints</strong> scripted action, the storage account created here may have public network access disabled by default. The Nerdio Endpoint Worker on target devices needs to reach this storage account, so verify that public access is enabled or that a private endpoint is configured for it.</p>
</blockquote>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6f13e&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6f13e" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Configuring Task Automation in the NME console." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">Step 3: Create the Scripted Sequence</h2>



<ol class="wp-block-list">

<li>Navigate to <strong>NME</strong> &gt; <strong>Automation</strong> &gt; <strong>Scripted Sequences</strong>.</li>


<li>Click <strong>New Scripted Sequence</strong>.</li>


<li>Name the sequence <code>Developer Onboarding - Day One</code>.</li>


<li>Optionally add a description: <em>Installs developer tools and configures the workstation on first login.</em></li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6f33f&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6f33f" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Creating a new Scripted Sequence in the NME console." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">Step 4: Add a Task Group</h2>



<p>Task Groups let you organize related tasks. We will create one group for this sequence.</p>



<ol class="wp-block-list">

<li>Inside the sequence, click <strong>Add task or Add group</strong>.</li>


<li>Select <strong>Add group</strong>.</li>


<li>Name the group <code>Developer Tooling</code>.</li>

</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> A group must contain at least one task.</p>
</blockquote>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6f582&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6f582" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Adding a Task Group to the sequence." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">Step 5: Define the Tasks</h2>



<p>Add the following six tasks inside the <strong>Developer Tooling</strong> group. The order you add them is the order they will execute.</p>



<h3 class="wp-block-heading">Task 1: Set PowerShell Execution Policy</h3>



<p>This ensures all subsequent PowerShell-based tasks can run.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Set Execution Policy</code></li>


<li><strong>Type:</strong> PowerShell script</li>


<li><strong>Script:</strong></li>

</ul>



<pre class="wp-block-code"><code>Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force
</code></pre>



<h3 class="wp-block-heading">Task 2: Install Git</h3>



<p>This task uses a PowerShell script to install Git via winget. You could also use the <strong>Install Application</strong> task type instead.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Install Git</code></li>


<li><strong>Type:</strong> PowerShell script</li>


<li><strong>Script:</strong></li>

</ul>



<pre class="wp-block-code"><code>winget install --id Git.Git --accept-source-agreements --accept-package-agreements --silent
</code></pre>



<h3 class="wp-block-heading">Task 3: Install Visual Studio Code</h3>



<p>This task uses the <strong>Install Application</strong> task type, which lets you select a winget package directly without writing a script. You could also use a PowerShell script as shown in Task 2.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Install Visual Studio Code</code></li>


<li><strong>Type:</strong> Install Application</li>


<li><strong>Winget package ID:</strong> <code>Microsoft.VisualStudioCode</code></li>

</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6f964&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6f964" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Using the Install Application task type to install VS Code." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading">Task 4: Clone Repos and Configure VS Code</h3>



<p>This script clones the team repository and installs essential VS Code extensions. Adjust the repository URL and extension list to match your environment.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Configure Workstation</code></li>


<li><strong>Type:</strong> PowerShell script</li>


<li><strong>Script:</strong></li>

</ul>



<pre class="wp-block-code"><code># Refresh PATH so git and code are available
$env:Path = [System.Environment]::GetEnvironmentVariable(&quot;Path&quot;, &quot;Machine&quot;) + &quot;;&quot; + [System.Environment]::GetEnvironmentVariable(&quot;Path&quot;, &quot;User&quot;)

# Clone team repository
$repoPath = &quot;$env:USERPROFILE\Source\Repos&quot;
New-Item -ItemType Directory -Path $repoPath -Force | Out-Null
git clone https://dev.azure.com/contoso/project/_git/main-repo &quot;$repoPath\main-repo&quot;

# Install VS Code extensions
code --install-extension ms-vscode.powershell
code --install-extension ms-python.python
code --install-extension hashicorp.terraform
</code></pre>



<h3 class="wp-block-heading">Task 5a: Add Registry Key</h3>



<p>First, create the registry key that will hold the completion marker.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Log Completion</code></li>


<li><strong>Action:</strong> Add Registry Key</li>


<li><strong>Key path:</strong> <code>HKLM\SOFTWARE\LeafIT\NerdioSequences</code></li>

</ul>



<h3 class="wp-block-heading">Task 5b: Set Registry Value</h3>



<p>Next, set a value under the key to confirm the sequence completed. This makes it easy to query device status remotely via Intune or PowerShell.</p>



<ul class="wp-block-list">

<li><strong>Task name:</strong> <code>Log Completion clone</code></li>


<li><strong>Action:</strong> Set Registry Value</li>


<li><strong>Key path:</strong> <code>HKLM\SOFTWARE\LeafIT\NerdioSequences</code></li>


<li><strong>Name:</strong> <code>DeveloperOnboarding</code></li>


<li><strong>Value type:</strong> String</li>


<li><strong>Value:</strong> <code>Completed</code></li>

</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6fd1b&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6fd1b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Setting a registry value to log sequence completion." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-06.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">Step 6: Clone Tasks for Quick Iteration</h2>



<p>Need a second sequence for designers with different tools? Since NME v7.6.0, you can <strong>clone</strong> the entire sequence or individual task groups and tasks.</p>



<ol class="wp-block-list">

<li>On the <strong>Scripted Sequences</strong> page, select the <code>Developer Onboarding - Day One</code> sequence.</li>


<li>Click <strong>Clone</strong>.</li>


<li>Rename the cloned sequence and swap Git/VS Code for the tools your designers need.</li>

</ol>



<p>This saves significant time compared to rebuilding sequences from scratch.</p>



<h2 class="wp-block-heading">Step 7: Target Devices and Execute</h2>



<ol class="wp-block-list">

<li>On the <strong>Scripted Sequences</strong> page, click the three dots to the right of the <code>Developer Onboarding - Day One</code> sequence.</li>


<li>Click <strong>Run now</strong>.</li>


<li>Select the target Windows 365 Cloud PC or Intune device.</li>

</ol>



<p>NME will push the tasks to the Nerdio Endpoint Worker on the device. Each task runs in order. Task 2 only starts after Task 1 reports success.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d6ffee&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d6ffee" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Targeting a Windows 365 Cloud PC for sequence execution." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/automating-new-device-setup-with-nerdio-scripted-sequences/automating-new-device-setup-with-nerdio-scripted-sequences-07.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Tip:</strong> Monitor progress in <strong>NME</strong> &gt; <strong>Logs</strong>.</p>
</blockquote>



<h2 class="wp-block-heading">Step 8: Validate on the Device</h2>



<p>Log into the target Cloud PC and verify:</p>



<ol class="wp-block-list">

<li><strong>Git</strong> is installed. Open a terminal and run <code>git --version</code>.</li>


<li><strong>VS Code</strong> is installed. Launch it from the Start menu.</li>


<li><strong>Repos</strong> are cloned. Check <code>%USERPROFILE%\Source\Repos\main-repo</code>.</li>


<li><strong>Extensions</strong> are present. Open VS Code and navigate to the Extensions panel.</li>


<li><strong>Registry key</strong> exists. Open a terminal and run <code>reg query "HKLM\SOFTWARE\LeafIT\NerdioSequences" /v DeveloperOnboarding</code>.</li>

</ol>



<h2 class="wp-block-heading">Current Limitations</h2>



<p>Scripted Sequences are still in Public Preview. Keep these constraints in mind:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Limitation</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Concurrency</strong></td>
<td>Maximum 100 concurrent tasks per sequence</td>
</tr>
<tr>
<td><strong>Device scope</strong></td>
<td>Intune-managed devices only (AVD support planned for a future release)</td>
</tr>
<tr>
<td><strong>Targeting</strong></td>
<td>Manual device selection required; automated assignment to new devices is planned</td>
</tr>
<tr>
<td><strong>Initial deployment</strong></td>
<td>The Endpoint Worker relies on Intune platform script delivery, which can take time on first deploy</td>
</tr>
<tr>
<td><strong>Cross-tenant</strong></td>
<td>Running sequences against secondary tenant Windows 365 devices is not yet supported</td>
</tr>
</tbody>
</table></figure>



<h2 class="wp-block-heading">Conclusion</h2>



<p><strong>Nerdio Scripted Sequences</strong> bring deterministic, ordered task execution to Intune-managed devices. This is something native Intune cannot guarantee today. By combining simple PowerShell scripts in a defined sequence, you can automate complex onboarding workflows and ensure every new device is configured consistently.</p>



<p>As the feature moves toward general availability, expect expanded scope and deeper integration within NME. For now, it is already a practical tool for any organization managing Intune endpoints at scale.</p>
<p>The post <a href="https://jensdufour.be/2026/04/01/automating-new-device-setup-with-nerdio-scripted-sequences/">Automating New Device Setup with Nerdio Scripted Sequences</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2026/04/01/automating-new-device-setup-with-nerdio-scripted-sequences/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Enabling AI Frontier Capabilities on Windows 365 with Intune</title>
		<link>https://jensdufour.be/2026/03/01/enabling-ai-frontier-capabilities-on-windows-365-with-intune/</link>
					<comments>https://jensdufour.be/2026/03/01/enabling-ai-frontier-capabilities-on-windows-365-with-intune/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Sat, 28 Feb 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Cloud PC]]></category>
		<category><![CDATA[Copilot+]]></category>
		<category><![CDATA[Frontier Preview]]></category>
		<category><![CDATA[Intune]]></category>
		<category><![CDATA[Windows 365]]></category>
		<guid isPermaLink="false">https://jensdufour.be/?p=998</guid>

					<description><![CDATA[<p>Enable Copilot+ AI features on an AI-enabled Windows 365 Cloud PC with Intune. Covers improved Windows Search and Click to Do.</p>
<p>The post <a href="https://jensdufour.be/2026/03/01/enabling-ai-frontier-capabilities-on-windows-365-with-intune/">Enabling AI Frontier Capabilities on Windows 365 with Intune</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Copilot+ PC features like improved Windows Search and Click to Do are no longer limited to devices with a physical NPU. Through the <strong>Frontier Preview</strong>, Microsoft now lets you create an <strong>AI-enabled Windows 365 Cloud PC</strong> with 8 vCPUs. In this post we will walk through every Intune configuration step needed to enable them at scale, from dynamic group creation all the way to validation.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> The Frontier Preview is a public preview. Future availability depends on its results and is subject to change.</p>
</blockquote>



<h2 class="wp-block-heading">Prerequisites at a Glance</h2>



<p>Before diving into the configuration, make sure you have the following in place:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Requirement</th>
<th>Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>SKU</strong></td>
<td>Windows 365 Enterprise, minimum <strong>8 vCPU / 32 GB RAM / 256 GB disk</strong></td>
</tr>
<tr>
<td><strong>Region</strong></td>
<td>West Europe, North Europe, UK South, East US, East US 2, Central US, West US 2, West US 3, Central India, South East Asia, or Australia East</td>
</tr>
<tr>
<td><strong>OS build</strong></td>
<td>Windows 24H2 (&gt;= 26100.6584) or 25H2 (&gt;= 26200.6584)</td>
</tr>
<tr>
<td><strong>Windows Insider</strong></td>
<td>Users must be registered with the Windows Insider Program</td>
</tr>
<tr>
<td><strong>Licensing</strong></td>
<td>A Windows 365 Enterprise license assigned to the target users</td>
</tr>
</tbody>
</table></figure>



<p>With these in place, let&#8217;s start configuring.</p>



<h2 class="wp-block-heading">Step 1: Create Dynamic Entra ID Groups</h2>



<p>To target the right Cloud PCs and users, we will create two dynamic groups in Entra ID. This ensures that any future 8 vCPU Cloud PCs and their users are automatically included.</p>



<h3 class="wp-block-heading">W365-U-Frontier (Dynamic user group)</h3>



<p>This group automatically contains all users that have a Windows 365 Enterprise 8 vCPU license assigned.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Entra admin center</strong> &gt; <strong>Groups</strong> &gt; <strong>All groups</strong> &gt; <strong>New group</strong>.</li>


<li>Set the <strong>Group type</strong> to <strong>Security</strong>.</li>


<li>Set the <strong>Group name</strong> to <code>W365-U-Frontier</code>.</li>


<li>Set <strong>Membership type</strong> to <strong>Dynamic User</strong>.</li>


<li>Click <strong>Add dynamic query</strong> and enter the following rule:</li>

</ol>



<pre class="wp-block-code"><code>(user.assignedPlans -any (assignedPlan.servicePlanId -eq &quot;69dc175c-dcff-4757-8389-d19e76acb45d&quot; -and assignedPlan.capabilityStatus -eq &quot;Enabled&quot;))
</code></pre>



<p>The service plan ID <code>69dc175c-dcff-4757-8389-d19e76acb45d</code> corresponds to the <code>CPC_E_8C_32GB_256GB</code> SKU (Windows 365 Enterprise 8 vCPU, 32 GB, 256 GB).</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d717f0&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d717f0" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Dynamic user group configuration with service plan ID rule" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>Click <strong>Save</strong> and then <strong>Create</strong>.</li>

</ol>



<h3 class="wp-block-heading">W365-D-Frontier (Dynamic device group)</h3>



<p>This group automatically contains all Cloud PC devices that match the 8 vCPU configuration. The <code>deviceModel</code> property in Entra ID follows the format <code>Cloud PC Enterprise 8vCPU/&lt;RAM&gt;/&lt;disk&gt;</code>, so we use a <code>-startsWith</code> operator to capture all variants (128 GB, 256 GB, 512 GB).</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Entra admin center</strong> &gt; <strong>Groups</strong> &gt; <strong>All groups</strong> &gt; <strong>New group</strong>.</li>


<li>Set the <strong>Group type</strong> to <strong>Security</strong>.</li>


<li>Set the <strong>Group name</strong> to <code>W365-D-Frontier</code>.</li>


<li>Set <strong>Membership type</strong> to <strong>Dynamic Device</strong>.</li>


<li>Click <strong>Add dynamic query</strong> and enter the following rule:</li>

</ol>



<pre class="wp-block-code"><code>(device.deviceModel -startsWith &quot;Cloud PC Enterprise 8vCPU&quot;)
</code></pre>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d71a69&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d71a69" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Dynamic device group configuration with deviceModel startsWith rule" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>Click <strong>Save</strong> and then <strong>Create</strong>.</li>

</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Tip:</strong> Give the dynamic membership rules a few minutes to evaluate. You can check the membership under <strong>Groups</strong> &gt; <strong>W365-D-Frontier</strong> &gt; <strong>Members</strong> to confirm devices are populating.</p>
</blockquote>



<h2 class="wp-block-heading">Step 2: Configure the PowerShell Execution Policy</h2>



<p>AI-enabled features require the <strong>RemoteSigned</strong> execution policy on the Cloud PC. Instead of configuring this manually on each device, deploy it through Intune.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Intune admin center</strong> &gt; <strong>Devices</strong> &gt; <strong>Configuration</strong> &gt; <strong>Create</strong> &gt; <strong>New Policy</strong>.</li>


<li>Select <strong>Windows 10 and later</strong> as the platform and <strong>Settings catalog</strong> as the profile type.</li>


<li>Name the policy <code>DEV-CONF-W365-FRONTIER-EXECUTIONPOLICY</code>.</li>


<li>Click <strong>Add settings</strong> and search for <code>PowerShell</code>.</li>


<li>Select <strong>Administrative Templates &gt; Windows Components &gt; Windows PowerShell</strong> and enable <strong>Turn on Script Execution</strong>.</li>


<li>Set <strong>Execution Policy</strong> to <strong>Allow only signed scripts</strong> (this is the RemoteSigned equivalent).</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d71d2c&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d71d2c" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Execution policy configuration in the Settings Catalog" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>On the <strong>Assignments</strong> tab, assign to the <strong>W365-D-Frontier</strong> device group.</li>


<li>Click <strong>Create</strong>.</li>

</ol>



<h2 class="wp-block-heading">Step 3: Enable Features Introduced via Servicing</h2>



<p>A Windows Update policy must be enabled so that features delivered through servicing updates are activated. This setting is not available in the Settings Catalog, so we deploy it as a custom configuration profile using OMA-URI.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Intune admin center</strong> &gt; <strong>Devices</strong> &gt; <strong>Configuration</strong> &gt; <strong>Create</strong> &gt; <strong>New Policy</strong>.</li>


<li>Select <strong>Windows 10 and later</strong> as the platform and <strong>Templates</strong> as the profile type, then select <strong>Custom</strong>.</li>


<li>Name the policy <code>DEV-CONF-W365-FRONTIER-SERVICING</code>.</li>


<li>Click <strong>Add</strong> under <strong>OMA-URI Settings</strong> and configure the following:</li>

</ol>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Name</strong></td>
<td>Enable features introduced via servicing</td>
</tr>
<tr>
<td><strong>OMA-URI</strong></td>
<td><code>./Device/Vendor/MSFT/Policy/Config/Update/AllowTemporaryEnterpriseFeatureControl</code></td>
</tr>
<tr>
<td><strong>Data type</strong></td>
<td>Integer</td>
</tr>
<tr>
<td><strong>Value</strong></td>
<td><code>1</code></td>
</tr>
</tbody>
</table></figure>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d71f92&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d71f92" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Custom OMA-URI policy for AllowTemporaryEnterpriseFeatureControl" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>Click <strong>Save</strong>, then <strong>Next</strong>.</li>


<li>On the <strong>Assignments</strong> tab, assign to the <strong>W365-D-Frontier</strong> device group.</li>


<li>Click <strong>Create</strong>.</li>

</ol>



<h2 class="wp-block-heading">Step 4: Enable Optional Diagnostics Data</h2>



<p>The Windows Insider Program requires optional diagnostics data to be enabled on Cloud PCs. Without it, the device will display &#8220;To join the Insider program, turn on optional diagnostics data&#8221; and cannot enroll in the Beta channel. Deploy this through a Settings Catalog policy.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Intune admin center</strong> &gt; <strong>Devices</strong> &gt; <strong>Configuration</strong> &gt; <strong>Create</strong> &gt; <strong>New Policy</strong>.</li>


<li>Select <strong>Windows 10 and later</strong> as the platform and <strong>Settings catalog</strong> as the profile type.</li>


<li>Name the policy <code>DEV-CONF-W365-FRONTIER-DIAGNOSTICS</code>.</li>


<li>Click <strong>Add settings</strong> and search for <code>Allow Telemetry</code>.</li>


<li>Select <strong>System &gt; Allow Telemetry</strong> and set it to <strong>Full</strong> (this enables optional diagnostics data).</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d721f4&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d721f4" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Optional diagnostics data configuration" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>On the <strong>Assignments</strong> tab, assign to the <strong>W365-D-Frontier</strong> device group.</li>


<li>Click <strong>Create</strong>.</li>

</ol>



<h2 class="wp-block-heading">Step 5: Enroll Cloud PCs in the Windows Insider Beta Channel</h2>



<p>The AI features require the Windows Insider Beta channel. Instead of having each user manually opt in, use an Intune Update Ring to handle this at scale.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Intune admin center</strong> &gt; <strong>Devices</strong> &gt; <strong>Windows updates</strong> &gt; <strong>Update rings</strong>.</li>


<li>Click <strong>+ Create profile</strong>.</li>


<li>Name it <code>DEV-CONF-W365-FRONTIER-INSIDERBETA</code>.</li>


<li>Under <strong>Update ring settings</strong>:

<ul class="wp-block-list">

<li>Set <strong>Enable pre-release builds</strong> to <strong>Enable</strong>.</li>


<li>Set <strong>Select pre-release channel</strong> to <strong>Beta Channel</strong>.</li>

</ul>


</li>


<li>Leave the remaining settings at their defaults.</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d72487&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d72487" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Windows Insider Beta channel update ring configuration" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-06.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>On the <strong>Assignments</strong> tab, assign to the <strong>W365-D-Frontier</strong> device group.</li>


<li>Click <strong>Create</strong>.</li>

</ol>



<p>After the policy syncs, Cloud PCs will start receiving Beta channel updates. Make sure devices check for updates and restart.</p>



<h2 class="wp-block-heading">Step 6: Assign AI-Enablement in Intune</h2>



<p>With all prerequisites deployed, you can now flip the switch to enable AI features on the targeted Cloud PCs.</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Microsoft Intune admin center</strong> &gt; <strong>Devices</strong> &gt; <strong>Device onboarding</strong> &gt; <strong>Windows 365</strong>.</li>


<li>Select the <strong>Settings</strong> tab.</li>


<li>Click <strong>Create</strong> and select <strong>Cloud PC configurations</strong>.</li>


<li>Enter a <strong>Name</strong>, for example <code>USR-CONF-W365-FRONTIER-AIENABLEMENT</code>.</li>


<li>On the <strong>Configuration settings</strong> tab, set <strong>AI-enabled features</strong> to <strong>Enable</strong>.</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d726f8&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d726f8" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="AI-enablement configuration settings" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-07.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<ol class="wp-block-list">

<li>On the <strong>Assignments</strong> tab, assign to the <strong>W365-U-Frontier</strong> user group.</li>


<li>Proceed to <strong>Review + create</strong> and click <strong>Create</strong>.</li>

</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Important:</strong> After AI-enablement is assigned, it can take <strong>up to 48 hours</strong> for the background processes to complete. During this time, the Cloud PCs are setting up the AI infrastructure locally.</p>
</blockquote>



<h2 class="wp-block-heading">Step 7: Apply Updates and Restart</h2>



<p>Once the 48-hour enablement window has passed, updates need to be applied:</p>



<ol class="wp-block-list">

<li>On the Cloud PC, open <strong>Settings</strong> &gt; <strong>Windows Update</strong>.</li>


<li>Click <strong>Check for updates</strong>, install any pending updates, and <strong>restart</strong>.</li>


<li><strong>Repeat</strong> this process 3-5 times until no more updates are pending.</li>

</ol>



<p>This can also be managed at scale using Intune&#8217;s <strong>Windows Update for Business</strong> policies or by using <strong>Expedite updates</strong> to push things along.</p>



<h2 class="wp-block-heading">Step 8: Validate the Deployment</h2>



<p>After the updates have been applied, you can verify that AI features are active in several places.</p>



<h3 class="wp-block-heading">Intune Admin Validation</h3>



<p><strong>Device Overview page:</strong>
Navigate to <strong>Devices</strong> &gt; select a Cloud PC &gt; <strong>Overview</strong>. The <strong>Essentials</strong> tab will show an <strong>AI-enabled</strong> field.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d72a4c&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d72a4c" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="AI-enablement Cloud PC" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-08.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><strong>Reports dashboard:</strong>
Navigate to <strong>Reports</strong> &gt; <strong>Windows 365</strong> &gt; <strong>Cloud PC overview</strong>. You will see a breakdown of AI-enabled Cloud PCs by status:</p>



<ul class="wp-block-list">

<li><strong>Initiated</strong> &#8211; AI enablement is in progress</li>


<li><strong>Ready to use</strong> &#8211; Features are available</li>


<li><strong>Failed</strong> &#8211; Setup could not complete</li>

</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d72bf5&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d72bf5" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="AI-enablement Cloud PC overview" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-09.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading">End-User Validation</h3>



<p><strong>Windows App:</strong>
AI-enabled Cloud PCs show an <strong>&#8220;AI-enabled&#8221;</strong> tag on the device card within the Windows App.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d72d75&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d72d75" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Windows app AI-enabled tag" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/enabling-ai-frontier-capabilities-on-windows-365-with-intune/enabling-ai-frontier-capabilities-on-windows-365-with-intune-10.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><strong>Windows Taskbar:</strong>
The search box on the taskbar displays a <strong>magnifying glass with sparkles</strong> icon when AI features are active.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> After a Windows Update, the sparkles icon might temporarily disappear. If clicking the search box doesn&#8217;t restore it, check the <a href="https://learn.microsoft.com/en-us/troubleshoot/windows-365/windows-365-ai-enabled-cloud-pc-known-issues">AI-enabled Cloud PC Known Issues</a> page.</p>
</blockquote>



<h2 class="wp-block-heading">What You Get: Supported Features</h2>



<p>Once everything is set up, your Cloud PCs get access to the following Copilot+ features:</p>



<h3 class="wp-block-heading">Improved Windows Search</h3>



<p>Users can find files using <strong>descriptive, natural-language queries</strong>. The AI interprets intent and searches across local files and OneDrive. For example, searching &#8220;airplane&#8221; will surface a photo named <code>Picture26.jpg</code> that contains an airplane.</p>



<p>This works in both the <strong>Windows Search box</strong> on the taskbar and in <strong>File Explorer</strong>. It supports English, Chinese (Simplified), French, German, Japanese, and Spanish.</p>



<h3 class="wp-block-heading">Click to Do</h3>



<p>Press <strong>Win + Q</strong> or hold the <strong>Windows key</strong> while left-clicking an element on screen to get contextual actions on highlighted text or images. You can summarize text, look up information, or perform actions on images without switching apps.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> You must launch the Click to Do app once after AI-enablement and after every Cloud PC restart before the keyboard shortcuts work. Some intelligent text actions (like &#8220;Ask Microsoft 365 Copilot&#8221;) are not yet supported on Cloud PCs.</p>
</blockquote>



<h2 class="wp-block-heading">Managing and Removing AI Features</h2>



<h3 class="wp-block-heading">Granular Feature Control</h3>



<p>If you want to keep AI-enablement but toggle individual features:</p>



<ul class="wp-block-list">

<li><strong>Click to Do</strong>: Manage through <a href="https://learn.microsoft.com/en-us/windows/client-management/manage-click-to-do">Click to Do client management policies</a>.</li>


<li><strong>Improved Windows Search</strong>: Use the <a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/policy-csp-search">Search Policy CSP</a> settings in Intune.</li>

</ul>



<h3 class="wp-block-heading">Disabling AI-Enablement Entirely</h3>



<p>There are two options:</p>



<ol class="wp-block-list">

<li><strong>Unassign</strong> the user from the Enable policy.</li>


<li><strong>Create a Disable policy</strong>: Follow the same steps as Step 6, but set <strong>AI-enabled features</strong> to <strong>Disable</strong> and assign to the target group. The Disable policy takes precedence over Enable during conflict resolution.</li>

</ol>



<p>After disabling, it can take up to 48 hours for the AI features to be removed from the Cloud PCs.</p>



<h2 class="wp-block-heading">Privacy and Security</h2>



<p>AI-enabled Cloud PCs follow the same <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/privacy-personal-data">Windows 365 privacy and data policies</a>:</p>



<ul class="wp-block-list">

<li><strong>Processing</strong>: AI features process data <strong>ephemerally</strong> using a secure Windows 365 cloud service. No personal or user data is stored in the cloud service or used for AI model training.</li>


<li><strong>Storage</strong>: All data and indexes are stored <strong>locally on the Cloud PC</strong>. This is unchanged from existing Windows AI features.</li>


<li><strong>Controls</strong>: AI features are <strong>off by default</strong>. The IT admin must explicitly enable them through the configuration steps described above.</li>

</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p>With a few Intune policies and a couple of dynamic Entra ID groups, you can bring Copilot+ AI features to your Windows 365 8 vCPU fleet without touching a single Cloud PC. The key steps are:</p>



<ol class="wp-block-list">

<li>Create dynamic groups to target the right users and devices.</li>


<li>Deploy execution policy and servicing feature policies.</li>


<li>Enable optional diagnostics data for Windows Insider enrollment.</li>


<li>Enroll devices in the Windows Insider Beta channel.</li>


<li>Enable AI features through a Cloud PC configuration.</li>


<li>Apply updates and validate.</li>

</ol>



<p>For troubleshooting, check the <a href="https://learn.microsoft.com/en-us/troubleshoot/windows-365/windows-365-ai-enabled-cloud-pc-known-issues">AI-enabled Cloud PC Known Issues</a> page. For the full Microsoft documentation, see <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/ai-enabled-cloud-pcs">AI-enabled Cloud PC (Frontier Preview)</a> and <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/manage-ai-enabled-features">Manage AI-enabled features</a>.</p>



<p>Looking for more Windows 365 management tips? Check out <a href="https://jensdufour.be/2025/08/18/windows-365-restore-points-a-guide-to-long-term-storage/">Windows 365 Restore Points: A Guide to Long-Term Storage</a> and <a href="https://jensdufour.be/2023/04/01/adding-languages-using-proactive-remediations/">Adding Language Packs Using Proactive Remediations</a>.</p>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">

<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/ai-enabled-cloud-pcs">AI-enabled Cloud PC (Frontier Preview)</a></li>


<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/manage-ai-enabled-features">Manage AI-enabled features on Cloud PCs</a></li>


<li><a href="https://learn.microsoft.com/en-us/troubleshoot/windows-365/windows-365-ai-enabled-cloud-pc-known-issues">AI-enabled Cloud PC Known Issues</a></li>


<li><a href="https://learn.microsoft.com/en-us/entra/identity/users/licensing-service-plan-reference">Product names and service plan identifiers for licensing</a></li>

</ul>
<p>The post <a href="https://jensdufour.be/2026/03/01/enabling-ai-frontier-capabilities-on-windows-365-with-intune/">Enabling AI Frontier Capabilities on Windows 365 with Intune</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2026/03/01/enabling-ai-frontier-capabilities-on-windows-365-with-intune/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</title>
		<link>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/</link>
					<comments>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Sat, 31 Jan 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[AuthD]]></category>
		<category><![CDATA[Authentication]]></category>
		<category><![CDATA[Entra ID]]></category>
		<category><![CDATA[Intune]]></category>
		<category><![CDATA[MFA]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://jensdufour.be/2026/02/04/entra-id-authentication-with-authd/</guid>

					<description><![CDATA[<p>Configure Entra ID authentication with AuthD on Ubuntu 24.04. Covers app registration, broker setup, MFA support, and offline caching.</p>
<p>The post <a href="https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/">Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Update (March 2026):</strong> With Ubuntu 26.04 LTS, AuthD is now included in the official Ubuntu archive (universe) and no longer requires a PPA. The instructions in this guide target Ubuntu 24.04 LTS, where the PPA is still required. If you are running Ubuntu 26.04 LTS, you can skip the PPA step and install AuthD directly with <code>sudo apt install authd</code>. Additionally, a generic OIDC broker is now available for integration with any standards-compliant identity provider. For full details, see the <a href="https://discourse.ubuntu.com/t/authd-enters-the-ubuntu-archive-in-26-04-lts/78193">official announcement</a>.</p>
</blockquote>



<h2 class="wp-block-heading">Introduction to Entra ID Authentication</h2>



<p>This guide replaces the legacy PAM-based Entra ID authentication method for older Ubuntu versions.</p>



<p><strong>Entra ID authentication</strong> using AuthD represents a significant shift in how enterprises manage Linux workstation identity. As organizations adopt Ubuntu for development, data science, and productivity workloads, the need for cloud-native authentication becomes critical. AuthD provides the solution, enabling users to log in to Ubuntu with their Microsoft Entra ID credentials.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d74cf2&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d74cf2" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><em>Figure 1: Ubuntu 24.04 LTS with GDM showing Microsoft Entra ID login option</em></p>



<p>Traditional approaches like LDAP, Kerberos, or SSSD configurations require significant infrastructure and expertise. Furthermore, they complicate the user experience with separate credentials. For organizations invested in Microsoft Entra ID (formerly Azure AD), the question becomes: can we provide the same seamless, secure <strong>Entra ID authentication</strong> experience that users expect on Windows?</p>



<p>The answer is <strong>yes</strong>, thanks to <strong>AuthD</strong> (Ubuntu&#8217;s authentication daemon). With AuthD, you can achieve:</p>



<ul class="wp-block-list">

<li><strong>Single Sign-On</strong> with Entra ID credentials on Ubuntu desktops</li>


<li><strong>Multi-Factor Authentication (MFA)</strong> using Microsoft Authenticator</li>


<li><strong>Device code flow</strong> authentication at the login screen</li>


<li><strong>Elimination of local accounts</strong> for enhanced security</li>


<li><strong>Offline credential caching</strong> for disconnected scenarios</li>

</ul>



<p>In this guide, you’ll learn how to:</p>



<ul class="wp-block-list">

<li>Configure Azure app registration for AuthD</li>


<li>Install and configure AuthD on Ubuntu 24.04 LTS</li>


<li>Disable local account login while maintaining recovery access</li>


<li>Troubleshoot common authentication issues</li>

</ul>



<p>Whether you’re securing a handful of Linux workstations or planning an enterprise-wide rollout, this guide provides everything you need for <strong>Entra ID authentication</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> This guide focuses on <strong>manual</strong> AuthD configuration. For device management with Microsoft Intune, see our companion article on <a href="https://jensdufour.be/2026/01/02/enrolling-ubuntu-intune-device-management/">Enrolling Ubuntu 24.04 LTS in Microsoft Intune</a>. For a fully <strong>automated zero-touch deployment</strong> using autoinstall and cloud-init, see <a href="https://jensdufour.be/2026/01/02/zero-touch-ubuntu-entra-id-autoinstall/">Automating Ubuntu Entra ID Authentication</a>.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Understanding Entra ID Authentication Components</h2>



<p>Before configuring <strong>Entra ID authentication</strong>, it’s essential to understand the technologies that make this solution work.</p>



<h3 class="wp-block-heading">AuthD: The Core of Entra ID Authentication</h3>



<p><a href="https://github.com/canonical/authd">AuthD</a> is Ubuntu&#8217;s modern authentication daemon designed specifically for cloud identity providers. Unlike traditional solutions that require domain controllers or complex LDAP configurations, AuthD provides a streamlined approach to cloud authentication.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d750cc&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d750cc" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="AuthD architecture with MS Entra ID broker integration" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><em>Figure 2: AuthD architecture with MS Entra ID broker integration</em></p>



<p><strong>Key Features:</strong></p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Feature</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Modular Architecture</strong></td>
<td>Uses “brokers” to interface with different identity providers</td>
</tr>
<tr>
<td><strong>Cloud-Native</strong></td>
<td>Designed for MS Entra ID and Google IAM from the ground up</td>
</tr>
<tr>
<td><strong>MFA Support</strong></td>
<td>Built-in support for device authentication flow</td>
</tr>
<tr>
<td><strong>Offline Caching</strong></td>
<td>Allows cached credentials for offline login</td>
</tr>
<tr>
<td><strong>GDM Integration</strong></td>
<td>Native integration with GNOME Display Manager</td>
</tr>
<tr>
<td><strong>SSH Support</strong></td>
<td>PAM module for SSH authentication</td>
</tr>
</tbody>
</table></figure>



<p>AuthD consists of two main components:</p>



<ol class="wp-block-list">

<li><strong>authd</strong>: The core authentication daemon (Debian package) that handles PAM integration</li>


<li><strong>Identity broker</strong>: A Snap package that interfaces with your identity provider (e.g., <code>authd-msentraid</code> for Microsoft Entra ID)</li>

</ol>



<p>Together, these components enable secure <strong>Entra ID authentication</strong> with minimal configuration overhead.</p>



<h3 class="wp-block-heading">Microsoft Entra ID as the Identity Provider</h3>



<p>Microsoft Entra ID serves as the identity provider for <strong>Entra ID authentication</strong>. Key capabilities include:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Capability</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Centralized Identity</strong></td>
<td>Single source of truth for user identities</td>
</tr>
<tr>
<td><strong>Multi-Factor Authentication</strong></td>
<td>Device code flow with Microsoft Authenticator</td>
</tr>
<tr>
<td><strong>Conditional Access</strong></td>
<td>Risk-based access decisions (when combined with Intune)</td>
</tr>
<tr>
<td><strong>Group-Based Access</strong></td>
<td>Control who can log into Linux devices</td>
</tr>
<tr>
<td><strong>Security Monitoring</strong></td>
<td>Sign-in logs and risk detection</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Architecture Overview</h3>



<p>The following diagram shows how <strong>Entra ID authentication</strong> works:</p>



<pre class="wp-block-code"><code>┌─────────────────────────────────────────────────────────────────────┐
│                         Ubuntu 24.04 LTS                            │
│                                                                     │
│  ┌──────────┐    ┌──────────┐    ┌──────────────────────────────┐   │
│  │   GDM    │───&#x25b6;│  AuthD   │───&#x25b6;│  MS Entra ID Broker (Snap)  │   │
│  │ (Login)  │    │ (daemon) │    │  (authd-msentraid)           │   │
│  └──────────┘    └──────────┘    └──────────────────────────────┘   │
│       │               │                      │                      │
│       │               │                      │                      │
│  ┌────▼───────────────▼──────┐               │                      │
│  │      PAM Configuration    │               │                      │
│  │   (Pluggable Auth Module) │               │                      │
│  └───────────────────────────┘               │                      │
│                                              │                      │
└──────────────────────────────────────────────│──────────────────────┘
                                               │
                                               ▼
                         ┌────────────────────────────────────────────┐
                         │           Microsoft Entra ID               │
                         │      (Authentication &amp; Authorization)      │
                         └────────────────────────────────────────────┘
</code></pre>



<p>The <strong>Entra ID authentication</strong> flow works as follows:</p>



<ol class="wp-block-list">

<li>First, the user attempts login at GDM (GNOME Display Manager)</li>


<li>Then, GDM invokes AuthD through PAM to handle authentication</li>


<li>Next, AuthD delegates to the MS Entra ID broker</li>


<li>Subsequently, the broker initiates authentication flow with Entra ID</li>


<li>Upon success, AuthD creates or updates the local user account</li>


<li>Finally, the user is logged in to the desktop</li>

</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Prerequisites for Entra ID Authentication</h2>



<p>Before implementing <strong>Entra ID authentication</strong>, ensure all prerequisites are met.</p>



<h3 class="wp-block-heading">Licensing Requirements</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>License</th>
<th>Purpose</th>
<th>Required</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Microsoft Entra ID Free</strong></td>
<td>Basic authentication</td>
<td>Minimum</td>
</tr>
<tr>
<td><strong>Microsoft Entra ID P1</strong></td>
<td>Conditional Access (with Intune)</td>
<td>Recommended</td>
</tr>
<tr>
<td><strong>Microsoft 365 E3/E5</strong></td>
<td>Includes Entra ID P1</td>
<td>Alternative</td>
</tr>
</tbody>
</table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Note:</strong> AuthD itself is free. Licensing requirements depend on features you want to use in Entra ID.</p>
</blockquote>



<h3 class="wp-block-heading">Technical Prerequisites</h3>



<p><strong>Ubuntu System:</strong></p>



<ul class="wp-block-list">

<li>Ubuntu Desktop 24.04 LTS (fresh install recommended)</li>


<li>GNOME desktop environment (included by default)</li>


<li>amd64 or arm64 architecture</li>


<li>Network connectivity to Microsoft services</li>


<li>Local administrator account for initial setup</li>

</ul>



<p><strong>Azure Requirements:</strong></p>



<ul class="wp-block-list">

<li>Global Administrator or Application Administrator role</li>


<li>Permission to create app registrations in Entra ID</li>

</ul>



<h3 class="wp-block-heading">Network Requirements</h3>



<p>Ensure the following endpoints are accessible:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Endpoint</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>login.microsoftonline.com</code></td>
<td>Entra ID authentication</td>
</tr>
<tr>
<td><code>graph.microsoft.com</code></td>
<td>Microsoft Graph API</td>
</tr>
<tr>
<td><code>microsoft.com/devicelogin</code></td>
<td>Device code flow</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Security Considerations</h3>



<p>Before disabling local accounts, plan for:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Consideration</th>
<th>Recommendation</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Recovery Access</strong></td>
<td>Document single-user mode recovery procedure</td>
</tr>
<tr>
<td><strong>Break-Glass Account</strong></td>
<td>Create an emergency admin account in Entra ID</td>
</tr>
<tr>
<td><strong>Disk Encryption</strong></td>
<td>Use LUKS, store recovery key securely</td>
</tr>
<tr>
<td><strong>Network Dependency</strong></td>
<td>Plan for offline login scenarios (cached credentials)</td>
</tr>
<tr>
<td><strong>Rollback Plan</strong></td>
<td>Keep local admin access until fully validated</td>
</tr>
</tbody>
</table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Azure Configuration for Entra ID Authentication</h2>



<p>To enable <strong>Entra ID authentication</strong>, you must first create an app registration in Azure.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d757da&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d757da" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="Azure Portal app registration for AuthD" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><em>Figure 3: Azure Portal showing app registration configuration for AuthD</em></p>



<h3 class="wp-block-heading">Step 1: Create App Registration</h3>



<ol class="wp-block-list">

<li><strong>Navigate to Azure Portal</strong>

<ul class="wp-block-list">

<li>Go to <a href="https://portal.azure.com/">portal.azure.com</a></li>


<li>Select <strong>Microsoft Entra ID</strong> &gt; <strong>App registrations</strong> &gt; <strong>New registration</strong></li>

</ul>


</li>


<li><strong>Register the Application</strong>

<ul class="wp-block-list">

<li><strong>Name:</strong> <code>Ubuntu-Device-Auth</code></li>


<li><strong>Supported account types</strong>: Accounts in this organizational directory only</li>


<li><strong>Redirect URI:</strong> Leave blank</li>

</ul>


</li>


<li><strong>Click Register</strong></li>

</ol>



<h3 class="wp-block-heading">Step 2: Configure API Permissions</h3>



<p>Add the required Microsoft Graph permissions:</p>



<ol class="wp-block-list">

<li>Navigate to <strong>API permissions</strong> &gt; <strong>Add a permission</strong></li>


<li>Select <strong>Microsoft Graph</strong> &gt; <strong>Delegated permissions</strong></li>


<li>Add the following permissions:

<ul class="wp-block-list">

<li><code>User.Read</code>: Read user profile</li>


<li><code>offline_access</code>: Refresh tokens for offline access</li>


<li><code>openid</code>: OpenID Connect authentication</li>


<li><code>profile</code>: Read user profile information</li>

</ul>


</li>


<li>Click <strong>Grant admin consent</strong> for your organization</li>

</ol>



<h3 class="wp-block-heading">Step 3: Enable Public Client Flow</h3>



<p>Device code flow requires public client settings:</p>



<ol class="wp-block-list">

<li>Navigate to <strong>Authentication</strong></li>


<li>Under <strong>Settings</strong>, set <strong>Allow public client flows</strong> to <strong>Enabled</strong></li>


<li>Click <strong>Save</strong></li>

</ol>



<h3 class="wp-block-heading">Step 4: Record Application Details</h3>



<p>Note down these values for later configuration:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Value</th>
<th>Location</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Application (client) ID</strong></td>
<td>Overview page</td>
</tr>
<tr>
<td><strong>Directory (tenant) ID</strong></td>
<td>Overview page</td>
</tr>
</tbody>
</table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Ubuntu Configuration: Installing AuthD</h2>



<p>With Entra ID configured, you can now install and configure AuthD to enable <strong>Entra ID authentication</strong>.</p>



<h3 class="wp-block-heading">Step 1: Update System</h3>



<p>Start with a fresh system update:</p>



<pre class="wp-block-code"><code># Update package lists
sudo apt update
sudo apt upgrade -y
</code></pre>



<h3 class="wp-block-heading">Step 2: Add AuthD PPA</h3>



<p>AuthD is available from the Ubuntu Enterprise Desktop PPA:</p>



<pre class="wp-block-code"><code># Add the AuthD PPA
sudo add-apt-repository -y ppa:ubuntu-enterprise-desktop/authd

# Update package list
sudo apt update
</code></pre>



<h3 class="wp-block-heading">Step 3: Install AuthD</h3>



<p>Install AuthD with GNOME integration:</p>



<pre class="wp-block-code"><code># Install AuthD
sudo apt install -y authd
</code></pre>



<h3 class="wp-block-heading">Step 4: Install MS Entra ID Broker</h3>



<p>The broker is distributed as a Snap package:</p>



<pre class="wp-block-code"><code># Install the MS Entra ID broker
sudo snap install authd-msentraid

# Verify installation
snap list authd-msentraid
</code></pre>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d75e74&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d75e74" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><em>Figure 4: Installing AuthD and MS Entra broker on Ubuntu</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Configuring AuthD for Entra ID Authentication</h2>



<p>After installation, configure AuthD with your Azure app registration details.</p>



<h3 class="wp-block-heading">Step 1: Create Broker Configuration Directory</h3>



<pre class="wp-block-code"><code># Create broker directory (required by AuthD)
sudo mkdir -p /etc/authd/brokers.d
sudo chmod 700 /etc/authd/brokers.d

# Copy broker declaration from the snap package
sudo cp /snap/authd-msentraid/current/conf/authd/msentraid.conf /etc/authd/brokers.d/
sudo chmod 600 /etc/authd/brokers.d/msentraid.conf
</code></pre>



<h3 class="wp-block-heading">Step 2: Configure the Broker</h3>



<p>Edit the broker configuration with your Azure details:</p>



<pre class="wp-block-code"><code># Edit broker configuration
sudo nano /var/snap/authd-msentraid/current/broker.conf
</code></pre>



<p>Add or modify the following configuration:</p>



<pre class="wp-block-code"><code>[oidc]
issuer = https://login.microsoftonline.com/&lt;YOUR_TENANT_ID&gt;/v2.0
client_id = &lt;YOUR_CLIENT_ID&gt;

[users]
# Allow all authenticated users
allowed_users = ALL
# Entra ID password becomes the local Linux password
password_passthrough = true


# Or restrict to specific users:
# allowed_users = user1@yourdomain.com

# Or use OWNER mode (first user becomes owner):
# allowed_users = OWNER
</code></pre>



<p>Replace:</p>



<ul class="wp-block-list">

<li><code>&lt;YOUR_TENANT_ID&gt;</code> with your Microsoft Entra tenant ID</li>


<li><code>&lt;YOUR_CLIENT_ID&gt;</code> with your app registration client ID</li>

</ul>



<h3 class="wp-block-heading">User Access Options</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Setting</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ALL</code></td>
<td>Any authenticated Entra ID user can log in</td>
</tr>
<tr>
<td><code>OWNER</code></td>
<td>First user to authenticate becomes the owner</td>
</tr>
<tr>
<td><code>user@domain.com</code></td>
<td>Comma-separated list of allowed users</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Step 3: Configure Login Timeout</h3>



<p>The default login timeout may be too short for MFA. Increase it:</p>



<pre class="wp-block-code"><code># Edit login.defs
sudo nano /etc/login.defs

# Find LOGIN_TIMEOUT and modify (or add if not present)
LOGIN_TIMEOUT 120
</code></pre>



<h3 class="wp-block-heading">Step 4: Restart Services</h3>



<p>Apply the configuration:</p>



<pre class="wp-block-code"><code># Secure the broker configuration
sudo chmod 600 /var/snap/authd-msentraid/current/broker.conf
sudo chmod 700 /var/snap/authd-msentraid/current

# Restart AuthD service
sudo systemctl restart authd

# Restart the broker
sudo snap restart authd-msentraid

# Verify services are running
systemctl status authd
snap services authd-msentraid
</code></pre>



<h3 class="wp-block-heading">Step 5: Test Authentication</h3>



<p>Before making further changes, verify <strong>Entra ID authentication</strong> works:</p>



<ol class="wp-block-list">

<li><strong>Log out</strong> of your current session</li>


<li>Click <strong>“Microsoft Entra ID”</strong> to select it as the broker (or similar option)</li>


<li>Enter your organizational email</li>


<li>Complete the device code authentication flow:

<ul class="wp-block-list">

<li>Open <a href="https://microsoft.com/devicelogin">https://microsoft.com/devicelogin</a> on another device</li>


<li>Enter the code displayed on the Ubuntu screen</li>


<li>Complete MFA authentication</li>

</ul>


</li>


<li>You should be logged in with your Entra ID account</li>

</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d763b7&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d763b7" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/entra-id-authentication-with-authd/entra-id-authentication-with-authd-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p><em>Figure 5: The device code authentication flow</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Disabling Local Accounts for Secure Entra ID Authentication</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Warning:</strong> Only proceed after successfully testing <strong>Entra ID authentication</strong>. Ensure you have recovery access planned.</p>
</blockquote>



<h3 class="wp-block-heading">Understanding the Security Implications</h3>



<p>Disabling local account login enhances security:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Benefit</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>No local password attacks</strong></td>
<td>Eliminates brute-force risks</td>
</tr>
<tr>
<td><strong>Centralized authentication</strong></td>
<td>All authentication flows through Entra ID</td>
</tr>
<tr>
<td><strong>MFA enforcement</strong></td>
<td>Every login requires multi-factor authentication</td>
</tr>
<tr>
<td><strong>Audit trail</strong></td>
<td>All logins logged in Entra ID</td>
</tr>
</tbody>
</table></figure>



<p>However, you must plan for:</p>



<ul class="wp-block-list">

<li>Network connectivity requirements (first login requires network)</li>


<li>Recovery procedures (boot-level or break-glass access)</li>


<li>Cached credential limitations</li>

</ul>



<h3 class="wp-block-heading">Method 1: Lock Local User Accounts</h3>



<p>The safest approach preserves accounts for emergency recovery:</p>



<pre class="wp-block-code"><code># List local users (UID &gt;= 1000, excluding nobody)
awk -F: '$3 &gt;= 1000 &amp;&amp; $1 != &quot;nobody&quot; {print $1}' /etc/passwd

# Lock each local user account (example for user 'localadmin')
sudo passwd -l localadmin

# Remove from sudo group if not needed
sudo deluser localadmin sudo
</code></pre>



<p>To unlock in emergency:</p>



<pre class="wp-block-code"><code>sudo passwd -u localadmin
</code></pre>



<h3 class="wp-block-heading">Method 2: PAM Configuration for AuthD Priority</h3>



<p>Configure PAM to prioritize AuthD:</p>



<pre class="wp-block-code"><code># Backup existing PAM configuration
sudo cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup

# Edit PAM configuration
sudo nano /etc/pam.d/common-auth
</code></pre>



<p>Modify to prioritize AuthD:</p>



<pre class="wp-block-code"><code># AuthD authentication (primary)
auth    [success=2 default=ignore]    pam_authd.so

# Local authentication (fallback - comment out to disable)
# auth   [success=1 default=ignore]    pam_unix.so nullok_secure

# Deny if all methods fail
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
</code></pre>



<h3 class="wp-block-heading">Method 3: Hide Local Users from GDM</h3>



<p>Hide local users from the login screen:</p>



<pre class="wp-block-code"><code># Create/edit GDM configuration
sudo nano /etc/gdm3/greeter.dconf-defaults

# Add the following
[org/gnome/login-screen]
disable-user-list=true
</code></pre>



<p>Apply changes:</p>



<pre class="wp-block-code"><code>sudo dpkg-reconfigure gdm3
</code></pre>



<h3 class="wp-block-heading">Recovery Access Setup</h3>



<p>Always maintain emergency access:</p>



<ol class="wp-block-list">

<li><strong>Recovery Mode Access</strong>

<ul class="wp-block-list">

<li>To access single-user mode:

<ul class="wp-block-list">

<li>Reboot and hold SHIFT to access GRUB</li>


<li>Edit boot entry, add ‘single’ to kernel parameters</li>


<li>Boot into single-user mode (requires disk encryption password)</li>

</ul>


</li>

</ul>


</li>


<li><strong>Break-Glass Admin Account</strong>

<ul class="wp-block-list">

<li>Create a dedicated admin account in Entra ID</li>


<li>Add to <code>allowed_users</code> in broker configuration</li>


<li>Store credentials securely (password manager)</li>


<li>Document when and how to use</li>

</ul>


</li>


<li><strong>Create Recovery Script</strong></li>

</ol>



<pre class="wp-block-code"><code>sudo tee /root/emergency-recovery.sh &gt; /dev/null &lt;&lt; 'EOF'
#!/bin/bash
# Emergency recovery script - Run from recovery mode
mount -o remount,rw /
passwd -u localadmin
cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth
echo &quot;Recovery complete. Reboot normally.&quot;
EOF
sudo chmod 700 /root/emergency-recovery.sh
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Automation Script for Entra ID Authentication</h2>



<p>For consistent deployments, use this automation script for <strong>Entra ID authentication</strong>:</p>



<pre class="wp-block-code"><code>#!/bin/bash
#===============================================================================
# Script Name: setup-authd.sh
# Description: Automated setup of AuthD on Ubuntu 24.04 LTS
# Author: Enterprise IT
# Version: 1.0
#===============================================================================

set -e  # Exit on error

# Configuration Variables - MODIFY THESE
TENANT_ID=&quot;YOUR_TENANT_ID_HERE&quot;
CLIENT_ID=&quot;YOUR_CLIENT_ID_HERE&quot;
ALLOWED_USERS=&quot;ALL&quot;  # Options: ALL, OWNER, or comma-separated emails
DISABLE_LOCAL_LOGIN=&quot;false&quot;  # Set to &quot;true&quot; to disable local login

# Logging
LOG_FILE=&quot;/var/log/authd-setup.log&quot;
exec 1&gt; &gt;(tee -a &quot;$LOG_FILE&quot;) 2&gt;&amp;1

log() {
    echo &quot;[$(date '+%Y-%m-%d %H:%M:%S')] $1&quot;
}

error() {
    echo &quot;[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1&quot; &gt;&amp;2
    exit 1
}

# Check if running as root
if [[ $EUID -ne 0 ]]; then
    error &quot;This script must be run as root (use sudo)&quot;
fi

# Validate configuration
if [[ &quot;$TENANT_ID&quot; == &quot;YOUR_TENANT_ID_HERE&quot; ]]; then
    error &quot;Please set TENANT_ID before running this script&quot;
fi

if [[ &quot;$CLIENT_ID&quot; == &quot;YOUR_CLIENT_ID_HERE&quot; ]]; then
    error &quot;Please set CLIENT_ID before running this script&quot;
fi

# Check Ubuntu version
if ! grep -q &quot;24.04&quot; /etc/lsb-release; then
    error &quot;This script is designed for Ubuntu 24.04 LTS&quot;
fi

log &quot;Starting AuthD setup...&quot;

#===============================================================================
# PHASE 1: Install AuthD
#===============================================================================

log &quot;Phase 1: Installing AuthD...&quot;

apt update

# Add AuthD PPA
if ! grep -q &quot;ubuntu-enterprise-desktop/authd&quot; /etc/apt/sources.list.d/*.list 2&gt;/dev/null; then
    add-apt-repository -y ppa:ubuntu-enterprise-desktop/authd
    log &quot;AuthD PPA added&quot;
fi

apt update
apt install -y authd

log &quot;AuthD installed&quot;

#===============================================================================
# PHASE 2: Install MS Entra ID Broker
#===============================================================================

log &quot;Phase 2: Installing MS Entra ID broker...&quot;

snap install authd-msentraid

log &quot;MS Entra ID broker installed&quot;

#===============================================================================
# PHASE 3: Configure Broker
#===============================================================================

log &quot;Phase 3: Configuring broker...&quot;

# Create broker configuration directory
mkdir -p /etc/authd/brokers.d/

# Copy broker declaration
cp /snap/authd-msentraid/current/conf/authd/msentraid.conf /etc/authd/brokers.d/

# Configure broker
cat &gt; /var/snap/authd-msentraid/current/broker.conf &lt;&lt; EOF
[oidc]
issuer = https://login.microsoftonline.com/${TENANT_ID}/v2.0
client_id = ${CLIENT_ID}

[users]
allowed_users = ${ALLOWED_USERS}
password_passthrough = true
EOF

log &quot;Broker configured&quot;

#===============================================================================
# PHASE 4: Configure Login Timeout
#===============================================================================

log &quot;Phase 4: Configuring login timeout...&quot;

if grep -q &quot;^LOGIN_TIMEOUT&quot; /etc/login.defs; then
    sed -i 's/^LOGIN_TIMEOUT.*/LOGIN_TIMEOUT 120/' /etc/login.defs
else
    echo &quot;LOGIN_TIMEOUT 120&quot; &gt;&gt; /etc/login.defs
fi

log &quot;Login timeout configured&quot;

#===============================================================================
# PHASE 5: Disable Local Login (Optional)
#===============================================================================

if [ &quot;$DISABLE_LOCAL_LOGIN&quot; = &quot;true&quot; ]; then
    log &quot;Phase 5: Disabling local login...&quot;

    # Backup PAM configuration
    cp /etc/pam.d/common-auth /etc/pam.d/common-auth.backup.$(date +%Y%m%d)

    # Hide user list in GDM
    mkdir -p /etc/gdm3
    cat &gt;&gt; /etc/gdm3/greeter.dconf-defaults &lt;&lt; 'EOF'

[org/gnome/login-screen]
disable-user-list=true
EOF

    # Lock local accounts
    for user in $(awk -F: '$3 &gt;= 1000 &amp;&amp; $1 != &quot;nobody&quot; {print $1}' /etc/passwd); do
        passwd -l &quot;$user&quot; 2&gt;/dev/null || true
        log &quot;Locked local user: $user&quot;
    done

    log &quot;Local login disabled&quot;
else
    log &quot;Phase 5: Skipping local login disable (set DISABLE_LOCAL_LOGIN=true to enable)&quot;
fi

#===============================================================================
# PHASE 6: Restart Services
#===============================================================================

log &quot;Phase 6: Restarting services...&quot;

systemctl restart authd
snap restart authd-msentraid

log &quot;Services restarted&quot;

#===============================================================================
# COMPLETION
#===============================================================================

log &quot;==============================================&quot;
log &quot;Setup completed successfully!&quot;
log &quot;==============================================&quot;
log &quot;&quot;
log &quot;Next steps:&quot;
log &quot;1. Reboot the system&quot;
log &quot;2. Log out and test Entra ID authentication at GDM&quot;
log &quot;&quot;
log &quot;Configuration details:&quot;
log &quot;  - Tenant ID: ${TENANT_ID}&quot;
log &quot;  - Client ID: ${CLIENT_ID}&quot;
log &quot;  - Allowed Users: ${ALLOWED_USERS}&quot;
log &quot;  - Local Login Disabled: ${DISABLE_LOCAL_LOGIN}&quot;
log &quot;&quot;
log &quot;Log file: ${LOG_FILE}&quot;

echo &quot;&quot;
echo &quot;Reboot now? (y/n)&quot;
read -r response
if [[ &quot;$response&quot; =~ ^[Yy]$ ]]; then
    reboot
fi
</code></pre>



<h3 class="wp-block-heading">Using the Automation Script</h3>



<ol class="wp-block-list">

<li><strong>Save the script</strong> as <code>setup-authd.sh</code></li>


<li><strong>Edit configuration variables</strong>:

<ul class="wp-block-list">

<li>TENANT_ID=”your-tenant-id”</li>


<li>CLIENT_ID=”your-client-id”</li>


<li>ALLOWED_USERS=”ALL”</li>


<li>DISABLE_LOCAL_LOGIN=”false”</li>

</ul>


</li>


<li><strong>Run the script</strong>:

<ul class="wp-block-list">

<li><code>chmod +x setup-authd.sh &amp;&amp; sudo ./setup-authd.sh</code></li>

</ul>


</li>


<li><strong>Complete post-script steps</strong>:

<ul class="wp-block-list">

<li>Reboot the system</li>


<li>Test Entra ID authentication</li>


<li>If successful, re-run with:

<ul class="wp-block-list">

<li><code>DISABLE_LOCAL_LOGIN="true"</code></li>

</ul>


</li>

</ul>


</li>

</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Troubleshooting Entra ID Authentication Issues</h2>



<p>When implementing <strong>Entra ID authentication</strong>, you may encounter various issues.</p>



<h3 class="wp-block-heading">AuthD Authentication Failures</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Issue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>No Entra ID option at GDM</td>
<td>Broker not configured</td>
<td>Check <code>/etc/authd/brokers.d/msentraid.conf</code> exists</td>
</tr>
<tr>
<td>“Authentication failed”</td>
<td>Wrong client ID</td>
<td>Verify client ID in broker.conf</td>
</tr>
<tr>
<td>Device code timeout</td>
<td>LOGIN_TIMEOUT too short</td>
<td>Increase in <code>/etc/login.defs</code></td>
</tr>
<tr>
<td>User not allowed</td>
<td>allowed_users restriction</td>
<td>Update broker.conf allowed_users</td>
</tr>
<tr>
<td>“Invalid issuer”</td>
<td>Wrong tenant ID</td>
<td>Verify tenant ID in broker.conf</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Login Issues After Configuration</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Issue</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>Can’t log in at all</td>
<td>PAM misconfigured</td>
<td>Boot to recovery mode, restore PAM backup</td>
</tr>
<tr>
<td>Slow login</td>
<td>Network latency</td>
<td>Check DNS, consider cached credentials</td>
</tr>
<tr>
<td>MFA not working</td>
<td>Device code flow issue</td>
<td>Verify app registration settings</td>
</tr>
<tr>
<td>Home directory not created</td>
<td>NSS issue</td>
<td>Check <code>/etc/nsswitch.conf</code> includes authd</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Useful Troubleshooting Commands</h3>



<pre class="wp-block-code"><code># Check AuthD service status
systemctl status authd

# View AuthD logs
journalctl -u authd -f

# Check broker logs
snap logs authd-msentraid

# View broker configuration
cat /var/snap/authd-msentraid/current/broker.conf

# Test authentication manually
authd-cli authenticate
</code></pre>



<h3 class="wp-block-heading">Recovery Commands</h3>



<p>If locked out, boot to recovery mode:</p>



<pre class="wp-block-code"><code># Mount filesystem read-write
mount -o remount,rw /

# Restore PAM configuration
cp /etc/pam.d/common-auth.backup /etc/pam.d/common-auth

# Unlock local user
passwd -u localadmin

# Restart services
systemctl restart authd
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Best Practices for Entra ID Authentication</h2>



<p>To ensure your <strong>Entra ID authentication</strong> deployment is secure and reliable, follow these best practices.</p>



<h3 class="wp-block-heading">Security Hardening</h3>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Practice</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Enable disk encryption</strong></td>
<td>Use LUKS during Ubuntu installation</td>
</tr>
<tr>
<td><strong>Configure automatic updates</strong></td>
<td>Enable unattended-upgrades for security patches</td>
</tr>
<tr>
<td><strong>Monitor login attempts</strong></td>
<td>Review Entra ID sign-in logs regularly</td>
</tr>
<tr>
<td><strong>Restrict allowed users</strong></td>
<td>Only allow users who need Linux access</td>
</tr>
<tr>
<td><strong>Document recovery procedures</strong></td>
<td>Test recovery quarterly</td>
</tr>
</tbody>
</table></figure>



<h3 class="wp-block-heading">Operational Best Practices</h3>



<ol class="wp-block-list">

<li><strong>Document Recovery Procedures</strong>

<ul class="wp-block-list">

<li>Create step-by-step recovery documentation</li>


<li>Store recovery keys securely (not on the device)</li>


<li>Test recovery procedures quarterly</li>

</ul>


</li>


<li><strong>Plan for Offline Scenarios</strong>

<ul class="wp-block-list">

<li>AuthD caches credentials for offline login</li>


<li>First login always requires network</li>


<li>Document offline limitations for users</li>

</ul>


</li>


<li><strong>User Communication</strong>

<ul class="wp-block-list">

<li>Provide training on device code authentication</li>


<li>Create FAQ for common issues</li>


<li>Establish support channels</li>

</ul>


</li>


<li><strong>Staged Rollout</strong>

<ul class="wp-block-list">

<li>Pilot with IT team first</li>


<li>Expand to early adopters</li>


<li>Full deployment after validation</li>

</ul>


</li>

</ol>



<h3 class="wp-block-heading">Monitoring Commands</h3>



<pre class="wp-block-code"><code># Check AuthD service status
systemctl status authd

# View AuthD logs
journalctl -u authd -f

# Check broker logs
snap logs authd-msentraid

# List logged-in users
who
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusion: Embracing Entra ID Authentication</h2>



<p>Implementing <strong>Entra ID authentication</strong> with AuthD transforms Ubuntu workstations into cloud-native enterprise systems. As a result, organizations achieve:</p>



<ul class="wp-block-list">

<li><strong>Eliminate password sprawl</strong> with single sign-on</li>


<li><strong>Enhance security</strong> through MFA enforcement</li>


<li><strong>Simplify management</strong> with centralized identity</li>


<li><strong>Reduce attack surface</strong> by eliminating local accounts</li>


<li><strong>Enable unified identity</strong> across all platforms</li>

</ul>



<p>This <strong>Entra ID authentication</strong> solution represents the future of enterprise Linux management. With AuthD now <a href="https://discourse.ubuntu.com/t/authd-enters-the-ubuntu-archive-in-26-04-lts/78193">included in the Ubuntu 26.04 LTS archive</a>, expect even deeper integration and additional identity provider support, including a generic OIDC broker for standards-compliant providers.</p>



<p><strong>Ready to implement Entra ID authentication?</strong> Begin with a single test workstation, validate the authentication flow, then scale your deployment with confidence.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Additional Resources</h2>



<h3 class="wp-block-heading">External Documentation</h3>



<ul class="wp-block-list">

<li><a href="https://documentation.ubuntu.com/authd/stable-docs/">AuthD Official Documentation</a></li>


<li><a href="https://github.com/canonical/authd">AuthD GitHub Repository</a></li>


<li><a href="https://learn.microsoft.com/en-us/entra/">Microsoft Entra ID Documentation</a></li>

</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><em>Have questions about implementing </em><em>Entra ID authentication</em><em>? Share your experience in the comments below or reach out for assistance!</em></p>
<p>The post <a href="https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/">Entra ID Authentication with AuthD on Ubuntu 24.04 LTS</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2026/02/01/entra-id-authentication-with-authd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EPM Approval Workflow: Adaptive Cards and Logic Apps</title>
		<link>https://jensdufour.be/2026/01/01/epm-approval-workflow-adaptive-cards-logic-apps/</link>
					<comments>https://jensdufour.be/2026/01/01/epm-approval-workflow-adaptive-cards-logic-apps/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Wed, 31 Dec 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Adaptive Cards]]></category>
		<category><![CDATA[EPM]]></category>
		<category><![CDATA[Intune Suite]]></category>
		<category><![CDATA[Logic Apps]]></category>
		<category><![CDATA[Teams]]></category>
		<guid isPermaLink="false">https://jensdufour.be/?p=779</guid>

					<description><![CDATA[<p>Automate EPM approval in Microsoft Teams with Adaptive Cards and Azure Logic Apps. Approve or deny elevation requests without leaving Teams.</p>
<p>The post <a href="https://jensdufour.be/2026/01/01/epm-approval-workflow-adaptive-cards-logic-apps/">EPM Approval Workflow: Adaptive Cards and Logic Apps</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Introduction</h2>



<p><strong>EPM automation with Adaptive Cards</strong> transforms how IT teams handle elevation requests in <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/what-is-intune">Microsoft Intune</a>. By combining <a href="https://learn.microsoft.com/en-us/azure/logic-apps/">Azure Logic Apps</a> with Teams <a href="https://learn.microsoft.com/en-us/adaptive-cards/">Adaptive Cards</a>, you can automate the entire <a href="https://learn.microsoft.com/en-us/intune/intune-service/protect/epm-overview">Endpoint Privilege Management</a> (EPM) approval workflow, allowing approvers to act on requests without leaving Microsoft Teams. This EPM automation solution eliminates the need to constantly monitor the Intune portal.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81003&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81003" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="EPM automation Adaptive Cards showing an approved elevation request in Microsoft Teams." src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">What Is Endpoint Privilege Management?</h2>



<p><strong>Endpoint Privilege Management (EPM)</strong> is a feature in the <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/intune-add-ons">Microsoft Intune Suite</a> that allows organizations to manage and control local administrator rights on Windows devices &#8212; without granting permanent admin access. It enables rule-based and Just-In-Time (JIT) elevation, ensuring users can perform privileged tasks only when necessary, and only under defined conditions.</p>



<h3 class="wp-block-heading">Rules-Based Elevation: Three Options</h3>



<p>EPM supports three types of elevation rules:</p>



<ol class="wp-block-list">

<li><strong>Automatic Elevation</strong> &#8212; The application is elevated silently without user interaction, based on predefined rules.</li>


<li><strong>User-Confirmed Elevation</strong> &#8212; The user is prompted to confirm the elevation request, typically with a business justification and/or Windows authentication.</li>


<li><strong>Support-Approved Elevation</strong> &#8212; The user submits a request that must be approved by IT or support staff before elevation is granted. This is the model we focus on in this post, as it allows integration with Microsoft Teams for real-time approvals.</li>

</ol>



<h3 class="wp-block-heading">Just-In-Time Elevation with Support Approval</h3>



<p>Support-approved elevation is ideal for organizations that want to maintain strict control over admin rights while still enabling flexibility for end users. When a user requests elevation, the request is logged and routed for approval. By integrating this process with Microsoft Teams using Azure Logic Apps, IT teams can receive instant notifications and respond quickly &#8212; without switching tools or missing critical requests.</p>



<p>Currently, when approved, these requests remain valid for 24 hours.</p>



<h3 class="wp-block-heading">Benefits of Using EPM</h3>



<p>Implementing Endpoint Privilege Management offers several key advantages:</p>



<ul class="wp-block-list">

<li><strong>User Empowerment</strong>: Allows users to perform necessary tasks without waiting for manual intervention &#8212; when policies allow it.</li>


<li><strong>Improved Security</strong>: Reduces the attack surface by eliminating standing admin rights.</li>


<li><strong>Operational Efficiency</strong>: Automates elevation workflows and reduces helpdesk overhead.</li>


<li><strong>Compliance and Auditing</strong>: Provides detailed logs of elevation activity for auditing and compliance reporting.</li>

</ul>



<h2 class="wp-block-heading">The Challenge with Manual EPM Approvals</h2>



<p>When EPM is configured in Microsoft Intune, end users can request elevation to run applications requiring administrator privileges. However, the traditional approval workflow requires IT administrators to:</p>



<ol class="wp-block-list">

<li>Navigate to the Intune portal</li>


<li>Find the pending elevation request</li>


<li>Review the request details</li>


<li>Approve or deny the request</li>

</ol>



<p>This process, while secure, creates friction, especially when approvers are busy with other tasks or aren&#8217;t actively monitoring the Intune console.</p>



<p>The result?</p>



<p>Delayed approvals and frustrated users waiting for elevated access.</p>



<h2 class="wp-block-heading">Configuring EPM in Microsoft Intune</h2>



<p>Before setting up the automation, you need an EPM elevation rules policy. In this example we enable the &#8220;Mark 8 Project Team&#8221; to request elevation for Wireshark. I am assuming here that EPM was already enabled in your tenant.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">

<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81519&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81519" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d8163b&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d8163b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81743&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81743" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81851&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81851" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-06.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81955&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81955" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-07.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>

</figure>



<p>Start in <a href="https://intune.microsoft.com/">Microsoft Intune</a> and navigate to the <strong>Endpoint security</strong> blade. Under <strong>Endpoint Privilege Management</strong> go to <strong>Policies</strong> and create a new <strong>Elevation rules policy</strong>.</p>



<p>After going through the basics, fill in the detailed information about the application you are adding to the rule. This information can be collected using the <code>EpmTools.dll</code>.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">

<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81b5d&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81b5d" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-08.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81c6b&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81c6b" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-09.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>

</figure>



<p>Using this tool you can even extract publisher certificates from the file. These can be added to the reusable library.</p>



<p>Finally, fill in all the necessary details about the file.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">

<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81e4c&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81e4c" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-10.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d81f5c&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d81f5c" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-11.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82062&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82062" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-12.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>

</figure>



<p>Verify the configuration from a demo device. From the end-user perspective the <strong>Run with elevated access</strong> option should be visible, and the elevation request dialog should open.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">

<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82225&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82225" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-13.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82337&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82337" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-14.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d8243e&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d8243e" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-15.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82543&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82543" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-16.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>

</figure>



<p>For the Intune administrator, the request should appear in the <strong>Elevation requests</strong> tab almost immediately.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d826fb&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d826fb" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-17.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading">Verifying the Graph API Data</h3>



<p>Before building the Logic App, confirm that elevation requests are visible through the <a href="https://learn.microsoft.com/en-us/graph/use-the-api">Microsoft Graph API</a>. Open the <a href="https://developer.microsoft.com/en-us/graph/graph-explorer">Graph Explorer</a> and query <code>deviceManagement/elevationRequests</code>.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82898&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82898" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-18.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Make sure you are using the <strong>beta</strong> version of the API and that the <code>DeviceManagementConfiguration.Read.All</code> permission has been granted. Otherwise, the query returns a permission error.</p>



<h2 class="wp-block-heading">How EPM Automation with Adaptive Cards Works</h2>



<p>Our EPM automation solution bridges Microsoft Intune and Microsoft Teams by creating an automated workflow that:</p>



<ul class="wp-block-list">

<li><strong>Polls for pending requests</strong> every 5 minutes using Microsoft Graph API</li>


<li><strong>Posts Adaptive Cards</strong> to a designated Teams channel with all request details</li>


<li><strong>Enables one-click approval or denial</strong> directly from Teams</li>


<li><strong>Updates the Adaptive Card</strong> to show the final decision and who made it</li>

</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d82a97&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d82a97" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="EPM automation Adaptive Cards displaying a denied elevation request with reviewer details" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/epm-approval-workflow-adaptive-cards-logic-apps/epm-approval-workflow-adaptive-cards-logic-apps-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h3 class="wp-block-heading">Architecture for EPM Automation</h3>



<pre class="wp-block-code"><code>1. Logic App (Recurrence Trigger - every 5 minutes)
        │
        ├──&gt; GET Microsoft Graph API
        │    /deviceManagement/elevationRequests
        │
        ├──&gt; Filter requests with status = &quot;pending&quot;
        │
        ├──&gt; For each pending request:
        │    └──&gt; Post Adaptive Card to Teams channel
        │         ├──&gt; Approve button
        │         └──&gt; Deny button
        │
        └──&gt; When button clicked:
             └──&gt; POST approval/denial via Graph API
             └──&gt; Update Adaptive Card with decision
</code></pre>



<h2 class="wp-block-heading">Key Components of the EPM Automation Solution</h2>



<h3 class="wp-block-heading">Azure Logic App for EPM Automation</h3>



<p>The Logic App serves as the orchestration engine for EPM automation. Using a recurrence trigger, it periodically queries the Microsoft Graph API for pending EPM elevation requests and processes each one by posting an interactive Adaptive Card to Teams.</p>



<h3 class="wp-block-heading">Adaptive Cards for Approval Actions</h3>



<p>The Adaptive Cards display comprehensive request information:</p>



<ul class="wp-block-list">

<li><strong>Requester</strong> – Who’s requesting elevation</li>


<li><strong>Device Name</strong> – Which device the request originates from</li>


<li><strong>Application</strong> – The executable requesting elevation</li>


<li><strong>File Path</strong> – Where the application is located</li>


<li><strong>Publisher</strong> – The application’s publisher</li>


<li><strong>Justification</strong> – Why the user needs elevation</li>

</ul>



<p>The card includes two action buttons: <strong>Approve</strong> (green) and <strong>Deny</strong> (red). Once clicked, the Adaptive Card updates to reflect the decision.</p>



<h3 class="wp-block-heading">Managed Identity for Secure EPM Automation</h3>



<p>Security is paramount. Instead of storing credentials or secrets, the EPM automation solution uses an <strong>Azure Managed Identity</strong> to authenticate to Microsoft Graph API. This eliminates secret management overhead and follows security best practices.</p>



<h3 class="wp-block-heading">Microsoft Graph API Integration</h3>



<p>The solution leverages the Graph API beta endpoint for EPM operations:</p>



<ul class="wp-block-list">

<li><code>GET /deviceManagement/elevationRequests</code> – Retrieve pending requests</li>


<li><code>POST /deviceManagement/elevationRequests/{id}/approve</code> – Approve a request</li>


<li><code>POST /deviceManagement/elevationRequests/{id}/deny</code> – Deny a request</li>

</ul>



<h2 class="wp-block-heading">Infrastructure as Code with Bicep</h2>



<p>The entire EPM automation solution is defined using <strong>Azure Bicep</strong>, making it reproducible and version-controllable. Here’s a simplified look at the main resources:</p>



<pre class="wp-block-code"><code>// Managed Identity for secure Graph API access
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: '${logicAppName}-identity'
  location: location
  tags: tags
}

// Teams API Connection
resource teamsConnection 'Microsoft.Web/connections@2016-06-01' = {
  name: 'teams-connection'
  location: location
  properties: {
    displayName: 'Teams Connection for EPM Approval'
    api: {
      id: subscriptionResourceId('Microsoft.Web/locations/managedApis', location, 'teams')
    }
  }
}

// Logic App with workflow definition
resource logicApp 'Microsoft.Logic/workflows@2019-05-01' = {
  name: logicAppName
  location: location
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${managedIdentity.id}': {}
    }
  }
  properties: {
    definition: loadJsonContent('workflow.json').definition
    // ... parameters
  }
}
</code></pre>



<h2 class="wp-block-heading">Deploying Your EPM Automation with Adaptive Cards</h2>



<p>A PowerShell deployment script automates the entire setup process:</p>



<pre class="wp-block-code"><code># Deploy with default settings
.\deploy.ps1

# Or customize the deployment
.\deploy.ps1 -ResourceGroupName &quot;rg-epm-approval&quot; -Location &quot;westeurope&quot;

# Preview changes first
.\deploy.ps1 -WhatIf
</code></pre>



<p>The script handles:</p>



<ul class="wp-block-list">

<li>Prerequisites validation (Azure CLI, Bicep, login status)</li>


<li>Resource group creation</li>


<li>Bicep template deployment</li>


<li>Graph API permission assignment via Microsoft Graph PowerShell</li>


<li>Teams connection authorization prompt</li>

</ul>



<h3 class="wp-block-heading">Required Graph API Permissions</h3>



<p>The Managed Identity needs the following application permissions:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Permission</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DeviceManagementConfiguration.ReadWrite.All</code></td>
<td>Read and update EPM elevation requests</td>
</tr>
<tr>
<td><code>DeviceManagementManagedDevices.Read.All</code></td>
<td>Read device information</td>
</tr>
</tbody>
</table></figure>



<h2 class="wp-block-heading">Cost of EPM Automation</h2>



<p>One of the best aspects of this EPM automation solution is its cost-effectiveness:</p>



<figure class="wp-block-table"><table>
<thead>
<tr>
<th>Resource</th>
<th>Estimated Monthly Cost</th>
</tr>
</thead>
<tbody>
<tr>
<td>Logic App (Consumption)</td>
<td>~$0.50</td>
</tr>
<tr>
<td>Managed Identity</td>
<td>Free</td>
</tr>
<tr>
<td>Teams API Connection</td>
<td>Free</td>
</tr>
<tr>
<td>Log Analytics (optional)</td>
<td>~$2-5</td>
</tr>
</tbody>
</table></figure>



<p><strong>Total: ~$2-6/month</strong> depending on the number of requests processed.</p>



<h2 class="wp-block-heading">Security Best Practices</h2>



<p>The EPM automation solution follows security best practices:</p>



<ul class="wp-block-list">

<li><strong>No secrets stored</strong> – Managed Identity handles authentication</li>


<li><strong>Least privilege</strong> – Only required Graph permissions are assigned</li>


<li><strong>Audit trail</strong> – All decisions are logged in both Intune and Logic App run history</li>


<li><strong>Secure outputs</strong> – Sensitive data is protected in Logic App runs</li>

</ul>



<h2 class="wp-block-heading">Extending the EPM Automation Solution</h2>



<p>The modular design allows for easy extensions:</p>



<ul class="wp-block-list">

<li><strong>Email notifications</strong> – Add email alerts for high-priority requests</li>


<li><strong>ServiceNow integration</strong> – Create tickets for tracking purposes</li>


<li><strong>Conditional logic</strong> – Auto-approve requests from specific applications</li>


<li><strong>Escalation workflows</strong> – Escalate unanswered requests after a timeout</li>

</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p><strong>EPM automation with Adaptive Cards</strong> transforms the approval experience from a portal-centric task into a seamless Teams-based workflow. Approvers can now handle elevation requests without context-switching, leading to faster response times and improved user satisfaction.</p>



<p>The solution is cost-effective (under $10/month), secure (no secrets, managed identity), and easy to deploy (Infrastructure as Code with automated deployment scripts).</p>



<p>Ready to implement EPM automation with Adaptive Cards in your environment? Check out the full source code and detailed deployment instructions on <a href="https://github.com/jensdufour/PUB-EPM-Teams-Integration">GitHub</a>!</p>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">

<li><a href="https://learn.microsoft.com/en-us/intune/intune-service/protect/epm-overview">Endpoint Privilege Management overview | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/azure/logic-apps/">Azure Logic Apps documentation | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/adaptive-cards/">Adaptive Cards documentation | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/connectors/teams/?tabs=text1%2Cdotnet">Microsoft Teams Connectors | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/graph/use-the-api">Microsoft Graph API | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview">Azure Managed Identities | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/">Azure Bicep documentation | Microsoft Learn</a></li>

</ul>
<p>The post <a href="https://jensdufour.be/2026/01/01/epm-approval-workflow-adaptive-cards-logic-apps/">EPM Approval Workflow: Adaptive Cards and Logic Apps</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2026/01/01/epm-approval-workflow-adaptive-cards-logic-apps/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Windows 365 Restore Points: A Guide to Long-Term Storage</title>
		<link>https://jensdufour.be/2025/12/01/windows-365-restore-points-a-guide-to-long-term-storage/</link>
					<comments>https://jensdufour.be/2025/12/01/windows-365-restore-points-a-guide-to-long-term-storage/#respond</comments>
		
		<dc:creator><![CDATA[Jens Du Four]]></dc:creator>
		<pubDate>Sun, 30 Nov 2025 23:00:00 +0000</pubDate>
				<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Cloud PC]]></category>
		<category><![CDATA[Intune]]></category>
		<category><![CDATA[Windows 365]]></category>
		<guid isPermaLink="false">http://192.168.0.43/?p=619</guid>

					<description><![CDATA[<p>Configure Windows 365 restore points and store them long-term with Azure Storage Accounts. A complete guide for Cloud PC backup management.</p>
<p>The post <a href="https://jensdufour.be/2025/12/01/windows-365-restore-points-a-guide-to-long-term-storage/">Windows 365 Restore Points: A Guide to Long-Term Storage</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://learn.microsoft.com/en-us/windows-365/overview">Windows 365</a> is a service that provides a Windows Cloud experience, allowing users to access a Windows desktop from anywhere. One of the key features of Windows 365 is the ability to create restore points, which are snapshots of the system at a specific point in time. Let’s take a look at what those mean!</p>



<h2 class="wp-block-heading">Overview of Windows 365 Restore Points</h2>



<p>Using restore points in Windows 365 offers several advantages. Firstly, they provide a safety net for system recovery, ensuring that users can quickly restore their system to a working state in case of any issues.</p>



<p>Secondly, restore points help protect data by preserving user settings and installed applications. This means that even if a system crash occurs, users can recover their data without losing important information.</p>



<p>Additionally, restore points can be used to test new software or updates, allowing users to revert to a previous state if the changes cause problems.</p>



<h2 class="wp-block-heading">How to adapt the automatic Windows 365 Restore Points in Microsoft Intune</h2>



<p>By default <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/what-is-intune">Microsoft Intune</a> will create several restore points for each and every Cloud PC.</p>



<p>The amount of restore points will never change and is two bi-weekly restore points and ten restore points you can adapt the recurrence of, this is done through a “User Setting”:</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84566&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84566" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-01.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>Once you are here, you can adapt the recurrence.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d846b3&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d846b3" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-02.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<h2 class="wp-block-heading">What about Storage Accounts?</h2>



<p>Storage accounts play a crucial role in managing restore points for Windows 365. These provide a secure solution for storing large amounts of data, including your restore points.</p>



<p>By utilizing storage accounts, users can ensure that their restore points are safely stored and easily accessible when needed. One of the key benefits of using storage accounts is the ability to manage data efficiently, with options for redundancy and backup to protect against data loss.</p>



<p>Additionally, storage accounts offer flexibility, allowing users to configure permissions and access controls to suit their needs. To use storage accounts for restore points, users can integrate their Windows 365 environment with Azure, setting up containers and blobs to store the restore points securely.</p>



<p>This integration ensures that restore points are preserved long-term and can be retrieved quickly in case of system recovery needs.</p>



<h3 class="wp-block-heading">Creating the right Azure Storage Account</h3>



<p>There a few requirements to be met when creating a Storage Account for the Restore Points of the Cloud PC. They are listed below and we will go over the steps needed in Azure after these.</p>



<ul class="wp-block-list">

<li><strong>Instance details</strong>

<ul class="wp-block-list">

<li><strong>Region</strong>: Same region as Cloud PC is recommended because of performance. There is no restriction on which region you should choose.</li>


<li><strong>Performance</strong>: <strong>Premium</strong> (supports hot access tier) or <strong>Standard</strong> (supports all <a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-overview">access tiers</a>).</li>


<li><strong>Premium account type</strong>: <strong>Page blobs</strong></li>

</ul>


</li>


<li><strong>Security</strong>

<ul class="wp-block-list">

<li>Minimum TLS version: <strong>Version 1.2</strong>.</li>


<li>Confirm <strong>Allow blob anonymous access</strong> is disabled (the default).</li>


<li>Disable <strong>Enable storage account key access</strong>.</li>

</ul>


</li>


<li><strong>Networking</strong>

<ul class="wp-block-list">

<li><strong>Network access</strong>: <strong>Enable public access from all networks</strong></li>

</ul>


</li>

</ul>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">

<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84a06&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84a06" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-03.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84b1a&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84b1a" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-04.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84c20&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84c20" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-05.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84d26&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84d26" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-06.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84e31&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84e31" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-07.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d84f34&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d84f34" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-08.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d85037&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d85037" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-09.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d8513a&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d8513a" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-10.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>


<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d85245&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d85245" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-11.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>

</figure>



<h2 class="wp-block-heading">Creating a manual Restore Point in Microsoft Intune</h2>



<p>Once the Storage Account has been set up, you have the option to create a manual restore point in Microsoft Intune.</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69e5747d8542f&quot;}" data-wp-interactive="core/image" data-wp-key="69e5747d8542f" class="wp-block-image wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" alt="" src="https://raw.githubusercontent.com/jensdufour/blog/main/media/windows-365-restore-points-a-guide-to-long-term-storage/windows-365-restore-points-a-guide-to-long-term-storage-12.webp"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="Enlarge"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p>If this option is not visible, verify the requirements above as the Storage Account will not be visible if it does not meet these.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>In summary, Windows 365 restore points are an essential feature. They provide a reliable way to recover from system issues, preserve user settings, and test new software or updates.</p>



<p>By creating and managing restore points effectively, users can safeguard their systems and minimize downtime.</p>



<p>Additionally, utilizing <a href="https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview">Azure Storage Accounts</a> for long-term storage of restore points offers a scalable and secure solution for preserving these critical backups. I encourage everyone to take advantage of them in Windows 365 to enhance system management and data protection strategies.</p>



<p>If you want to further enhance your Windows 365 environment, check out <a href="https://jensdufour.be/2026/03/11/enabling-ai-frontier-capabilities-on-windows-365-with-intune/">Enabling AI Frontier Capabilities on Windows 365 with Intune</a> or learn how to automate language packs in <a href="https://jensdufour.be/2023/04/01/adding-languages-using-proactive-remediations/">Adding Language Packs Using Proactive Remediations</a>.</p>



<h2 class="wp-block-heading">Sources</h2>



<ul class="wp-block-list">

<li><a href="https://learn.microsoft.com/en-us/windows-365/">Windows 365 documentation | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/restore-overview">Cloud PC restore points | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/azure/storage/common/storage-account-overview">Azure Storage Accounts | Microsoft Learn</a></li>


<li><a href="https://learn.microsoft.com/en-us/azure/storage/blobs/access-tiers-overview">Access tiers for blob data | Microsoft Learn</a></li>

</ul>
<p>The post <a href="https://jensdufour.be/2025/12/01/windows-365-restore-points-a-guide-to-long-term-storage/">Windows 365 Restore Points: A Guide to Long-Term Storage</a> appeared first on <a href="https://jensdufour.be">Jens Du Four</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jensdufour.be/2025/12/01/windows-365-restore-points-a-guide-to-long-term-storage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: jensdufour.be @ 2026-04-20 01:34:05 by W3 Total Cache
-->