<?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>Mynster Blog</title>
        <link>https://mynster-it.dk</link>
        <description>A blog about automation, scripting, and homelabbing.</description>
        <lastBuildDate>Mon, 17 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Morten Mynster</copyright>
        <item>
            <title><![CDATA[msgraphProxy 1.0.3 released]]></title>
            <link>https://mynster-it.dk/2026/08/17/msgraphproxy-v1-0-3-released</link>
            <guid>https://mynster-it.dk/2026/08/17/msgraphproxy-v1-0-3-released</guid>
            <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[msgraphProxy 1.0.3 is now available on the PowerShell Gallery.]]></description>
            <content:encoded><![CDATA[<p>msgraphProxy 1.0.3 is now available on the PowerShell Gallery.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's new<a href="https://mynster-it.dk/2026/08/17/msgraphproxy-v1-0-3-released#whats-new" class="hash-link" aria-label="Direct link to What's new" title="Direct link to What's new" translate="no">​</a></h2>
<p><a href="https://github.com/Mynster9361/msgraphProxy/blob/main/changelog.md" target="_blank" rel="noopener noreferrer" class="">https://github.com/Mynster9361/msgraphProxy/blob/main/changelog.md</a></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">Install-Module</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name msgraphProxy </span><span class="token operator">-</span><span class="token plain">Scope CurrentUser </span><span class="token operator">-</span><span class="token plain">Force</span><br></div></code></pre></div></div>
<p>See the <a class="" href="https://mynster-it.dk/docs/modules/msgraphproxy">module docs</a> and <a class="" href="https://mynster-it.dk/docs/modules/msgraphproxy/commands">command reference</a> for details, or <a href="https://www.powershellgallery.com/packages/msgraphProxy/1.0.3" target="_blank" rel="noopener noreferrer" class="">view it on the PowerShell Gallery</a>.</p>]]></content:encoded>
            <category>powershell</category>
            <category>release</category>
            <category>msgraphproxy</category>
        </item>
        <item>
            <title><![CDATA[Delta endpoints in MSGraph fastest data change fetcher]]></title>
            <link>https://mynster-it.dk/2026/06/07/DeltaEndpoints</link>
            <guid>https://mynster-it.dk/2026/06/07/DeltaEndpoints</guid>
            <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Delta endpoints can be used to gather a complete set of data first and then subsequiently all changes over time]]></description>
            <content:encoded><![CDATA[<p>Delta endpoints can be used to gather a complete set of data first and then subsequiently all changes over time</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="intro">Intro<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#intro" class="hash-link" aria-label="Direct link to Intro" title="Direct link to Intro" translate="no">​</a></h2>
<p>If you have ever written a script that fetches all users, all groups, or all devices from Microsoft Graph on a schedule, you already know the pain: even with <code>$select</code> trimming down the properties and <code>$filter</code> narrowing the result set along with ´batching´, you are still re-downloading data that has not changed since the last run.
Delta endpoints are the answer to that problem.
They let you do one full sync to get a baseline, and from that point forward only receive the objects that were <strong>added, updated, or deleted</strong> since your last call.</p>
<blockquote>
<p>NOTE: the below result is of a tenant with 25k users</p>
</blockquote>
<p>LinkedIn:
<a href="https://www.linkedin.com/in/mortenmynster/" target="_blank" rel="noopener noreferrer" class="">Morten Mynster</a></p>
<p>Discord:
<a href="https://discord.com/users/159029828748574720" target="_blank" rel="noopener noreferrer" class="">Morten (Mynster)</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-do-delta-endpoints-do">What do Delta endpoints do?<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#what-do-delta-endpoints-do" class="hash-link" aria-label="Direct link to What do Delta endpoints do?" title="Direct link to What do Delta endpoints do?" translate="no">​</a></h2>
<p>A delta endpoint works in two phases:</p>
<ol>
<li class=""><strong>Initial sync</strong> – You call the endpoint without a delta token. Graph pages through the full result set exactly like a normal request, but at the very end of the last page it returns a <code>@odata.deltaLink</code> instead of a <code>@odata.nextLink</code>.</li>
<li class=""><strong>Incremental sync</strong> – You store that delta link (or the token embedded in it) and use it on your next run. Graph now returns <strong>only</strong> the objects that changed since the token was issued, along with a fresh delta link for the next cycle.</li>
</ol>
<p>Deleted objects are included too — they come back as stub objects with a <code>@removed</code> annotation so you know to remove them from your local copy.</p>
<p>The net effect is dramatic: a tenant with 50k users might return thousands of objects on the first call, but only a handful on subsequent runs when activity has been low.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-token-under-the-hood">The token under the hood<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#the-token-under-the-hood" class="hash-link" aria-label="Direct link to The token under the hood" title="Direct link to The token under the hood" translate="no">​</a></h3>
<p>The delta link URL looks like this:</p>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">https://graph.microsoft.com/v1.0/users/delta?$deltatoken=&lt;opaque-string&gt;</span><br></div></code></pre></div></div>
<p>The opaque token encodes a server-side cursor. You do not need to understand its contents — just store it and hand it back on the next request.</p>
<p>Two important expiry behaviours to be aware of:</p>
<ul>
<li class=""><strong>Token expiry</strong> — For directory objects (users, groups, devices, service principals, etc.) delta tokens are valid for <strong>7 days</strong>. For Outlook entities (messages, mail folders, events, contacts, etc.) the limit is not fixed — it depends on the size of the internal delta token cache. When a token expires, Graph returns a <code>40X</code> error with code <code>syncStateNotFound</code>. That is your signal to restart with a full sync.</li>
<li class=""><strong>Synchronisation reset</strong> — Separately, Graph can return <code>410 Gone</code> with a <code>Location</code> header pointing to an empty <code>$deltatoken</code>. This happens due to internal maintenance or tenant migration and also requires a fresh full sync.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-when-would-a-use-case-for-this-occur">So when would a use case for this occur?<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#so-when-would-a-use-case-for-this-occur" class="hash-link" aria-label="Direct link to So when would a use case for this occur?" title="Direct link to So when would a use case for this occur?" translate="no">​</a></h2>
<p>Think about any recurring automation that keeps a local copy of directory data in sync:</p>
<ul>
<li class=""><strong>Nightly user sync to a database or SIEM</strong> — Instead of re-importing 80k rows every night, only process the 30 accounts that were created, changed, or deleted since yesterday.</li>
<li class=""><strong>Group membership cache</strong> — Keep a local hashtable of group members up to date without hammering the groups endpoint every few minutes.</li>
<li class=""><strong>Device compliance dashboard</strong> — Track which devices moved in or out of compliance since the last poll.</li>
<li class=""><strong>Licence reconciliation</strong> — Detect newly onboarded or offboarded users without a full tenant export each time.</li>
<li class=""><strong>Teams channel message sync</strong> — Archive only new messages rather than fetching entire conversation histories.</li>
</ul>
<p>Any scenario where you need <em>what changed</em> rather than <em>everything that exists</em> is a candidate for a delta endpoint.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benchmarking-full-fetch-vs-delta">Benchmarking: full fetch vs delta<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#benchmarking-full-fetch-vs-delta" class="hash-link" aria-label="Direct link to Benchmarking: full fetch vs delta" title="Direct link to Benchmarking: full fetch vs delta" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-invoke-restmethod-raw-approach">Using Invoke-RestMethod (raw approach)<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#using-invoke-restmethod-raw-approach" class="hash-link" aria-label="Direct link to Using Invoke-RestMethod (raw approach)" title="Direct link to Using Invoke-RestMethod (raw approach)" translate="no">​</a></h3>
<p>To understand what is happening under the hood, here is the full implementation using plain <code>Invoke-RestMethod</code>.</p>
<p><strong>First run — full sync, delta link captured</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$headers</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Authorization  = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">'Content-Type'</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">'application/json'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$users</span><span class="token plain"> = </span><span class="token namespace">[System.Collections.Generic.List[object]]</span><span class="token plain">::new</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/users/delta"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$headers</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method GET</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">do</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">value </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$users</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$headers</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method GET</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># At this point $t.'@odata.deltaLink' holds the cursor for the next run</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deltaLink</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.deltaLink'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deltaLink</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_link.txt"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$users</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-File</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FilePath </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_users_full.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Days              : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Hours             : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Minutes           : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Seconds           : 44</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Milliseconds      : 18</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Ticks             : 440184726</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalDays         : 0,0005094730625</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalHours        : 0,0122273535</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMinutes      : 0,73364121</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalSeconds      : 44,0184726</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMilliseconds : 44018,4726</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><br></div></code></pre></div></div>
<p>Notice the loop condition: while a <code>@odata.nextLink</code> exists we keep paging.
When there are no more pages Graph replaces it with <code>@odata.deltaLink</code> — that URL is your cursor and must be saved before the script exits.</p>
<p><strong>Subsequent runs — only changes</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deltaLink</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_link.txt"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Raw</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"> = </span><span class="token namespace">[System.Collections.Generic.List[object]]</span><span class="token plain">::new</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deltaLink</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$headers</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method GET</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">do</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">value </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$headers</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method GET</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">while</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.nextLink'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Save the new delta link for the next run</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$t</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@odata.deltaLink'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_link.txt"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-File</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FilePath </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_users_changes.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Days              : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Hours             : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Minutes           : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Seconds           : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Milliseconds      : 135</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Ticks             : 1359807</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalDays         : 1,57385069444444E-06</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalHours        : 3,77724166666667E-05</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMinutes      : 0,002266345</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalSeconds      : 0,1359807</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMilliseconds : 135,9807</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><br></div></code></pre></div></div>
<p>This works, but as you can see there is quite a bit of boilerplate: manual pagination, manually detecting which link type came back on the last page, and manually persisting the cursor.
Also note that i had 0 changes between these two but instead of having to gather all the data again and basicly wasting 44 seconds we were just told no changes since last request so in this instance it is the very least amount of time to execute.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-entraauth-simplified-approach">Using EntraAuth (simplified approach)<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#using-entraauth-simplified-approach" class="hash-link" aria-label="Direct link to Using EntraAuth (simplified approach)" title="Direct link to Using EntraAuth (simplified approach)" translate="no">​</a></h3>
<p>The <a href="https://github.com/FriedrichWeinmann/EntraAuth" target="_blank" rel="noopener noreferrer" class="">EntraAuth</a> module wraps all of the above into a single parameter.</p>
<p><strong>First run — full sync, baseline stored</strong></p>
<blockquote>
<p>NOTE: The time result will be the same just a lot less code</p>
</blockquote>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">Connect-EntraService</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Service </span><span class="token string" style="color:rgb(255, 121, 198)">"Graph"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ClientID </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TenantID </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ClientSecret </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$delta</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$users</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-EntraRequest</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">'users/delta'</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">DeltaSession </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$delta</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$users</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-File</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FilePath </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_users_full.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>This will page through every user in the tenant and write the full set to disk.
The <code>$delta</code> hashtable is populated in-place by the module with the delta token, ready for the next run.</p>
<p><strong>Subsequent runs — only changes</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-EntraRequest</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">'users/delta'</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">DeltaSession </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$delta</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-File</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FilePath </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_users_with_delta_session.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>On the second call the <code>-DeltaSession</code> parameter makes <code>Invoke-EntraRequest</code> automatically append the stored delta token to the request URL.
In a quiet tenant the response is near-instant because almost nothing has changed.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the--deltasession-parameter-is-so-convenient">Why the <code>-DeltaSession</code> parameter is so convenient<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#why-the--deltasession-parameter-is-so-convenient" class="hash-link" aria-label="Direct link to why-the--deltasession-parameter-is-so-convenient" title="Direct link to why-the--deltasession-parameter-is-so-convenient" translate="no">​</a></h3>
<p>Compare the two approaches side by side. With raw <code>Invoke-RestMethod</code> you must:</p>
<ol>
<li class="">Detect whether the last page returned <code>@odata.deltaLink</code> or <code>@odata.nextLink</code>.</li>
<li class="">Extract the delta link from the final response yourself.</li>
<li class="">Persist the link to disk between runs and restore it on the next invocation.</li>
<li class="">Remember to update the saved link after every run.</li>
</ol>
<p>With <code>-DeltaSession</code> you pass a plain <code>[hashtable]</code> reference and the module handles all of that bookkeeping for you. The hashtable is updated in-place so the same variable is ready to use on the next iteration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="persisting-the-entraauth-delta-session-between-script-runs">Persisting the EntraAuth delta session between script runs<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#persisting-the-entraauth-delta-session-between-script-runs" class="hash-link" aria-label="Direct link to Persisting the EntraAuth delta session between script runs" title="Direct link to Persisting the EntraAuth delta session between script runs" translate="no">​</a></h3>
<p>Because <code>$delta</code> is just a hashtable, serialising and restoring it is trivial:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Save token to disk after each run</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$delta</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_token.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Encoding utf8</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Restore on next run</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$delta</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"delta_token.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Raw </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AsHashtable</span><br></div></code></pre></div></div>
<p>Now your script can be run in a scheduled task and pick up exactly where it left off every time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-deleted-objects">Handling deleted objects<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#handling-deleted-objects" class="hash-link" aria-label="Direct link to Handling deleted objects" title="Direct link to Handling deleted objects" translate="no">​</a></h2>
<p>Delta responses include deletions as lightweight stub objects. When processing changes, check for the <code>@removed</code> key:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@removed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">'@removed'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">reason</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">'changed'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token comment" style="color:rgb(98, 114, 164)"># Soft-deleted — still restorable via the deletedItems API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Soft-deleted (restorable): </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">id</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">'deleted'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token comment" style="color:rgb(98, 114, 164)"># Permanently deleted — cannot be restored</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Permanently deleted: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">id</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># Object was added or updated</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Changed: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$user</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">displayName</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The <code>reason</code> value matters if your downstream system needs to distinguish between a recoverable deletion (<code>changed</code>) and a hard delete (<code>deleted</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="available-delta-endpoints-currently">Available Delta endpoints currently<a href="https://mynster-it.dk/2026/06/07/DeltaEndpoints#available-delta-endpoints-currently" class="hash-link" aria-label="Direct link to Available Delta endpoints currently" title="Direct link to Available Delta endpoints currently" translate="no">​</a></h2>
<div class="language-txt codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-txt codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Directory / identity</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/administrativeunits/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/applications/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/contacts/delta           # organisational contacts</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/devices/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/directoryroles/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/directoryobjects/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/oauth2permissiongrants/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/serviceprincipals/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Groups</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/calendar/calendarview/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/calendar/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/calendarview/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/drive/root/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/groups/{id}/planner/plans/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># OneDrive / SharePoint</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/drives/{id}/root/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/sites/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/sites/{id}/drive/root/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/sites/{id}/lists/{id}/items/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Planner</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/planner/plans/{id}/buckets/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/planner/rosters/{id}/plans/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/planner/tasks/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Teams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/teams/{id}/channels/{id}/messages/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Per-user: calendar / mail / contacts</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendar/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendargroups/{id}/calendars/{id}/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendars/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendars/{id}/calendarview/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendars/{id}/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/calendarview/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/contactfolders/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/contactfolders/{id}/contacts/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/events/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/mailfolders/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/mailfolders/{id}/messages/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/mailboxfolders/delta      # mailboxFolder resource</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/mailboxitems/delta        # mailboxItem resource</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Per-user: drive / Planner / To Do</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/drive/root/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/planner/all/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/planner/tasks/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/tasks/lists/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/tasks/lists/{id}/tasks/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/todo/lists/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/users/{id}/todo/lists/{id}/tasks/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Education</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/education/classes/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/education/schools/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/education/users/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/education/classes/{id}/assignments/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Calls / recordings (beta only)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/communications/callRecords/{id}/sessions/delta</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">/teams/{id}/channels/{id}/messages/{id}/replies/delta</span><br></div></code></pre></div></div>
<p>Reference: <a href="https://learn.microsoft.com/en-us/graph/delta-query-overview" target="_blank" rel="noopener noreferrer" class="">Microsoft Graph delta query overview</a></p>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
        </item>
        <item>
            <title><![CDATA[Step by step guide for getting up and running with least privileged msgraph]]></title>
            <link>https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup</link>
            <guid>https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup</guid>
            <pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A step by step guide for getting up and running with least privileged msgraph]]></description>
            <content:encoded><![CDATA[<p>A step by step guide for getting up and running with least privileged msgraph</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="intro">Intro<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#intro" class="hash-link" aria-label="Direct link to Intro" title="Direct link to Intro" translate="no">​</a></h2>
<p>So you are ready to begin seeing how many permissions you can remove from your applications, Great!</p>
<p>This step-by-step guide that i believe some people need in order to get started with my module but to be honest i have no clue is this is the issue for the low adoption rate that i am seeing.
So if you are brave and have an opinion or feedback that you think is would help more people adopt my module please reach out to me i am on discord or linkedin and my messages are open.</p>
<p>LinkedIn:
<a href="https://www.linkedin.com/in/mortenmynster/" target="_blank" rel="noopener noreferrer" class="">Morten Mynster</a></p>
<p>Discord:
<a href="https://discord.com/users/159029828748574720" target="_blank" rel="noopener noreferrer" class="">Morten (Mynster)</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-up-and-running">Get up and running<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#get-up-and-running" class="hash-link" aria-label="Direct link to Get up and running" title="Direct link to Get up and running" translate="no">​</a></h2>
<p>First up a prerequisite for you to be able to set this up is to have either Entra ID P1 or P2 license.
The easiest way to see this is by going to the Entra Overview page.</p>
<p>Here you should be able to see which license you have for Entra</p>
<p><img decoding="async" loading="lazy" alt="Entra overview" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-entraOverview-3bcac32d1c8fdadd96330bf51463b88c.png" width="1459" height="610" class="img_ev3q"></p>
<p>Now that is out of the way lets get started.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-a-log-analytics-workspace">Setup a Log Analytics workspace<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#setup-a-log-analytics-workspace" class="hash-link" aria-label="Direct link to Setup a Log Analytics workspace" title="Direct link to Setup a Log Analytics workspace" translate="no">​</a></h2>
<p>First you need a subscription and if you have been using Azure i will gurantee you already have one that you have access to and can utilize.</p>
<p><img decoding="async" loading="lazy" alt="Setup Log analytics workspace 1" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-loganalytics-d8657c8adca2b6409096cb179f255518.png" width="940" height="715" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Setup Log analytics workspace 2" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-loganalytics-2-0e6d1493eacfd1fd41db6511882d164e.png" width="1003" height="1218" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Setup Log analytics workspace 3" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-loganalytics-3-2df1390863158b2a8267226ff8d53b81.png" width="1027" height="1213" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Setup Log analytics workspace 4" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-loganalytics-4-d1d1fce45f4f7707a907c7c6aa0bab4d.png" width="856" height="578" class="img_ev3q"></p>
<p>Easy peacy right!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-entra-diagnostics-for-microsoft-graph-activity-logs">Setup Entra diagnostics for Microsoft Graph Activity Logs<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#setup-entra-diagnostics-for-microsoft-graph-activity-logs" class="hash-link" aria-label="Direct link to Setup Entra diagnostics for Microsoft Graph Activity Logs" title="Direct link to Setup Entra diagnostics for Microsoft Graph Activity Logs" translate="no">​</a></h2>
<p>Now the log analytics workspace is created we need to enable the diagnostics logs so go to Entra and then Diagnostic settings</p>
<p><img decoding="async" loading="lazy" alt="Setup Entra diagnostic 1" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-enable-diagnostic-1-5c453d60badb9791d58022550a9ed70a.png" width="1184" height="748" class="img_ev3q"></p>
<p>Click Add diagnostic setting</p>
<p><img decoding="async" loading="lazy" alt="Setup Entra diagnostic 2" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-enable-diagnostic-2-1dc852444f4680aed566026ab1d705da.png" width="1569" height="760" class="img_ev3q"></p>
<p>Now give the diagnostic setting a name like "MicrosoftGraphActivityLogs"
Enable MicrosoftGraphActivityLogs and send to log analytics workspace and select you subscription and log analytics workspace</p>
<p><img decoding="async" loading="lazy" alt="Setup Entra diagnostic 3" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-enable-diagnostic-3-fb16cd9b513cf6b472ec2cf962935fd7.png" width="1205" height="1054" class="img_ev3q"></p>
<p>Done deal now you have logs for Microsoft graph activity. <em>Note it will take a bit to populate with data</em></p>
<p>You can go to log analytics and try and request some data from the log analytics workspace like the below example</p>
<p>Example query:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">MicrosoftGraphActivityLogs </span><span class="token operator">|</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">where</span><span class="token plain"> RequestUri endswith </span><span class="token string" style="color:rgb(255, 121, 198)">"/users"</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Setup Entra diagnostic 5" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-loganalytics-5-622b3976145110d6e2d5dce18f036ed3.png" width="2523" height="1130" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setup-an-automation-to-gather-the-report-on-a-regular-basis">Setup an automation to gather the report on a regular basis<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#setup-an-automation-to-gather-the-report-on-a-regular-basis" class="hash-link" aria-label="Direct link to Setup an automation to gather the report on a regular basis" title="Direct link to Setup an automation to gather the report on a regular basis" translate="no">​</a></h2>
<p>Create your app registration
<img decoding="async" loading="lazy" alt="Setup App registration 1" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-appreg-1-240bcd3b84b04228e1cb560a1ea2a9f1.png" width="1050" height="1214" class="img_ev3q"></p>
<p>Create some credentials to use for authentication
<img decoding="async" loading="lazy" alt="Setup App registration 2" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-appreg-2-769be002062d49be06ac93b7fcdb8aea.png" width="1472" height="820" class="img_ev3q"></p>
<p>Now give the role "Log Analytics Reader" to the service principal on the log analytics workspace
<img decoding="async" loading="lazy" alt="Setup App registration 3" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-appreg-3-91d798f376c4f7ee3f54042805ba5d00.png" width="2291" height="1081" class="img_ev3q"></p>
<p>And give the app Application.Read.All permissions</p>
<blockquote>
<p>NOTE: if you want to audit Delegated permissions you also need to add "Directory.Read.All" as that is the least privileged role that can send requests to the endpoint "/oauth2permissiongrants"</p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="Setup App registration 4" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-appreg-4-bddcc67425110734d1ef967e759de58e.png" width="1434" height="732" class="img_ev3q"></p>
<p>Once that is done you can use the following code to create a report:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your tenant id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"App id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"App secret"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-SecureString</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AsPlainText </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$daysToQuery</span><span class="token plain"> = 5 </span><span class="token comment" style="color:rgb(98, 114, 164)"># How long back should this report be this is 5 days</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$logAnalyticsWorkspaceId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Workspace id from the log analytics can be found on the overview of log analytics"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> LeastPrivilegedMSGraph</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Initialize-LPMSLogAnalyticsApi</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-EntraService</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Service </span><span class="token string" style="color:rgb(255, 121, 198)">"LogAnalytics"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GraphBeta"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ClientID </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TenantID </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ClientSecret </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$msGraphReport</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-LPMSAppRoleAssignment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$msGraphReport</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Get-LPMSAppActivityData</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">WorkspaceId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$logAnalyticsWorkspaceId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Days </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$daysToQuery</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Defaults to 100k entries per app use -MaxActivityEntries to increase max is 500k entries per app</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$msGraphReport</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Get-LPMSAppThrottlingData</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">WorkspaceId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$logAnalyticsWorkspaceId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Days </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$daysToQuery</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$msGraphReport</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Get-LPMSPermissionAnalysis</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-LPMSPermissionAnalysisReport</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AppData </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$msGraphReport</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OutputPath </span><span class="token string" style="color:rgb(255, 121, 198)">".\report.html"</span><br></div></code></pre></div></div>
<p>That's it now you have a report that you can utilize to better limit your applications to only the needed permissions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-read-the-report">How to read the report<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#how-to-read-the-report" class="hash-link" aria-label="Direct link to How to read the report" title="Direct link to How to read the report" translate="no">​</a></h2>
<p>The first view you will be met with might be a bit overwhelming but lets get to it!</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-apps">All apps<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#all-apps" class="hash-link" aria-label="Direct link to All apps" title="Direct link to All apps" translate="no">​</a></h4>
<p>First up the general information you will see the Total apps, the apps in your tenant that already has the most optimal permissions, Apps that has excessive permissions and apps with unmatched activities.</p>
<p>So first up Total apps makes sense right? but you might be thinking wait i have way more than 1612 apps why is it only showing that?
Well the report only works for apps with Microsoft Graph permissions assigned either application permissions or delegated permissions.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimal-permissions">Optimal permissions<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#optimal-permissions" class="hash-link" aria-label="Direct link to Optimal permissions" title="Direct link to Optimal permissions" translate="no">​</a></h4>
<p>This section will show a list of apps that already is setup correctly compared to which endpoints it has sent requests to.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="excessive-permissions">Excessive Permissions<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#excessive-permissions" class="hash-link" aria-label="Direct link to Excessive Permissions" title="Direct link to Excessive Permissions" translate="no">​</a></h4>
<p>This will show a list of apps that for one reason or another has permissions that it does not use or is higher privileged than what the app is sending requests to to give an example lets say we have an app that sends GET requests to the /groups endpoint and that the app has Group.ReadWrite.All permissions then this app would be included in the Excessive permissions as the least privileged permissions for the GET /groups endpoint is GroupMember.Read.All so the suggested action would be to remove the Group.ReadWrite.All permission and give the GroupMember.Read.All permission.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="apps-with-unmatched-activities">Apps with Unmatched Activities<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#apps-with-unmatched-activities" class="hash-link" aria-label="Direct link to Apps with Unmatched Activities" title="Direct link to Apps with Unmatched Activities" translate="no">​</a></h4>
<p>These are apps where i have not been able to map one or more of the requests sent by the app up with a permission hopefully in the future i will be able to match 100% of all activites but for now each app that has unmatched activity will contain a list of the endpoints i have not been able to match up.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="throtling">Throtling<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#throtling" class="hash-link" aria-label="Direct link to Throtling" title="Direct link to Throtling" translate="no">​</a></h4>
<p>The second set of blocks is concerning throttling which is more of a subset addition for the actual report it is just something that can be helpful if you ever run into an issue with one or more apps being throttled a lot this will help you identify those and then you can dig futher into it by utilizing the log analytics workspace i will not get more into it for now.</p>
<p><img decoding="async" loading="lazy" alt="Read the report 1" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-Report-1-21091de818128459a69309610982c2a9.png" width="1801" height="1084" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-easy-part---no-activity">The easy part - No activity<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#the-easy-part---no-activity" class="hash-link" aria-label="Direct link to The easy part - No activity" title="Direct link to The easy part - No activity" translate="no">​</a></h4>
<p>Moving into some of the more fun stuff if you just want a list of apps where you can remove permissions from straight away to get some value from this module set the filter "Activity Status" to "No Activity" This will give you a complete list of all apps that has some Microsoft Graph Permissions but are not using them most of them will properly be the default delegated permission "User.Read" you should be able to remove 90% of these with out having to spend to much time investigating.
The others that might be included here will properly also be some SSO applications these can be a bit more tricky as you will properly not see too much activity on these for these i would suggest having Sign-in logs enabled in diagnostic settings so you can see if there are any sign ins to the app.
If there is no sign in and there is no Microsoft graph activity i will almost gurantee that the app is no longer in use.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-harder-part---excessive-permission">The harder part - Excessive permission<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#the-harder-part---excessive-permission" class="hash-link" aria-label="Direct link to The harder part - Excessive permission" title="Direct link to The harder part - Excessive permission" translate="no">​</a></h4>
<p>Looking at the 2 below pictures we have the app ZDX Endpoint Analytics
First we have some Throttling statistics along with some general information on errors, amount of requests along with when it was first and last seen (Based on how many days you looked back)</p>
<p>For this app we successfully matched up all activities from the app within the timeframe.
We can see what the app has as Current Permissions.
Next we get a list of the "Optimal Permissions" this is what the app should have in order to query the endpoints that it is sending requests to below that/those permissions you will also have a drop down available showing which endpoints this permission covers in this instance the least privileged permission for all the endpoints that it is requesting is covered by one permission "DeviceManagementManagedDevices.Read.All" which means the rest of the permissions can be removed as shown in the Excess permissions.</p>
<p>Finally at the bottom we will have a list of the API Activities that the app has sent requests to and what method was used.</p>
<p><img decoding="async" loading="lazy" alt="Read the report 2" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-Report-2-06d3e251c70baaac61bb503377a0b942.png" width="1125" height="1106" class="img_ev3q">
<img decoding="async" loading="lazy" alt="Read the report 3" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-Report-3-7aa7b6fa175303be1d80550ce53e535b.png" width="1097" height="323" class="img_ev3q"></p>
<p>Finally if this application had any endpoints that my module was not able to lookup a permission for it would be listed below the API Activites like shown below:
<img decoding="async" loading="lazy" alt="Read the report 4" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-Report-4-4b93fa8240c2aaf9581d3afe4622a480.png" width="1138" height="561" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-how-much-does-it-cost">So how much does it cost<a href="https://mynster-it.dk/2026/02/26/LeastPrivilegedMSGraphSetup#so-how-much-does-it-cost" class="hash-link" aria-label="Direct link to So how much does it cost" title="Direct link to So how much does it cost" translate="no">​</a></h2>
<p>This is for a larger tenant for January and the total cost for the logs we have enabled
1.659,70 $ USD</p>
<p>The more realistic cost for just the MSGraph activity logs that we have would be 304.722 * 2.78$ = 847,12716 $ USD</p>
<p>Which in total gives us 399.684.221 entries in my instance so quite a lot of data to pass through!</p>
<p><img decoding="async" loading="lazy" alt="Cost for January" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-CostJanForEverything-1-488a5e49cf7cb5403e05de2fb235f984.png" width="2544" height="471" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Cost for January" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-CostJanForEverything-2-7b829dfa135359409d0694d9ee73a14e.png" width="2534" height="698" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Cost for January" src="https://mynster-it.dk/assets/images/2026-02-26-LeastPrivilegedMSGraphSetup-CostJanForEverything-3-eb0ca831faeb77f9826cf7e4c7bbebad.png" width="2520" height="639" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Cost for January" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAp8AAAFrCAIAAAAYYXXNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAACCYSURBVHhe7d1rkFTlncdxzbvUvto3G2EwasIltbUb47q1s/GSuGxtxknV7mR06Sg7W1YS4+p4IWhSEtSwYAgSoyhljOuIQiktaJABFMSCCHLTmUEUEKQHBgYQmGEudA8pJ6VJb537c57ndE93T3dPz3++v/qUNXP69OnT53T17zxP9+AFVePHAQAASS4wFwEAgFGNdgcAQBraHQAAaWh3AACkod0BAJCGdgcAQBraHQAAaWh3AACkod0BAJCmUtp9/DgAAFAc5W53+1EvAgAApVO+dqfXAQAojzK1u1nt4y66aNxFXwIAAEVXjnZXq33KlCnV1dXXXXfdvxBCCCGkNCl5u6vVfvnlX9cfnxBCCCHFThna3R+1T9YfnBBCCCElSGnb3R+4j7voourqav3BCSGEEFKClLrd/e/QfYnP2gkhhJDypHztrj/yUDG3huHQjy8hhBC5KUe7O3/8pj/yUDG3huHQjy8hhBC5KU+7W397pz/yUDG3huHQjy8hhBC5od3HCv34EkIIkRvafazQjy8hhBC5KWG7K38OR7uPPP34Zk1NTU1dXV0sFps+fXoDqaRMnz49FovV1dXV1NTop62gcK7LlqKfO0KypHLb/a+vveULP9lxwaz9GKYLf9r2xZue0o9vhtTW1sZiMf1tiVRkYrFYbW2tfgpzDud6BDPMc0fIkKncdqfai+jC+1r14xuV+vp6/U2IVHzq6+v1E5lDONeVkMLOHSG5JNTuEyZcfOm/33vx3/1z1fhxX776hku/82Ozs3M3zHY3KwrDoR/fcKZOncowbvQmFotNnTpVP6kZwrmuqOR17gjJPUG7T5hw8Vdva5qyuOuS6/7rkmunTXn8+FfvXlF18SVmbeeIdq8o+vENh7f70Z5YLKaf1AzhXFdacj93hOQet92Dav/XW9xqv+eVqi9fanZ27mj3iqIfXyVM0spILtO8nOvKTC7njpC8YrV7Kaq9XO3et7MneedT5nLo9OPrpba2Vn+nIaM22b+oxbmu5GQ/d4TkmwuqqsZ/5dZnnGr/8lX1Ux4/MXHGquFXe9na/UA6nf7sT5u3HjNuQoh+fL0wTysp2ed4OdeVnOznjpB8Y43dL72+8WuLz3z1h09PmHL5pP9tmfTLD50v1g1Tudp9cNXW86c/S58+2jP9UXOFUSOdTpsLi0g/vnZqamr09xgyypPpb6mLcK6fb+1OHdqoLy1dNrSnkgOpZLvykMtazwzYCwe6WpcZa+a2cgliHZkiPEqmc0dIAXE/dy9FwZet3Z+btf+Cp06t6vlL+tPB5c0JY51C3Hfk83SQzze/rq9QdFnb/fAV2T99eOrwFebCMP342qmrq9PfYIxsTLjvmwrrLd5antigry0zs5o2ffRJV4/79HvP7F2lr1E5qaur00+znVzOdSgbD/lnvLt1qbWkjO2uvur8wg7a2uG+/IJqt51pez7LyqVJuN3tnXd3I69kOneEFJDgO/OXXt84ZXHXV259plgFX9Z2tyTufH+w/89/6fi4a8iqG9J9Rz7vP3La/bVtMP3p+fuMdYorW7uvHTid+uNvlhnLHct6dqY+e2OtsTxMP7528pmqXdrWFRoYjZks2Pix3etdHXt3bdq8aefexIm96/WVsmfx+o+6e08U8HZfQDJN8OZzrp1q94t8aVurXY1lbveu1ja7471XnfUKdFvTaVNnZ5yrELu8nWsC+1okw8olSqjdlYfOM5nOHSEFJPT37s4I/tL6WRdP/nur4B98Z8IlXzFrO0dlb3fLZS/37EylPz13/jcvD2sQH2r34FFCD/dcd/pAm7tyurvvue5hDfSztfus/ZetPx9d8Ha1b14/9JPVj6+dfP7x0THa7gu2dNiF8dLP9VvyiD2OLOTtvoBMnz5dP8128jnXdmWag12n3f0xfbCCMnp2Fy5t6/Kfr3Wr98rZ0J465N3LTtYrBqet3ftGNKh1U2gdZ9+6WpdlWFmJ18EbrTWdyQlluO/tvHtl4D8155m6twYPHTxceCLBuov76LaMz9RJpnNHSAHR/626i//2H52v1E24bNKEKd8wOzt3I9LutsMPfPynT//8+fu7Tlym35Qrtd2d8rZ/ztzuaeXnggb62ds9uuBzrvZM7a6/u2SL3u7WW2EwNeq+S3ojJ/89Tn07C9743JneUOzttwZvyurMqjp6a9/ob0ftS2WhtSfKuNN/bzXryr41amf82Hc/+8FyfblbJP4Bsd/onQedtXxXR3e//Yj91hx+6KMNp28WrtqVONPnrNN7pn3TszOUjWxb+5Fz9+796xYsXHfglL3a2Y5dy5y1ho5+mu3oKw0R63jqR8bpMOcwWj87xz90DDcmgqb05/Pbu7yfzYuGAts9uCl6nQwrK3Hbvdt+eXS3LtVn8q29Mqs673YPnf3Mz9SPftoIKTR6uxfRyLd7yycFT9Grn7tHDeIt2tjdXef18/0RuzS0IdtdL/h8qr307e69k4ZmQdX3fW0AZw5k7Xfb4HtJS9sS7s/WA4UGYe5bpDN5ay9XN66uo+6Avv/+Qr3DQrGfWsRlQeZ2b/7IKeamxc++3nriwMaGny988rUPrbH73lVPLn583oyZS9tOJQd6T+zdtLLpxQ17O3sGUj3t6+f5bdF3ZOcrL67cdcT6OKCv98SB9S8t33SoL5UcOLLpYW0fMkQ/zXb0lYaOe2EUHJ9QE3vHc+Mh5azZ6zi/esuXtZ6xLtr8n/VTkC3RzR2+KXqdDCsr0Z5dZG27Va3cMXK1yHmF0DrRL6Go6KeNkEIjrd2LPzPfNpgOHiKHdjd2KUe5tHtQ8Gvzq/ZM7Z7PbK3ejvrY3W3rUF8G64Q7IBjYBdG3HyQolfA6/nKzYJzl2rjQHDgOncLb/emHZzQ0zJgx07o1NDO/3rrjsT9YdW5l5roD/cmBY1sfdjdyYtdv7eUrPuhLJfs+XGn/8qx1QaA+x8zJNLubz7lWY3dVMF4PjufGhNfuoeNjzb3b6zg/LG3rUv9rXtVlS3RzW78EDRpax/8MPsPKSrSF4TG3V+rqgF6ZlMqj3b3rXdtQZzDTuSOkgEhq91J9q+65bn/4PvLt7hR8/58/z6vaM7V7Pt+00ts3Q7t7b/rhdYxpT7My9e2r39lWx+Jmuyt7Eloe3kJOb69GVu49mxw4ufNpfXnmdm9Y8FprhzPr3nds5/LZ1iK13Zve0z6Dt8vA3jFlI24rqDPeOe58pm9m5XOutXiFnandtUsrZcRsDX/tU+P+nNtT8BMecyvN6lamd/YjvlUXvbKSyHbPcPHhvpCcCxR/l5Sfs7S7G3MaICKZzh0hBURKu5fgL+LCE/LOd+VOb/7UbXR7TD8y7W4V/KN5P039+NrJ56+k9PbNq92NEZ6Z8PbVzhhq7K5M3Xv39dsozzoxs3yPNUN+bNOT+ofezhB8izMEn7H5SLg/Zs5b9k6HNfje81JOY/fEhhlFavdMf1WVz7luWNZ6KCgn9Xia7W73lvm5uztDo3ziHvysJrxNLdqMujvL7QtmFNTloYG1vnIQvYP19a2jHR7QB1dgIRna3X3Q8PoZrh68ZDp3hBQQCe1ein/NJtzuzsfwdmfbpW7F/pL8SLV7AfTjayeff+FkeO1uv1FmHbiEtq8Ox+1qzNbuznurt9x5bw3Wj2iUIEOu0NDwy1UH7DfrvpOH2rbYfxF37MyB9Q0Ni3d+Yr2hH9r84rOv7LKK3H3Q9R8c27WyafGTTWs/6vba3R6vJ4/tWvn6pg1NM1cd6PU/d1/XZn2+3nOg2bp4KEq7Z/oXUfI519pMtbpLZruHVg4dTGv90OA44gWQT7uHOlifrYmoz+iV3ejtrhe83u6h8+JsM9i9ULsrk0bhdo94+uFkOneEFBAB7c6/RJsT/fh6yXnCdpjtro2xzEGMtn2lMBKHso/drQST8Np35kPDL+PtNYd2b2homP3s5v0n3K/Bp5J9XSd2xa3x+rId3gx8Yusuf+web+3utdfs7+n+eFOT/bl7w8J1ziXCwMmdTQ0NM55Y1XbM/2fUOtqa3YmB4bd79qndnM81GYFkP3eE5JtR3+78X2RypB9fLwL/zyLaJ8FjKdn/TyQCz7WgZD93hOSb0d7uyJV+fJXI+r+Chj4GHlPJ5f8iKutcy0ku546QvEK7jxX68Q1nlM/Zhqbfx2a15z6vO8rPtcDkfu4IyT20+1ihH99wpk6dypv+6E0sFps6dap+UjOEc11RyevcEZJ7Krfdv/CTHWZFoTAX3teqH9+oMG07GlPYpC7nuhJS2LkjJJdUbrv/1Y2PUvBFceFP275401P68c2Q2tpaBnajJbFYbDhfxeJcj2CGee4IGTKV2+5kBFNTU1NXVxeLxQr950tJqTJ9+vRYLFZXV1esv43mXJctRT93hGQJ7U4IIYRISwnb3S542p0QQggpd2h3QgghRFpod0IIIURaytPuVsFfd911+oMTQgghpAQpR7s7w/fq6mr9wQkhhBBSgpSv3adMmaw/OCGEEEJKkFK3e2hy/vLLv64/PiGEEEKKndK2uzZ8d0bw1dX/xGfwhBBCSOlShnbXC95x0ZccfwMAAIqr5O1uFHyo4wEAQNGVo921gqfmAQAoqQtOnToVX77c6eBrr7n6gz17Ptiz59prrnaWxJcvP3Xq1H33zjQLO19mwQMAgFIoX7s76HgAAEqtTDPzQ7JbHwAAFEGltDsAACiWsdXuVxJSxpivQAAoD9qdkFLFfAUCQHnQ7koea0ml0+mjzfryEcmajrSbVMtj+o1lyaKWVLpjjb60mMnzgDcfHcGjUUjMVyAAlMcoa/frG+fPn3//TVfoy3Pk1EmqdZHz5mu3RUfQLXmWTSnT3JE2mtXaPWVvQ8u9CwHvqRUjWdvdufjI8Vit6UinWiL2LM8DHtnuzUdzf9bN1n6U8eLAfAUCQHmMonavaZw/v/Hm798/nHa3aiaVcuukuSOViu7LEU9kkUcutFvW7+BFrR3Fa69s7d58NN2xprnD3J/IZGr3YoR2BwDTqGn36xvtUr9i2O1+tKUlZXfSmg67n9y3e3tcGDn8tUrOi1tmTqMsanVvCCpQGUaHhqTBNHto+/6D6kNSa321OK2hfDjO+ta+GTts3yHTHqqb8vZwUWsq1brI3xlvZafd/fW1/bF2wO74YGnEsVIPiLo8+oBrT0f5NdhOsBv+swtiPyNruXIxofyaqd2VY6Jeheg77z10hrNpxnwFAkB5jJp2dxWh3ZsXtaY61lzZfLSj2Xi7NwaCdl0ZU8duM+ldok6nWz97m9IfxYlaQnZRWeWRqbGsmGN3a0nEljPvofOs3VX8vXUe1N3b4MLCqeqoywhvLG7dMTg40cfKSuaxu3bAw8VsHDfzCBhbsBI6LOqeGxvUV1CfgrLcOib+HSM3Eh3zFQgA5TG22t1to8daUkc7Oqw3cf2dWq8KfQztxupOv4S8ytGGjEqlqU3vR/tkPTwNHvm4ZrcFNeYPmpWpCGMPtfhPNlzS/jEJ7ZK6TnCU1C1H7rOTnNs9dEbsSzHlpugnYmwhvDB0F/10W9F2218/dImQ6bptiJivQAAojzHZ7kFvLWpJZWt3vbC9RDZKuCPDlRYxsaw1zTDb3UnogwZzD60os8r+eN1od//gRLa7uufBOpmOlZU82j1YYkz7Rx2BqC1YUWYXlFsztLu6b8FDKC0ecQWgnc3omK9AACiPMdfu4SYId6pZFRlqSV/NjlZvkW1nz4EH5aF9HJ53u+vjyKHa3a4l/1EKHLuHrw+s+MuN5+sm800R++muHPWVvYgjELUFe7H9LLSrtwztrm5T/2DCjX6dYUc5m9ExX4EAUB60e9Z21+vTW6qvZifUnVp5e1G6RJ081y8FIts9apt2wagTyEO2uzLvHTV2V/Yqut0jpijMwa4WfY4hSNR+2r2+psNYHt3u+qELLff/PsJJVLuHdjv8WXvUZkOJPk1BzFcgAJTHqGn3K2++f34ohXS80SV+gVlv8WqU1dSbgmKO6J7QnK2yQmiwq38Q4CVcEplqI9iUsp2o7Wfaw+ARUy0t6thd2YB3t8h216+HwtccEcfKifIQwaWAGnVvw5cs2t2dqBtXBtlql4cnKuxoD6peFZlbCI3dg+F71NHOFPMVCADlMWravSj0d19iRx+Oy0jUQD+PaGP3TNdbWWO+AgGgPGh3IrLdlTn2gqJN+If+BiHnmK9AACgP2p0Ia3dvRn24zyg8M59/tdPuAEYQ7U5IqWK+AgGgPGj3ysrXCCGEkGFnjLZ7xL+UUhnRzw8hhBCSf2j3yoq5zwAA5GsUtXvst2/udBOfZdyaE79EK6Xd7+q4e2nLNcoCc58BAMjXqGn37y/etGlxzP551vKdO72f8+OXKO0OABBs1LS76ufxAofvfonm0+6L6pem737V0VHjLmxucJeklXpubng1VT/N/aXmifRtc+2/orqr4+4nmq+Zm3LWdxdOa7nN34KycXOfAQDIF+2ePXa1P6H95bS10C3p0AqZ2/1Vbx3rZ/8SgbE7AKAkRmG7z7Ym5n97s7E8B36J5truWhlHLrRG4c6vmds9w/iedgcAlMJoa/ebn9q0c+fy2cby3PglmmO7W9Pp4fa1olUy7Q4AqDCjqt3tai/s+3QOv0RzbHezfd2F2uw67Q4AqCSjp92HXe2FtLv97TnvI/bIhepn8Nbyhrusn5zv0A3d7ta4X/mVdgcAFMOoaXfrm3ShFPLRu1+iObe729nZvjOvfufO+QKdvTCnsbt3HcB35gEARTRq2r0o/E7Np93LGnOfAQDIF+1eWTH3GQCAfNHulRX9/wNACCGE5J8x2u4VG/38EEIIIflnbLU7AABjAe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0xWz3KwkhhBBSAaHdCSGEEGmh3QkhhBBpod0JIYQQaSlmuwMAgEpAuwMAIM0FixY93tvbe889dy9a9HjnsWOxadPMlQAAwChCuwMAIA0z8wAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANLQ7gAASEO7AwAgDe0OAIA0tDsAANJUXLvfeEP94fbEQCrp6DnbvWHD+m9/61pzzXw13nH7mdOn9ry/27ypDPa8v9t/Us4+NN5x+/HOYwsfWWCuDADAcFRou39y8sQrK1e8HF9+8OCBVPLc6lW/N9fMl9buG9a/cfTI4cY7bjfXLC7zqmLrlrcb77h9OO0+nPsCAMSr0HY/3J648Yb6qvHj7rn7rq4zp4sy4NZads/7u8+cPlXqdneezlsbN5o3Daehh3NfAIB4ld7u9//sp11dZ97dtatq/Lhvf+vaDRvW95ztTiXPnTxxfMH8+VXjx323tnbbO1v7+3oHUslTn5x8cPbsF55fMpBKvvD8EmeDfov77a5N/u95f7e5EXPHCrPwkQXHO49FXkM4Db12TXNfb89AKulfaqi75y90Vn5n65aBVLLz2FHnLgOppH+gAADwVWi7qzPzXV1n5vziocmTJm58883+vt41zavn/OKhI4fbT544ftutP1rTvDp5rn/d2ub77p25fdvWBb+aP2S7T5408Qc/uGX/vr1dZ07/av4vp998s7kRc8cK88LzSzIVsLM/zq3Os3bmFRY+smDtmmZt3K9NPDB2BwBkUaHt7g+sDx48cOuPflg1ftz/3Pbj06dOvvfuu5MnTawaP+6Z3z19rr9vSVOTX8w1Nd+ZPGnilf/wjSHbXVteNX6cuRFzxwqTvd3Vho5c862NGyO/gke7AwCyqNB2P9ye+H5sWnz5S/19vRvffHPypIkLH1ngT0f7Xnh+Sf336nbt3HGuv+9cf9/2bVu/W1tbQLubGzF3rDBDzsxHtvuQX7Cn3QEAWVRuu994Q/3kSRO3bnm7v69n8eIn/LG709OOmprvOPeq/17d1i1vJ8/1v/xyfElTUyp5buWKFVXjx02eNPHDD/YM2e7mRswdK4zzdPxLDVWmdt/z/m7/W3iM3QEABajodne+M//JyRNHDrf/ZMY9rS0tfb09q19bdc/ddy1e/MSWt/9w4w31r/3+1eUvvdh4x+3r1jaf6+97+eX4nF88dLa763jnscceffSN19ed6++LbPfdbdbWVq5YsaSpydyIuWMFc+YS1K/NR/5FnNPuDz04278aUD+Mp90BALmr9HavGj/ulZUrkuf6N2xY78yfO99s7znbvXnTW1df9c348pd6znar/+7N5EkTnS+ip5Lndre1HPhoX2S7L5g///Spk6nkuffefdfciLljw+E8tD/Z7n9Rzmz3G2+od64GBlLJvt6egx/tj2x3Z1jPd+YBAJEqrt0BAMAw0e4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADSjFi7f+3//jgamU8EAIBKQ7vnx3wiAABUmmK2+9TrvwcAAEZcMdsdAABUAtodAABpaHcAAKSh3QEAkIZ2BwBAGtodAABpaHcAAKSh3QEAkIZ2BwBAGtodAABpaHcAAKSh3QEAkGZE2r36zme3dSbTTpK7fxfTVwAAAIUrf7tXz9vaZZX6wTeefLBx4Uv7kr3b5unr5O/Xm7qTXdvnGMsBABh7yt7uN73WmU4nd8z9prfkvxc98YC5Wr5WJNLpJO0OAMAItHtsXWc63bn6Kn151VWzVx/0Jut7E6tnVVeNn7s9mU63x+0Vgp/j7el0ct/2g4PWmoOdmx+utqvdm+ffMVffMgAAY0y5233ejmQ6aU7FT4sfHEwPJlb/bFrNf85df3Qwfb5tYZZ2Tyfbltwba3x+3/l0+qC9AmN3AAA85W73O9/qSqcTcX15PJFOd7/V6P66qG3QqurM7e5dH1g/d226k3YHAEBR7nav+nXbYDrd+WpDeLnV7p3rprm/Ou3+YOPmrhza3fmZdgcAwFP2dncm4dODne/FF97T+MDi19p2v/HA+GlWT6sz8/YX6eMH0+nz++Izp8UWbbM+k8/S7tYFweC+Z//NeDgAAMac8rf7uKqrGp/Z0Zn8zP4W3GeDyf1xa2q99pHNx91v1Q2eanvhFnvNOW90nreXHN9n/X18lna/au526+/s0smts/WHAwBgjBmJdgcAAKVEuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANMVs96mEEEIIqYAUs90BAEAloN0BAJCGdgcAQBraHQAAaWh3AACkod0BAJCGdgcAQBraHQAAaWh3AACkGfF2b7izsdpYCAAACjfC7f4fyxKDg4nVwy34uduTaSfJHXPNhYkV3porEt562+YFd497SxNxZ8mcbe5dQ6u5a3pbi3pQf/v+poINJrfPUTcFAECpjHC7V42vfmBd57ALPh53Gzee8Eo03p5Ot8ethVaz2l2rVGy83a/k4C4eq7adCldWs8zbYfW52+5ztm1Xat5df4d3NbAi4V0Z2BcByUQiSbsDAMpkxNvdKvg7Xy3KCN4Sb3eKdu52pU3dhSsSbt87TW+377wdSbW/bfGEP/JW7zI+nkhu2+5uP/JBFd72vSWh/QEAoKQqod2LWPB+MYdG5M4Q3Bp5q+1urxlvT27f4U2nu7eGxu5+bTs/RxR5ZHOHLgsyrAMAQGlIaXf3A+/g0+7w3Lv9sz9F786xJ+LutHkwhe41t/tJfOgDdbutzXYPXTS4Imf7aXcAQJlUQrsPu9oD6rfegu/Kbd+RdBY6H5zbtb0tYZW62ujeLL12EdAeV6fZw+1u3V2f2LeuM8JfqXPXpN0BAGUy4u1elG/VKfQp8QzNGjUWd9o9/Em8NdV/uN29TPBjr5Bts4aolQEAKI0Rbvfi/EXcirg3Vg6NxR1DzJwHX273FqqD7+BWV3A1sCKhj9qtRzdH7f5NtDsAoExGuN2L86/Z+H+ernxS7k/Ch7707q2lFq2/pjqI97ant7Xf7so6dqxH8bfvRH0U2h0AUD4j3u4AAKDIaHcAAKSh3QEAkIZ2BwBAGtodAABpaHcAAKSh3QEAkIZ2BwBAmmK2+xVXfAMAAIy4YrY7AACoBLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIA3tDgCANLQ7AADS0O4AAEhDuwMAIM3/A3ssqe6JXhvCAAAAAElFTkSuQmCC" width="671" height="363" class="img_ev3q"></p>]]></content:encoded>
            <category>security</category>
            <category>powershell</category>
            <category>msgraph</category>
        </item>
        <item>
            <title><![CDATA[Security Disclosure - Secrets Exposure in Microsoft Actionable Messages Admin Portal]]></title>
            <link>https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure</link>
            <guid>https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure</guid>
            <pubDate>Fri, 26 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Secrets exposure vulnerability in the Microsoft Actionable Messages admin portal]]></description>
            <content:encoded><![CDATA[<p>Secrets exposure vulnerability in the Microsoft Actionable Messages admin portal</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="background">Background<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#background" class="hash-link" aria-label="Direct link to Background" title="Direct link to Background" translate="no">​</a></h2>
<p>While developing a PowerShell module to enable sending Actionable Messages from PowerShell to Outlook, I discovered a significant information exposure issue in the Microsoft Actionable Messages admin portal. This post details the journey from initial discovery through disclosure to resolution.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-discovery">The Discovery<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#the-discovery" class="hash-link" aria-label="Direct link to The Discovery" title="Direct link to The Discovery" translate="no">​</a></h2>
<p>To send Actionable Messages, developers must register on the <a href="https://outlook.office.com/connectors/oam/publish" target="_blank" rel="noopener noreferrer" class="">Actionable Email Developer Dashboard</a>. Organizations can choose between two approval scopes:</p>
<ul>
<li class=""><strong>Organization</strong>: Requires approval from the organization's Exchange administrator</li>
<li class=""><strong>Global</strong>: Requires approval from Microsoft</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-vulnerability">The Vulnerability<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#the-vulnerability" class="hash-link" aria-label="Direct link to The Vulnerability" title="Direct link to The Vulnerability" translate="no">​</a></h3>
<p>The issue was found in the admin portal where administrators could search for Microsoft-approved providers:</p>
<p><a href="https://outlook.office.com/connectors/oam/Admin?SearchProviderStatus=ApprovedbyMicrosoft&amp;SearchKeyword=" target="_blank" rel="noopener noreferrer" class="">Actionable Email Developer Dashboard Admin site</a></p>
<p>Any user with <strong>Global Administrator</strong> or <strong>Exchange Administrator</strong> permissions could view detailed information about all approved providers <em>Note that anyone could register their own tenant give themself the permission and see this.</em>, including:</p>
<ul>
<li class="">Friendly Name</li>
<li class="">Provider ID (originator)</li>
<li class="">Organization information (including Tenant ID)</li>
<li class="">Email address of submitter (partially masked)</li>
<li class="">Sender email address</li>
<li class=""><strong>Target URLs</strong> (including full query parameters)</li>
<li class="">Scope of submission</li>
<li class="">Audit history</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem">The Problem<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>While most of this information is reasonable for administrators to see, the critical issue was the <strong>Target URLs</strong> field. This field exposed complete URLs including query parameters that often contained secrets such as API keys, SAS tokens, and signature values:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-logic-app-credentials-exposed">Example: Logic App Credentials Exposed<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#example-logic-app-credentials-exposed" class="hash-link" aria-label="Direct link to Example: Logic App Credentials Exposed" title="Direct link to Example: Logic App Credentials Exposed" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Friendly Name: TimesheetsApproval</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Provider Id: cd8aac59-1e1e-48f9-a9fc-5db88acf31d7</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Target URL: https://prod-132.westeurope.logic.azure.com:443/workflows/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  cc2d84593b344d10bcf06fdfc24f28d8/triggers/manual/paths/invoke?</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  api-version=2016-06-01&amp;sp=%2Ftriggers%2Fmanual%2Frun&amp;sv=1.0&amp;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  sig=A_SUPER_SECRET_KEY_WAS_WRITTEN_HERE</span><br></div></code></pre></div></div>
<p><em>The above is one example there were multiple available be it internally developed apps with secrets in the url or other Microsoft services other than logic apps</em></p>
<p>The exposed signature keys (<code>sig</code> parameter) allowed anyone to:</p>
<ul>
<li class="">Send POST requests to these Logic Apps</li>
<li class="">Potentially run up costs for the affected organizations</li>
<li class="">Inject malicious payloads depending on Logic App implementation</li>
<li class="">Trigger unintended workflows</li>
</ul>
<p>Before 23.rd december:
<img decoding="async" loading="lazy" alt="Full target url with exposed sig key" src="https://mynster-it.dk/assets/images/2025-12-26-ActionableMessagesSecurityDisclosure-timesheetapproval-e91a0bb5767927e73f36f4fcb2f30fd6.png" width="963" height="1111" class="img_ev3q"></p>
<p>After 23.rd december:
<img decoding="async" loading="lazy" alt="Remediated only showing the host uri" src="https://mynster-it.dk/assets/images/2025-12-26-ActionableMessagesSecurityDisclosure-timesheetapprovalAfter-f564408efc7b0980600435184de3d951.png" width="857" height="1115" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="attack-vectors">Attack Vectors<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#attack-vectors" class="hash-link" aria-label="Direct link to Attack Vectors" title="Direct link to Attack Vectors" translate="no">​</a></h2>
<p>The exposed secrets in target URLs enabled several attack vectors be it that some is more unlikely than others:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-cost-amplification">1. Cost Amplification<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#1-cost-amplification" class="hash-link" aria-label="Direct link to 1. Cost Amplification" title="Direct link to 1. Cost Amplification" translate="no">​</a></h3>
<p>Attackers could repeatedly trigger Logic Apps to generate unexpected Azure costs for the affected organizations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-workflow-manipulation">2. Workflow Manipulation<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#2-workflow-manipulation" class="hash-link" aria-label="Direct link to 2. Workflow Manipulation" title="Direct link to 2. Workflow Manipulation" translate="no">​</a></h3>
<p>Depending on Logic App implementation, attackers could inject data that would be processed, potentially causing:</p>
<ul>
<li class="">Unauthorized actions</li>
<li class="">Data manipulation</li>
<li class="">Service disruptions</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-unauthorized-access">3. Unauthorized Access<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#3-unauthorized-access" class="hash-link" aria-label="Direct link to 3. Unauthorized Access" title="Direct link to 3. Unauthorized Access" translate="no">​</a></h3>
<p>Any service using secrets in the target URL could be accessed by anyone with administrator permissions in any Microsoft 365 tenant, bypassing intended access controls.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disclosure-timeline">Disclosure Timeline<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#disclosure-timeline" class="hash-link" aria-label="Direct link to Disclosure Timeline" title="Direct link to Disclosure Timeline" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="august-6-2025---initial-report-to-msrc">August 6, 2025 - Initial Report to MSRC<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#august-6-2025---initial-report-to-msrc" class="hash-link" aria-label="Direct link to August 6, 2025 - Initial Report to MSRC" title="Direct link to August 6, 2025 - Initial Report to MSRC" translate="no">​</a></h3>
<p>Submitted detailed report to Microsoft Security Response Center (MSRC) including:</p>
<ul>
<li class="">Description of the vulnerability</li>
<li class="">Screenshot evidence</li>
<li class="">Potential impact assessment</li>
<li class="">List of affected providers</li>
</ul>
<p><strong>MSRC Case: 100332</strong></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="august-7-2025---case-opened">August 7, 2025 - Case Opened<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#august-7-2025---case-opened" class="hash-link" aria-label="Direct link to August 7, 2025 - Case Opened" title="Direct link to August 7, 2025 - Case Opened" translate="no">​</a></h3>
<p>MSRC acknowledged the report and opened an investigation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="august-26-2025---msrc-assessment">August 26, 2025 - MSRC Assessment<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#august-26-2025---msrc-assessment" class="hash-link" aria-label="Direct link to August 26, 2025 - MSRC Assessment" title="Direct link to August 26, 2025 - MSRC Assessment" translate="no">​</a></h3>
<p>MSRC concluded:
"We consider this a moderate severity as there is a fairly limited attack scope and appears to be more of a privacy issue than a security issue."</p>
<p>The team forwarded the report to the product group for consideration of a future fix.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="august-27-2025---disclosure-discussion">August 27, 2025 - Disclosure Discussion<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#august-27-2025---disclosure-discussion" class="hash-link" aria-label="Direct link to August 27, 2025 - Disclosure Discussion" title="Direct link to August 27, 2025 - Disclosure Discussion" translate="no">​</a></h3>
<p>I inquired whether affected customers would be notified. <em>I never received an answer to this question</em>
MSRC confirmed I was free to disclose publicly and requested a draft for review.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="september-12-2025---draft-submission">September 12, 2025 - Draft Submission<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#september-12-2025---draft-submission" class="hash-link" aria-label="Direct link to September 12, 2025 - Draft Submission" title="Direct link to September 12, 2025 - Draft Submission" translate="no">​</a></h3>
<p>Submitted draft blog post and LinkedIn post with proposed disclosure date of September 23, 2025.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="september-23-2025---postponement">September 23, 2025 - Postponement<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#september-23-2025---postponement" class="hash-link" aria-label="Direct link to September 23, 2025 - Postponement" title="Direct link to September 23, 2025 - Postponement" translate="no">​</a></h3>
<p>After not receiving feedback, I postponed publication to allow MSRC additional review time.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="october-28-2025---support-case-opened">October 28, 2025 - Support Case Opened<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#october-28-2025---support-case-opened" class="hash-link" aria-label="Direct link to October 28, 2025 - Support Case Opened" title="Direct link to October 28, 2025 - Support Case Opened" translate="no">​</a></h3>
<p>Opened Microsoft support case <strong>TrackingID#2510281420002121</strong> to follow up on remediation efforts.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="october-30-2025---product-team-engagement">October 30, 2025 - Product Team Engagement<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#october-30-2025---product-team-engagement" class="hash-link" aria-label="Direct link to October 30, 2025 - Product Team Engagement" title="Direct link to October 30, 2025 - Product Team Engagement" translate="no">​</a></h3>
<p>Support engineer @Microsoft escalated the issue to <strong><a href="mailto:onboardoam@microsoft.com" target="_blank" rel="noopener noreferrer" class="">onboardoam@microsoft.com</a></strong> (OAM Partner Onboarding Support team).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="november-december-2025---implementation">November-December 2025 - Implementation<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#november-december-2025---implementation" class="hash-link" aria-label="Direct link to November-December 2025 - Implementation" title="Direct link to November-December 2025 - Implementation" translate="no">​</a></h3>
<p>The OAM team developed and tested a fix through Microsoft's internal rings.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="december-10-2025---fix-announced">December 10, 2025 - Fix Announced<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#december-10-2025---fix-announced" class="hash-link" aria-label="Direct link to December 10, 2025 - Fix Announced" title="Direct link to December 10, 2025 - Fix Announced" translate="no">​</a></h3>
<p>Microsoft confirmed the fix was ready:
"We now only display the host URI of the target URL to the admins."</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="december-23-2025---rollout-complete">December 23, 2025 - Rollout Complete<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#december-23-2025---rollout-complete" class="hash-link" aria-label="Direct link to December 23, 2025 - Rollout Complete" title="Direct link to December 23, 2025 - Rollout Complete" translate="no">​</a></h3>
<p>The fix was deployed to all customers. The admin portal now shows only the host portion of URLs:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Before: https://prod-132.westeurope.logic.azure.com:443/workflows/...?sig=SECRET</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">After:  https://prod-132.westeurope.logic.azure.com</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="impact-assessment">Impact Assessment<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#impact-assessment" class="hash-link" aria-label="Direct link to Impact Assessment" title="Direct link to Impact Assessment" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="organizations-affected">Organizations Affected<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#organizations-affected" class="hash-link" aria-label="Direct link to Organizations Affected" title="Direct link to Organizations Affected" translate="no">​</a></h3>
<ul>
<li class="">All organizations that registered global-scoped Actionable Message providers</li>
<li class="">Specifically those using Logic apps, Powerapps, Webhooks or other services with API keys in URLs</li>
<li class="">Organizations included Microsoft's internal teams and third-party partners</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-exposed">Data Exposed<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#data-exposed" class="hash-link" aria-label="Direct link to Data Exposed" title="Direct link to Data Exposed" translate="no">​</a></h3>
<p>The primary concern was credentials embedded in target URLs:</p>
<ul>
<li class="">Logic App signature keys (SAS tokens)</li>
<li class="">API keys and secrets in query parameters</li>
<li class="">Complete endpoint URLs revealing internal architecture</li>
</ul>
<p>While other information like organization names and sender emails were also visible, these were considered less sensitive as they served the legitimate purpose of helping administrators identify approved providers.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exposure-window">Exposure Window<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#exposure-window" class="hash-link" aria-label="Direct link to Exposure Window" title="Direct link to Exposure Window" translate="no">​</a></h3>
<p>The vulnerability was present from an unknown date until December 23, 2025. The admin portal was accessible to any user with Global or Exchange Administrator permissions in any Microsoft 365 tenant.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways">Key Takeaways<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#key-takeaways" class="hash-link" aria-label="Direct link to Key Takeaways" title="Direct link to Key Takeaways" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-developers">For Developers<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#for-developers" class="hash-link" aria-label="Direct link to For Developers" title="Direct link to For Developers" translate="no">​</a></h3>
<ol>
<li class=""><strong>Never include secrets in URLs</strong>: Use authentication headers or POST body parameters</li>
<li class=""><strong>Rotate exposed credentials</strong>: If you submitted a provider with secrets in the URL, get in contact with the OAM team and rotate them as soon as possible <em>I heard in my case that it can take up to 14 days to get them rotated with them.</em></li>
<li class=""><strong>Review approval submissions</strong>: Check what information is visible to administrators</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-microsoft---my-personal-opinion">For Microsoft - My personal opinion<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#for-microsoft---my-personal-opinion" class="hash-link" aria-label="Direct link to For Microsoft - My personal opinion" title="Direct link to For Microsoft - My personal opinion" translate="no">​</a></h3>
<ol>
<li class=""><strong>Input validation</strong>: The submission form should reject or warn when URLs contain common secret patterns (sig=, key=, token=, etc.)</li>
<li class=""><strong>Customer notification</strong>: Organizations with exposed credentials should have been proactively notified</li>
<li class=""><strong>Documentation</strong>: Submission guidelines should explicitly warn against including secrets in URLs and recommend authentication headers instead</li>
<li class=""><strong>Display filtering</strong>: Even if secrets are submitted, the admin portal should automatically redact query parameters</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="questions-that-remain">Questions That Remain<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#questions-that-remain" class="hash-link" aria-label="Direct link to Questions That Remain" title="Direct link to Questions That Remain" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="customer-notification">Customer Notification<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#customer-notification" class="hash-link" aria-label="Direct link to Customer Notification" title="Direct link to Customer Notification" translate="no">​</a></h3>
<p>Microsoft has not confirmed whether affected organizations were notified about the exposure. Organizations should proactively:</p>
<ol>
<li class="">Review their Actionable Message provider submissions</li>
<li class="">Rotate any credentials that may have been exposed in collaboration with the OAM team.</li>
<li class="">Review Logic App or other apps exposed through actionable messages for unexpected traffic patterns</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exposure-duration">Exposure Duration<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#exposure-duration" class="hash-link" aria-label="Direct link to Exposure Duration" title="Direct link to Exposure Duration" translate="no">​</a></h3>
<p>The timeline of when this vulnerability was introduced remains unclear. Organizations should consider credentials potentially exposed since submission date.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="recommendations">Recommendations<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#recommendations" class="hash-link" aria-label="Direct link to Recommendations" title="Direct link to Recommendations" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-affected-organizations">For Affected Organizations<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#for-affected-organizations" class="hash-link" aria-label="Direct link to For Affected Organizations" title="Direct link to For Affected Organizations" translate="no">​</a></h3>
<p>Get in contact with the OAM team <strong><a href="mailto:onboardoam@microsoft.com" target="_blank" rel="noopener noreferrer" class="">onboardoam@microsoft.com</a></strong> and agree with them when, what, where you should rotate your secrets.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timeline-summary">Timeline Summary<a href="https://mynster-it.dk/2025/12/26/ActionableMessagesSecurityDisclosure#timeline-summary" class="hash-link" aria-label="Direct link to Timeline Summary" title="Direct link to Timeline Summary" translate="no">​</a></h2>









































<table><thead><tr><th>Date</th><th>Event</th></tr></thead><tbody><tr><td>Aug 6, 2025</td><td>Initial MSRC report submitted</td></tr><tr><td>Aug 26, 2025</td><td>MSRC classified as privacy issue</td></tr><tr><td>Aug 28, 2025</td><td>Approved for public disclosure</td></tr><tr><td>Oct 28, 2025</td><td>Support case opened</td></tr><tr><td>Oct 30, 2025</td><td>Escalated to OAM team</td></tr><tr><td>Dec 10, 2025</td><td>Fix announced</td></tr><tr><td>Dec 23, 2025</td><td>Fix deployed globally</td></tr><tr><td>Dec 26, 2025</td><td>Public disclosure</td></tr></tbody></table>
<hr>]]></content:encoded>
            <category>security</category>
            <category>disclosure</category>
            <category>adaptive cards</category>
            <category>actionable messages</category>
        </item>
        <item>
            <title><![CDATA[Terraform CI/CD with GitHub Actions - Part 7]]></title>
            <link>https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions</link>
            <guid>https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions</guid>
            <pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to implement comprehensive CI/CD pipelines for Terraform using GitHub Actions, with testing, automated plans, and deployment workflows.]]></description>
            <content:encoded><![CDATA[<p>Learn how to implement comprehensive CI/CD pipelines for Terraform using GitHub Actions, with testing, automated plans, and deployment workflows.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform (July 22)</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class=""><strong>Part 7: CI/CD with GitHub Actions</strong> ← <em>You are here</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-enterprise-grade-cicd-pipelines-for-terraform">Building Enterprise-Grade CI/CD Pipelines for Terraform<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#building-enterprise-grade-cicd-pipelines-for-terraform" class="hash-link" aria-label="Direct link to Building Enterprise-Grade CI/CD Pipelines for Terraform" title="Direct link to Building Enterprise-Grade CI/CD Pipelines for Terraform" translate="no">​</a></h2>
<p>Welcome to the final of our comprehensive 7-part series on Terraform for PowerShell developers! Throughout this series, we have gone from basic concepts to enterprise-grade infrastructure management. Now, we'll bring everything together by implementing CI/CD pipelines using GitHub Actions.</p>
<p>As PowerShell professionals who've likely worked with Azure DevOps, Jenkins, or other CI/CD tools, you'll find GitHub Actions provides familiar concepts with modern, cloud-native approaches (Even if you have never touched either i believe you are still able to follow along). In this final part, we'll create pipelines to deploy our terraform configuration.</p>
<p>For this i have created the following repo that you can follow along in while we go through this post.</p>
<p><a href="https://github.com/Mynster9361/TerraformCICD" target="_blank" rel="noopener noreferrer" class="">Terraform CICD</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequicites">Prerequicites<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#prerequicites" class="hash-link" aria-label="Direct link to Prerequicites" title="Direct link to Prerequicites" translate="no">​</a></h2>
<ol>
<li class=""><strong>App registration</strong>: For us to start creating stuff we need an app registration where we are going to use federated credentials</li>
<li class=""><strong>Azure subscription</strong>: For us to start creating stuff we need access to a subscription for this scenario i have given our app contributor access to my subscription</li>
<li class=""><strong>Github Secrets</strong>: Setup you github secrets</li>
<li class=""><strong>Your config</strong>: In the repo i have included code for applying a resource group and a storage account</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-app-registration">1. App registration<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#1-app-registration" class="hash-link" aria-label="Direct link to 1. App registration" title="Direct link to 1. App registration" translate="no">​</a></h3>
<p>Create a new App registration call it something that relates to what you are doing or deployment name maybe your github repo name? (What i am trying to say is the name of the app does not matter to me it only matters for you and your organisation standards)</p>
<p>Once created go to <strong>Certificates &amp; secrets</strong> click on <strong>Federated credentials</strong> and <strong>Add credential</strong></p>

















































<table><thead><tr><th>Option Name</th><th>Input</th></tr></thead><tbody><tr><td>Federated Credential scenario</td><td>GitHub Actions deploying Azure resources</td></tr><tr><td>Issuer</td><td><a href="https://token.actions.githubusercontent.com/" target="_blank" rel="noopener noreferrer" class="">https://token.actions.githubusercontent.com</a></td></tr><tr><td>Organization</td><td>Your github username or your organisation name</td></tr><tr><td>Repository</td><td>Name of your github repository</td></tr><tr><td>Entity type</td><td>Here i chose Branch as i am just working in the Main branch for my example</td></tr><tr><td>GitHub branch name</td><td>Here i wrote main as that is the branch i would like to deploy from</td></tr><tr><td>Subject identifier</td><td><code>repo:{Organization}/{Repository}:ref:refs/heads/main</code></td></tr><tr><td>Name</td><td>This is what will be displayed after the federated credtials has been created in the Federated credentials window</td></tr><tr><td>Description</td><td>This is what will be displayed after the federated credtials has been created in the Federated credentials window</td></tr><tr><td>Audience</td><td>api://AzureADTokenExchange</td></tr></tbody></table>
<p>Done deal now the federated credential is setup specifically to be able to login from the main branch</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-azure-subscription">2. Azure subscription<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#2-azure-subscription" class="hash-link" aria-label="Direct link to 2. Azure subscription" title="Direct link to 2. Azure subscription" translate="no">​</a></h3>
<p>Now lets give the app some RBAC access on a subscription
Go to a subscription you would like to do something in with terraform go to  <strong>Access control (IAM)</strong> click on <strong>Add</strong> and <strong>Add role assignment</strong> and switch to <strong>Privileged administrator roles</strong> and select <strong>Contributor</strong>.
Click <strong>Next</strong> and <strong>Select members</strong> and search for your app registration created in step 1 click <strong>Select</strong> and click <strong>Review + assign</strong> and click <strong>Review + assign</strong> - <em>(Yes you have to click it 2 times)</em></p>
<p>Done deal now the access is in place next up is our github repo</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-github-secrets">3. Github Secrets<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#3-github-secrets" class="hash-link" aria-label="Direct link to 3. Github Secrets" title="Direct link to 3. Github Secrets" translate="no">​</a></h3>
<p>To setup our secrets we will need to gather a bit of data for the implementation i am showing in my example we need the following data:
AZURE_TENANT_ID = <em>Tenant ID</em> Your tenant id can easily be found on the Overview page in the <strong>Microsoft Entra ID</strong> blade in Azure
AZURE_CLIENT_ID = Application (client) ID from our app created in step 1
AZURE_SUBSCRIPTION_ID = The subscription ID of the subscription you gave our app access to in step 2</p>
<p>Finally go to your Github repository click on <strong>Settings</strong> click on <strong>Secrets and variables</strong> and <strong>Actions</strong>
In here Click on <strong>New repository secret</strong> and add each secret with the name it like above so
AZURE_TENANT_ID = <em>Tenant ID</em>
AZURE_CLIENT_ID = <em>Application (client) ID</em>
AZURE_SUBSCRIPTION_ID = <em>Subscription ID</em></p>
<p>Done deal</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-your-config">4. Your config<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#4-your-config" class="hash-link" aria-label="Direct link to 4. Your config" title="Direct link to 4. Your config" translate="no">​</a></h3>
<p>Finally the magic we will create a github action.
This step is quite easy in your repository create a folder called <em>.github</em> within that folder create another folder called <em>workflows</em>
Then within this folder create a file called <em>cicd.yml</em> and paste the following into it:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform CI/CD Pipeline</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">pull_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">permissions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">id-token</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> write</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">contents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> read</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout repository</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v5</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Setup Terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> hashicorp/setup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">terraform@b9cd54a3c349d3f38e8881555d616ced269862dd </span><span class="token comment" style="color:rgb(98, 114, 164)"># v. 3.1.2 - https://github.com/hashicorp/setup-terraform/commit/b9cd54a3c349d3f38e8881555d616ced269862dd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">terraform_wrapper</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Azure Login</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> azure/login@v2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Format Check</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform fmt </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">check</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform init </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Validate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform validate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          terraform test || test_exit_code=$?</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          echo "test_exit_code=${test_exit_code:-0}" &gt;&gt; $GITHUB_OUTPUT</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform plan </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">out=tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform apply </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">approve tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform show apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform show </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">no</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">color</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Destroy</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform destroy </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">approve </span><br></div></code></pre></div></div>
<p>That is it now we have a complete CICD pipeline so lets end the post here.</p>
<p><strong>I am just kidding ofcourse lets go over some of the stuff in this flow</strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lets-get-into-the-setup-and-explain-the-workflow">Lets get into the setup and explain the workflow<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#lets-get-into-the-setup-and-explain-the-workflow" class="hash-link" aria-label="Direct link to Lets get into the setup and explain the workflow" title="Direct link to Lets get into the setup and explain the workflow" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-up-we-are-giving-the-workflow-a-name-this-name-is-what-will-be-shown-in-our-actions-pane-in-github-under-all-workflows">First up we are giving the workflow a name this name is what will be shown in our <strong>Actions</strong> pane in github under <em>All workflows</em><a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#first-up-we-are-giving-the-workflow-a-name-this-name-is-what-will-be-shown-in-our-actions-pane-in-github-under-all-workflows" class="hash-link" aria-label="Direct link to first-up-we-are-giving-the-workflow-a-name-this-name-is-what-will-be-shown-in-our-actions-pane-in-github-under-all-workflows" title="Direct link to first-up-we-are-giving-the-workflow-a-name-this-name-is-what-will-be-shown-in-our-actions-pane-in-github-under-all-workflows" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform CI/CD Pipeline</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="Action TerrafomrCICD" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATsAAACNCAYAAADION0bAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABqxSURBVHhe7d1/XFRl3v/xF+IypA1sidA6wgYLSfmDSuG+DbEWt/uWaVt/bLdhK+a2Srq5lYHFQyNwSZdNWUshE7n3q1FJuCWu7Wjfkvw11TKogZAYBK047cqPdmWyGFbk/uPMwMxhQFA0dT7Px2Mezbmu61zncIi313Wuw+ChvSGgAyGEuMYNUhcIIcS1SMJOCOEWJOyEEG5Bwk4I4RYk7IQQbkHCTgjhFjzk0RMh+s8/4CZuHDYcb29v8PBQV4tLqaOD1tZWvmpupOHUP9S1PZKwE6IfvDQaQn50C+3nzvHNmTO0/buNjg75EbqcPDw88PqeF0OGDsVz0CBqP/+MNqtV3awbmcYK0Q8hP7qF1jYr//znV1jbrBJ034GOjg6stu9Ba5uVkB/dom7ikoSdEH3kH3AT7efO8bXFoq4S35GvLRbaz53DP+AmdVU3EnZC9NGNw4bzzZkz6mLxHfvmzBluHDZcXdyNhJ0QfeTt7U3bv9vUxeI71vbvNmWh6Dwk7IToKw8PuUd3Bero6OjTivgVFXaB01PZYniXLc/GqquEEOKi9CHsZrDlEzP1ZjP15lqKktX1A+fxJQuJjRhD7KLnWK2uFEKIi3D+sIufyZjOe38axv/XSgKdW/TTbDIK93Lo2BEKFjjXVNc3ANB6vJRdzlVCCHFRzht2iTPH4w+0/r2BFoBRE0gMVrfqj/FER4fh76NRV5A75w4CdTrCYpMpVlcKcRVK2PgBRw6Xsn/jHKfytLdKOfJWqlPZlWkOuft7OlcdCS/u4GNTKUf2byD/LeW/CepmV4jzhN0T6G/3BaDmna1UnwEGj2FKcrS6oRCiF9rIBNZPU5de5e57mrmTdTTtfpafTl5Ejbr+CtN72KXrGT8UOFvBh+kvcOgLpTgwYjY9xV3g9FS27PuU6r/Z7/OZqSz9M6mTYfU+M/Xm2YQB4Et0uq3NvjUAJBZ+qmwfKyTRqdcgpqfnU3y0trPP+r/VUln6LusfGePUkgWFVJrN1Js/pWDRDFILP6LSfi6fHaEoQ7X4ETyD1Nf2Ulnbdb71tZ+ya/UM53ZCXLBmmpqHMemR55mkrrqafd8LDRa+rNqNWV13Beol7ILIuMsWJMdL2QxkfFihbAdHk/iAU2MAYjPeZXfOQmJDffEeDK1nrLSeBZ8fhDJ6lG37jMPvsFmVbaeyboJILNzN+gWxhN2ogbO29oM1+PxgDNMzCtmV7ip6vRn76ywSo4Pwsv/e3FB/xj+S7XCvMJbVm7NI/HEYPhpo+Xs11X8/TaunL0E/DHDoS4iL0cLBzSYsgbE8lqRTVwI6HszYxn5TKUcOl3Kk+HVSpuqI/P0OjhzeRlogwFTWv1fKkfdeIg4gfgP7D7/L+vsculn0//j48Afk/kLZfKqglCOm13kKgFTeOlzK1iQgcBartinTa+V421j1P7bzStvGkcMf8M62dzni0JdCp0zLP9pG2nMb2J8UiRYtkUmuprmqr8n0AW9lzEJHJFnvKO11APe9xHuHS3nvxakAPPjyB11f4wDrOeyCHyd6tPK24q8bqQfYUkrFWQB/xkyf7dx+cjbPPzIGH6C1zkCqXkfYLSGE/fC/Sd1VQwuQqg8h7Ja3qQbgNMbfhSht9Mud+3IQmL6JpdG+gJX6XcuJ+6GyT6B+ObvqrIAvYx56hsfVO6LBh1JW287jrse2U38WwJfxP3taafLAL4kN1QBWKjZMZPSEe4idcBthP1tOQckpVX9CXITXn+fNoxA+7VkSVCt8uqQXWPITOJg6jTumPcsuyygeXLQI9n9BEzqCfwr8ZyzB17VhHTaCqECIvGME2q9rKfmLQ0cbyqhr1zJiXCSwiHEj27BaRxD+C2BRCDrqqCqMJO0PTxI3soldGYuY/eiLFFt0xD3xPPM7O9Li01LI7Dt/TOLrXd1PSnuRxyLB9MqTrPjtIiZnmbBgwZQ1gTt+ntHVEIhMfZEl9+lo3J1B4pxF/GF/C7r7nmTlAhPv1zRDQAjTgcjJN6P9pg2/wEh0RBIVpMVSa7okC5Q9hl10crRtullNxR9PKIV1G6mwTWX9x89wmmpOfyRaWaU9c4jchAVsLrPXVLB5/s9I3OTQuM+CePzHY/AGqDOwdP5mbGNLKNtMYraRBoChY4jt9kiMlUNbZrHOdh71RYsxfq689/bxV940tKKM+TQE/cfDTLcvvJRtJmPNdtuGEAPBTM6zhVR9L5K5Sc437+b/5yg0mmDiVu3gyI7niQsEbhhG+F+KqWr2IuT2Oej+Oxi/kybKvw4mfBboQ3RY68rJd+ppG2Wfgy50KrpfjCPkWxOmU1qCI6fy4Nib0XxZh6F+KuN+5EXTX/+XZdtNVJleI2n3caxDbiaqcxRnoar4f6ly7Hp4LKum6TDveJbELeeftOrHBaNpNpGXugPTpybyk3ZT9Y0XIRPmsOuDKpqG3EzEL3ToQ4dTV1qGJSicB5nKzSPaqP3kNXV3A6KHsJtBYnSQ8ramlHV19vITrCtVxmX4TEC/xF4O0cG2APnCxOrO9hdLT6A9l2r2YFRXFxipbkEZxf1AXdlK62nnkuomVcH+DDbvVx538blzIesPmqncl09GvOo+oBADof5Fct434zf5ESKHqOqajSy7cwJ32F+TF5HPDkpqLWh145h/qw7zsRcoq2tDd8sLBP+gjaqPN6g6MZN/rA4CQpgfGQK1Jl6tMeMXGEtUkBZz5TZMtpZWa7NqX6BdXeDA2oYVL4aPCFamn31htdKkLmtvgx0m6r7WMmLcI4SPMFOVVU6tdQThvw9B981xTOova4C4DjvHZ+tCZ/Oh/ca92cyH8cp4DzSMjrVNBx209uFzpS6E1aqE0sA6Qe7sO4hL3YqxRglCn9BY5mX9meIs+S0OMfAOpv6Rg806dA63hA3VZhgWyfyMaYSjI/LhF9icpTyqkv/JF1hHTCJuZCNfvGumqNaM9tZIQjR1lLsIBfO7dZiHjCJugpbaT17DVP4lloBIIgOaqdtvAnZTXge6yU+zakYk4ZFzyJo6Cs2/qjhQoO7NQctBVuyowyvy16xLc3WP3Jmhog5GTCIlYxqRt0WSkDWV8CEWqoyFwGtKaEfHEdxch6H+z9Sd0hI+8WY0J8vIUXc2QFyGnf3ZOuhaVHB6nVXqvMdNIcM29WtoUULOe9QkF/fPLpSBRts/QIHB+u4PM987njAfACstf1dX9l3FH5OJv/s2AictZnOlFdAQ9sAzqG+5CnHxdvCbzSYcPyTKtOwF8k2N6KamsvXwDnJ/FQFfHlcqN5RR1+6F5tsveP9jW5hdr0V7ooo3Hfro9HExdc1eaOxh+Ho5tWjRfmu/v2diReoGDjb7EZe6ga0bnyTa6zhvpi9STYm7O7jiSXJMVkKmPU/uw72P70wrniXH2MjwqankvraBp/7Dm6qCZzvvAeaU18EQLyw1xZgwY6gxo71eS+2xbequBoyLTyp+gqLPnlYeOanZyl13JyuLEw4CM97lQ9sjHxV/nEhc6gnlkY/0aHyAlsrNLH90OUV1AGOYl7eKu/5qv2+3hmLb4yf17yRw16Ndjw8nFn5KarQvtBjJuHUWuUB01l4K4sMAK9V/SuLhJ7Yr5xMxj9yc54gL1ji17zqP0xjTbyPe4V5hZ/81Wwm8OxkeSGX9mApeSLf1CQS+9BEfPhAEVFOgu4elXbsLN3f7+ChOnlT/NIgrwciRgXxyqERd7KT7yM7+bB1QsX9dt6ADqE/dwyHbx3qN+fHTyjN3m5J5yX7/a/Q81h80U/1ZLdV/e5eMuFB8OveuoaFFeRf403ylTbHynJ0rxqTfUnDcPtrK5sO/1VL9WS31hpVK0FkbKF6XrARdf90wltgF2XxYW0vlx3s5dKzWFnTQWraHder2QoirlirsHJ6tO3OIXam2VdhuXqC40nZvLng88ZOx3f+axm82FVP9lW1KO1SDd/tpGsqK2f2+fd9XWLqumHpb4HkP1cAZ1cKBk2KWxv6M1D9VKFPlwRpln7OnaSgzsO6paTy8oafzPI/jR23P1WnwCVR+ha21pYGKPy1nhj7DZdALIa5OLqaxQghXbr8zEvOXZvlMuyuMh4cHuhE6PjlsX2t2rfs0VgjhUmtrK17f81IXi++Y1/e8aG1tVRd3I2EnRB991dzIkKG2G9riijFk6FC+am5UF3cjYSdEHzWc+geegwZxvVarrhLfkeu1WjwHDerTH8uWsBOiH2o//wxvLw033HAjGi8NHn342wdiYHl4eKCxfQ+8vTTUfv6ZuolLskAhxAXwD7iJG4cNV/6qlQTe5dXRQWtrK181N/ZpRGcnYSeEcAsyjRVCuAUJOyGEW5CwE0K4BQk7IYRbkLATQrgFCTshhFuQsBNCuAUJOyGEW5CwE0K4BQk7IYRbkLATQrgFCTshhFuQsBNCuAUJOyGEW5CwE0K4BQk7IYRbkLATQrgFCTshhFuQsBNCuIWLC7sFhVSazRRnqSsWUnDMoTxrL/XHCklUtbr01lBs/pSCBepyO+U8681mKgsXklj4KfX71qgbCSGuARcVdqvnRHOqppqwCVdnQCQWPk50w1YCdTpGz3pFXS2EuIZcRNitYXxoNYfuLqU6VN/L6OnKFRbgS8upGnWxEOIadOFhlzWBsJpSlpLMoRpfxt67UN2iD1TTXWD1PrPTVNJ5armGYrMy7VRee1nd2dLWV6EytXY5bc7aS73ZTHGW0jY+FHyiU6nvaapra9/56jyP/p13YuGnPZyzEOJyueCwWz0hjOrSZACWllbjMza2e7ic1ysUHz3tMA1ew/hQIHRCZyCEBfjajrOGYvNsAowZBOp0BOp0ZBj9iVeFWthYeEmnI/DWWeQ6lJO1l/p4f4zpOmKTXiH+Vh0FNdBizCBQdxvxmxwbO7dXjpeB0X82lYUL+3feCwp5IrqBAts5BxaUOhxECHG5XFjYLShEH1rNoSTbdlIp1T5jiHU1OjqP3PcqaPEPUgJrQRABNUaMLf4ELqBrqpxkG0m2GHnJ4d5a7ixDt+NWG1QhBxBeSGW8P8Z0F6HWg9UTwmgxrnNo/wrxhq5Q7/N5A2AvB5KSWWovFkJcNhcUdon3jsGHMOI7p2azCcOX6DkXsFCx6QSnbIGVeO8YTpXOovgoyrS4c6oMiYH+0HBCFWQ1NLT44h/uVKjiS3R8NKcK+h50sJBAfzhVr1q0qGqgxcefMPp+3myaxej0CsamK9eq+8q1EOJyuICwW0jsWF+qC+zTO9sr3UiLwzSu7+z3/NYQO7aBQ0nKqImxsawO9O9cQMitbwD7SMrJaRqq1GWOTmMsMBIQ35+geYX6BggIdHEfsqWBaujzeYMt8HQ6AnVboV/nIYQYKP0PuwWxjPVxnKLZbCrmaEsY4y/gB1m556dnbIN9NFTMUcagHwtH37ONrpJKqfaJ5onCrgBKLHycaCooPt+IrWoWo9P7F3hLS6vxiX7cYeFiIQVPRcPR4s7RZZ/OO2uvwzFraGixvxdCXE79DrvVc6LxsU/RnNhu2utdrIKeT1Ip1T6+nLIteCgjK198nIIsmVjdVk5Fp3aubKaOrSBDvRDRk02zGF1QTVi886ppj5LuIbCggWjb9LPenMrYoxnOz+P15byrGgiId+4jVv0PhRDikvPQ3hDQoS4UQohrTb9HdkIIcTWSsBNCuAUJOyGEW5CwE0K4BQk7IYRbkLATQrgFCTshhFuQsBNCuAUJOyGEW5CwE0K4BQk7IYRbkLATQrgFCTshhFuQsBNCuAUJOyGEW5CwE0K4BQk7IYRb8IiIjJFPKhZCXPPkY9mFEG5BprFCCLcgYSeEcAsSdkIItyBhJ4RwCxJ2Qgi3IGEnhHALEnZCCLfQ63N23t7X4aXxYpCnJx4eHupqIYS47Do6OjjX3k6btY3W1m/V1T1yGXaenoMYer0Wz8GD1VVCCHHFaD97ljNfW2hvP6eu6sblNFaCTghxNfAcPJih12vVxS51Cztv7+sk6IQQVw3PwYPx9r5OXdxNt7Dz0nipi4QQ4orWl9zqFnaDPD3VRUIIcUXrS251CztZdRVCXG36klvdwk4IIa5FEnZCCLcgYSeEcAsSdkIIt9DvsMszllNe7vplzHtY3fySiHkqj10fX95j9mh0PJlbizGauq6DyZhPMgDpFJWXU74jXb0XkEj+x+WYNid2lujiksjZYcR0xKGvd9aiB+bmGbtdb9P+IvLS4gl36tdZt/2OGCnemkl8kFIf89sijMYiMqer97wQzl/vwPYtxMXpd9jt32XAsNOAYWcZTQBNZbZtA385eEzd/BJI4jcJUeg8T7JnXQopa7eoG1w+d6dTtHkZ+tF+0FzGgZ0GDAfLMFvhfM9061J+QsQQK1Uf5Srb8/LIX/UwMcFeWOpK2LPTwJ6SKpravfDr3MtK7UHb9T9YRpNnCFE/X0b+2+nEOPTdXdd+B+rAb7SepKwkdEBwwHC02uH4ne+EL8Cl7FuI/ur2u7E3DBvmuNmLdIrKZxJS9zbjprkauVwq39Vx1WJYuzuHKSMslOT8ivkbq9QNejnXKDLfyUM/5ABpsY+xPWgx+YWJRHjWYnhuMSm7Tjq0VczNM5IcBSWro5mfby+NYcWOPzAjGKryZzBrdV/2i2Lt7jymBFTx6h2zWKPe4aL09PUKcen9s7lZXeSk3yO73sWQnGfAaJ+GGQ3kzBupVCXkYSwvx7g1h0JjOeXlRaywT3veySNnt4nyciN5CRD1WA5F+01dU6/9hSy7297HTEIAgmd2tocYkl8u6ppKHjFhfLtrquby2PayvEzbscspNxnImRfO3PWGzqmkcesy16OmhIeJGgHWw1t6CLpeTJxNRBCYTVvYDujm/4SIIWAuXuUy6Hp2gLS8EprQEBzR17nil1jPdm0p01z7dbRPQzNJfNnhGjheS0YSv9LhWpuMFKa4vEKqvmHFDuXar30qn2Jb36bdOcy9gL6F6K8BDLuRzM3LZG7UcFr2ZpOSWUBZ+0hiHvsDyZ3/M4N29O20vDqLceOmk2YvDIpAdyiNuHHK6CN8tA4ObWHV8hSy95zE+v1w4p9KR7cvl+eW78EMcGIPKcufI3ef7biTdFgrDeRmZrO9zIJXqJ6kF9OJ6jq0y2Nrx0cx/KNNZL9VhUUzkpjH8nk0uI4tOQWUNIF29AwSH3XoxC7MDy1gPqFMQ/tjRkIEuvYqDuSUADBlxHDAgrlC2e6XnY20ABpt12S3Z+HMSPkdMUFAzSdsVVfbBU0h/oZytuTkYqi0oA3V85vnlHujMb/NJun+EDhewKrl2ew55UX4QyvI6WvWEsKk/7Ly/upstlda0IyIYd5SPQxI30L0bADDbj4zo7RwfDvzl+RieGMVCTurQBPOpF86NDv+dveRUFMJucsNSogBr/56OtOXZFOw00DukjcpswB+I5lyooQ9O09jBWg/jWHnHkpO2I57Yg8p81LIfiOXtHlz2X4cNKFRzJ7ocBxXx655nyUrcsldsYaSLwFNIyUrHyM7bxXz99UCGrQ6510uTiIz7/SDmk/YckJdd6loiVpaTnl5ISseikDbVMar2as6r3c3/yxh/ewUsvOySZm9lbJvQHtLDPHE8/A9IWiaDrBmzioKduayZGMJTfhxe1y8upceNFHyynxWvZFL2jMHMAN+QVEwIH0L0bOBC7uEkQwHGBXPLvv0M8G2Tujwa2uW001dG52FjRgcNsMfyiR/RzHGj02YjiQR1dsN7oeU41r+cYyucdFJTp62AL5oQ7uaujq25bTZ9kNfQosVoI2Wj2yVtU1YHBs7OmXBCvj4zVTX9G6psjBR9n5X2FT96zSgxUdnm/L3h+26Wxrr1DUO7AsUBWQnzycuNoE1+9RtHFga2d61gbVd+R56EY7f9wG/GFbYv8crY5QFFE+NYw+9aKGpyPb2RKvyDxfAgPQtRM8GLuzyT9IIWI+/TcryFKdX1pvqxr2YmMnaFD0RmmNsXZdG2pPZlPSYOMAbynG1N93qMGUdyUhfLdCIubcf6ouRc4Cqb8Bv4nwy4/oaUiNZFhUOTSW8vbGrtOStcsxA+P2/I3G0Y/vzCNKT+WAUWk5Skt/bqnQbTR+lkLJ8Fbn/v6TnEZ2dxrfrWgbp8BkCWK00UUXTv4BTB1ij+h4/l7vHuY9+u5R9CzGQYYeBshormlH3khgbgg/gE3wv8355L8GV6ra9CPbDB4A22iw+hDw4nYjeRnbkcfC4FYKmkLk5k8UPJbJsYy4zRoH1+AFyL9lUMZf1b1Vh8RyJ/vfbKX47j7UrM8l8OZ9d+wtZoW4OMHExMaO6FiY6fZTC1j1NWLURLH7NyK7NOWSuzGRtXhHFu3OY29nQC7+JmWSuzCTz5UKK38pEH2Sltuh3LBnIUB8xiRV5y4h/aDFrX7yPcE/lnA0UsP+YBQKimPfzKEYCBEQx89HZTC7pz8KKK5eybyEGNOxKSHsyC0MN6O5JZNnKTJb9Mgq/lpP0a63yjS38pdICI6aweOUyZg45Tl1vIztOsiYpjVdLGtFE6ElMWUx8lC9NJVtIS8o6/yjmIpSsnsWvMg1UnWrDLzSKKffr0U8Mx8fa6PK4MxKi0HGSsqLuCxGvLplLWv4Bai1e6O6MQX+/ninjdWgsjcrzjABoCJmkR3+/Hv3EYDRfHuDVZ2Yw/bkDTn1dtBMlVA2fwbKURKYEe2E+mM2SZ5RzfvXRFNu1nsnilZlkPnYft7ab+VzdxwW4lH0LcRHP2Yn+mUlOcToxzQXE/U8viwPfKXlOTly9LvNzdqJHj84gys95YUIIcflI2F0uGxOIHBdJgsPChBDi8pFprBDimiDTWCGEcBV2HR3d/ma2EEJc0fqSW93C7lx7u7pICCGuaH3JrW5h12ZtUxcJIcQVrS+51S3sWlu/pf2sw2cACSHEFaz97FlaW79VF3fTLewAznxtkcATQlzx2s+e5czXvf6KVaduj5448va+Di+NF4M8Pfv0R2iFEOJS6+jo4Fx7O23Wtj6N6Ox6DTshhLhWuJzGCiHEtUbCTgjhFiTshBBuQcJOCOEWJOyEEG5Bwk4I4RY8IiJj5NETIcQ1T56zE0K4BZnGCiHcgoSdEMItSNgJIdyChJ0Qwi1I2Akh3IKEnRDCLUjYCSHcgoSdEMIt/B/5zd5rnMrQywAAAABJRU5ErkJggg==" width="315" height="141" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="second-up-we-have-our-trigger-for-our-flow">Second up we have our trigger for our flow<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#second-up-we-have-our-trigger-for-our-flow" class="hash-link" aria-label="Direct link to Second up we have our trigger for our flow" title="Direct link to Second up we have our trigger for our flow" translate="no">​</a></h3>
<p>This piece of code basicly says when there is something new added to a branch named <strong>main</strong> it will run this flow and below that we also add a trigger for when someone makes a (PR or pull request) to our repository then it will start this action</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">branches</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  pull_request</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="third-we-are-setting-up-our-actual-job">Third we are setting up our actual job<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#third-we-are-setting-up-our-actual-job" class="hash-link" aria-label="Direct link to Third we are setting up our actual job" title="Direct link to Third we are setting up our actual job" translate="no">​</a></h3>
<p>In this code we are saying this is a job - our jobs name is terraform (Name is up to you i like to keep it simple).
Then we are defining what our job will run on so which platform for this i have selected ubuntu-latest.</p>
<p>And finaly we are giving our action some extra permissions to our repository it will get an <strong>id-token write</strong> which it needs for our azure login later and it gets a <strong>contents read</strong> permission so it can read what is in our repository</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">permissions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">id-token</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> write</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">contents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> read</span><br></div></code></pre></div></div>
<p>Next we have the exiting part our Steps thing of it like a stairway you take one step at a time
So first we checkout our repository with an action made by github</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout repository</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v5</span><br></div></code></pre></div></div>
<p>Then we install terraform using a pre built action made by hashicorp</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Setup Terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> hashicorp/setup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">terraform@b9cd54a3c349d3f38e8881555d616ced269862dd </span><span class="token comment" style="color:rgb(98, 114, 164)"># v. 3.1.2 - https://github.com/hashicorp/setup-terraform/commit/b9cd54a3c349d3f38e8881555d616ced269862dd</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">terraform_wrapper</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token boolean important">true</span><br></div></code></pre></div></div>
<p>Then we login to Azure using an action made by Microsoft and suppling our secrets from Github that we setup in prereq 3</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Azure Login</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> azure/login@v2</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">with</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">client-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_CLIENT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">tenant-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_TENANT_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token key atrule">subscription-id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> secrets.AZURE_SUBSCRIPTION_ID </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Then we come to the Terraform stuff which makes our whole pipeline
First up we also want to make sure that our terraform code is correctly formated with the <code>terraform fmt -check</code> command
next we initialize our terraform code <em>basicly the same as installing modules before you can run your code</em> with the command <code>terraform init -input=false</code>
Then we validate our configuration with <code>terraform validate</code> so we know that every piece of our code is working as it should</p>
<p>Then we run all our tests by default when running <code>terraform test</code> it will run all files called <em>something.tftest.hcl</em> within a folder called <em>tests</em>
Here we are running 2 commands and it is basicly test our terraform code and if it fails outbut the failure to our github action</p>
<p>Then we run <code>terraform plan</code> so we get to see what our deployment will look like.</p>
<p>And the last step for us is to apply the plan <strong>BUT</strong> we have an if statement and we are looking at a built in variable called <em>github.ref</em> which will return which branch we are in and say that it should only run if the branch we are in is <em>refs/heads/main</em></p>
<p>And finaly since our terraform apply does not output anything other than the creation process we run <code>terraform show -no-color</code> to show what has been created</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Format Check</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform fmt </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">check</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform init </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Validate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform validate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token scalar string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          terraform test || test_exit_code=$?</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token scalar string" style="color:rgb(255, 121, 198)">          echo "test_exit_code=${test_exit_code:-0}" &gt;&gt; $GITHUB_OUTPUT</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform plan </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">out=tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform apply </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">input=false </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">approve tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform show apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform show </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">no</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">color</span><br></div></code></pre></div></div>
<p>Now in my example workflow i also include a destroy at the end just because i have not included any kind of state storage or anything for this CICD workflow so just to cleanup after my self at the end i have added <code>terraform destroy -auto-approve</code> which just deletes the newly created resource again</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Destroy</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">if</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> github.ref == 'refs/heads/main'   </span><span class="token comment" style="color:rgb(98, 114, 164)"># only auto-apply on main</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform destroy </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">auto</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">approve </span><br></div></code></pre></div></div>
<p>Now if you wanted some kind of backend implementation you could just edit your providers.tf file in my example and add a section like this
<em>Note it will require you to create the below resource by hand</em></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backend</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tenant_id</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Your tenant id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">subscription_id</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The subscription id the resources is placed in"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a resource group with a storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Your state config storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">container_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a container within your storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">key</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a primary or secondary key to your storage account the secret can be gotten from Github secrets and injected into the workflow as a variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">use_azuread_auth</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># basicly just for your federated credential authentication</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">use_oidc</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># basicly just for your federated credential authentication</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="now-lets-take-a-closer-look-at-what-is-in-the-repo">Now lets take a closer look at what is in the repo<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#now-lets-take-a-closer-look-at-what-is-in-the-repo" class="hash-link" aria-label="Direct link to Now lets take a closer look at what is in the repo" title="Direct link to Now lets take a closer look at what is in the repo" translate="no">​</a></h2>
<p>Our structure looks like this:</p>
<p><em>Side not i love that you can get AI to create the below structure output for you so it looks pretty</em></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">TerraformCICD/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── .github/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── workflows/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       └── cicd.yml            # GitHub Actions CI/CD workflow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── modules/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── storage-account/        # Modularized storage account</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       ├── main.tf             # Storage account resource definition</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       ├── outputs.tf          # Module outputs</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       └── variables.tf        # Module input variables</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── tests/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── storage_account.tftest.hcl  # Test for storage account module</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── .gitignore                  # Git ignore file</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── LICENSE                     # MIT License</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf                     # Main Terraform configuration</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── providers.tf                # Provider configuration</span><br></div></code></pre></div></div>
<p>First we have our workflow i will not go deeper into this as we already covered it earlier.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="module">Module<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#module" class="hash-link" aria-label="Direct link to Module" title="Direct link to Module" translate="no">​</a></h3>
<p>Then we have a <strong>modules</strong> folder and within this folder we have one called <strong>storage-account</strong></p>
<p>This is a quick module that i have just copy pasted the config directly from the example of creating an azurerm storage account</p>
<p>Reference:
<a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account" target="_blank" rel="noopener noreferrer" class="">Storage account</a></p>
<p>The only thing i have changed is added the <em>variables.tf</em> file and the <em>outputs.tf</em> file and then made the inputs more dynamic in the <em>main.tf</em></p>
<p>Just to elaborate all i did was change the static entries to var.variablename</p>
<p>main.tf:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"storage_account"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.account_tier</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.account_replication_type</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Then we have our outputs file which just lets terraform know what you want to be able to reference and see when this module has created the storage account just for reference if you want to see all available outputs you can scroll down to Attributes Reference
<a href="https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account#attributes-reference" target="_blank" rel="noopener noreferrer" class="">Storage account - Attributes Reference</a></p>
<p>outputs.tf:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The name of the storage account."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.storage_account.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "id" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The ID of the storage account."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.storage_account.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Finally the biggest hurdle when doing stuff like this is properly making sure that your variables file is on point as this is where basicly all validation happens to your parameters.</p>
<p>For this section the only validating i have setup is just based on the values that are possible to select so we fail when providing our parameters instead of first failing when trying to run our plan or apply.</p>
<p>variables.tf:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The name of the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The name of the resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The location of the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "account_tier" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Defines the Tier to use for this storage account. Valid options are Standard and Premium. For BlockBlobStorage and FileStorage accounts only Premium is valid. Changing this forces a new resource to be created."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> contains(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">, var.account_tier)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The account_tier must be either 'Standard' or 'Premium'."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "account_replication_type" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Defines the type of replication to use for this storage account. Valid options are LRS, GRS, RAGRS, ZRS, GZRS and RAGZRS. Changing this forces a new resource to be created when types LRS, GRS and RAGRS are changed to ZRS, GZRS or RAGZRS and vice versa."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> contains(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"GRS"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"RAGRS"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"ZRS"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"GZRS"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"RAGZRS"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">, var.account_replication_type)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The account_replication_type must be one of 'LRS', 'GRS', 'RAGRS', 'ZRS', 'GZRS', or 'RAGZRS'."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "tags" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Tags to assign to the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> map(string)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test">Test<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#test" class="hash-link" aria-label="Direct link to Test" title="Direct link to Test" translate="no">​</a></h3>
<p>Next up we have our test this test is placed in a folder called tests and the file is called <strong>storage_account.tftest.hcl</strong></p>
<p>This is the test that will run when we run <code>terraform test</code> and if there were more those would run aswell
If you need more information on testing take a look at this previous post</p>
<p><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"e4495bdf-ae79-4c1c-bebc-101ac07ba353"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-test-storage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"testtfstoraeacct1234"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"westeurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GetStartedWithTerraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">owner</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Morten"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"create_storage_account"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/storage-account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.account_tier</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.account_replication_type</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tags</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> output.name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account name did not match expected"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="our-deployment">Our deployment<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#our-deployment" class="hash-link" aria-label="Direct link to Our deployment" title="Direct link to Our deployment" translate="no">​</a></h3>
<p>Finally we have our actual deployment this is what is going to be created when running <code>terraform apply</code></p>
<p><strong>providers.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">required_version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;= 1.12.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.43.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.subscription_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><strong>main.tf</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"e4495bdf-ae79-4c1c-bebc-101ac07ba353"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure Subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">rg_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GetStartedWithTerraformPart7"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_name</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"terraformpart7"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">common_tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GetStartedWithTerraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">owner</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Morten"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.rg_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.common_tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage-account" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">                   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/storage-account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.rg.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.rg.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.storage_account_tier</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.storage_account_replication_type</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.common_tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In the main file we are first creating a set of local variables needed for doing a fully automated deployment and it is easier to manage all the diffrent names and such when they are at the top and just get referenced further down as long as you give them appropiate name.</p>
<p>Next up we are creating a resource group just using a normal resource block.</p>
<p>And finaly we are using the module that we have created by first writing <code>module "Some name for this resource" {The config}</code></p>
<p>Then we are referencing the path of the module in a <code>source</code> parameter <em>Note that the module could also be in another repository if you wanted to have a collection of all your modules instead of it all being in a single repo</em> and then just suppling the variables that is defined for that module</p>
<p>And that is it now you have a complete CICD pipeline for deployment.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-complete-journey-recap">The Complete Journey Recap<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#the-complete-journey-recap" class="hash-link" aria-label="Direct link to The Complete Journey Recap" title="Direct link to The Complete Journey Recap" translate="no">​</a></h3>













































<table><thead><tr><th>Part</th><th>Focus</th><th>Key PowerShell → Terraform Transitions</th></tr></thead><tbody><tr><td><strong>Part 1</strong></td><td><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Getting Started</a></td><td>Imperative scripts → Declarative configuration</td></tr><tr><td><strong>Part 2</strong></td><td><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Resources &amp; State</a></td><td>Variables &amp; objects → Terraform variables &amp; data sources</td></tr><tr><td><strong>Part 3</strong></td><td><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Advanced Integration</a></td><td>Hybrid workflows → PowerShell + Terraform synergy</td></tr><tr><td><strong>Part 4</strong></td><td><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">State &amp; Collaboration</a></td><td>Team collaboration &amp; remote state</td></tr><tr><td><strong>Part 5</strong></td><td><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Testing Strategies</a></td><td>Pester testing → Native Terraform testing framework</td></tr><tr><td><strong>Part 6</strong></td><td><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Module Development</a></td><td>PowerShell modules → Terraform modules &amp; composition</td></tr><tr><td><strong>Part 7</strong></td><td><strong>CI/CD Automation</strong></td><td>Manual deployments → Automated pipelines &amp; GitOps</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-enterprise-infrastructure-platform">Your Enterprise Infrastructure Platform<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#your-enterprise-infrastructure-platform" class="hash-link" aria-label="Direct link to Your Enterprise Infrastructure Platform" title="Direct link to Your Enterprise Infrastructure Platform" translate="no">​</a></h3>
<p>By combining everything from this series, you now have the knowledge to build a complete infrastructure automation platform.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="final-thoughts">Final Thoughts<a href="https://mynster-it.dk/2025/09/09/TerraformCICDWithGitHubActions#final-thoughts" class="hash-link" aria-label="Direct link to Final Thoughts" title="Direct link to Final Thoughts" translate="no">​</a></h3>
<p>You've successfully bridged two powerful worlds - the flexibility and familiarity of PowerShell with the declarative power and ecosystem of Terraform. This combination gives you:</p>
<ul>
<li class=""><strong>Best of Both Worlds</strong>: Leverage PowerShell for complex logic while using Terraform for infrastructure management</li>
<li class=""><strong>Career Growth</strong>: Infrastructure as Code skills are increasingly valuable in modern IT organizations</li>
<li class=""><strong>Future-Proofing</strong>: Position yourself and your organization for cloud-native infrastructure management</li>
</ul>
<p>The journey from PowerShell scripter/developer to Terraform practitioner represents more than just learning a new tool - it's about embracing modern infrastructure practices that will serve you and your organization for years to come.</p>
<p>Thank you for reading my blog series i really hope that you got some great takeaways from it and that it advances your abilities and your career!</p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>ci/cd</category>
            <category>github actions</category>
            <category>devops</category>
        </item>
        <item>
            <title><![CDATA[Terraform Modules Deep Dive for PowerShell Developers - Part 6]]></title>
            <link>https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive</link>
            <guid>https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive</guid>
            <pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Master Terraform modules from a PowerShell perspective - learn best practices for creating, structuring, and maintaining reusable infrastructure components.]]></description>
            <content:encoded><![CDATA[<p>Master Terraform modules from a PowerShell perspective - learn best practices for creating, structuring, and maintaining reusable infrastructure components.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><strong>Part 6: Terraform Modules Deep Dive</strong> ← <em>You are here</em></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mastering-terraform-modules-for-powershell-users">Mastering Terraform Modules for PowerShell Users<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#mastering-terraform-modules-for-powershell-users" class="hash-link" aria-label="Direct link to Mastering Terraform Modules for PowerShell Users" title="Direct link to Mastering Terraform Modules for PowerShell Users" translate="no">​</a></h2>
<p>With comprehensive testing strategies from <a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5</a> now mastered, it's time to focus on creating reusable, production-ready infrastructure components. In this part, we'll dive deep into Terraform modules - the equivalent of PowerShell modules for infrastructure code.</p>
<p>As PowerShell professionals, you already understand the power of modularity from building PowerShell modules, functions, and reusable scripts. Terraform modules serve the same purpose for infrastructure code, allowing us to create standardized, testable, and maintainable components. Now that you have testing expertise, we can build modules that are thoroughly validated and enterprise-ready.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-modules-vs-terraform-modules">PowerShell Modules vs. Terraform Modules<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#powershell-modules-vs-terraform-modules" class="hash-link" aria-label="Direct link to PowerShell Modules vs. Terraform Modules" title="Direct link to PowerShell Modules vs. Terraform Modules" translate="no">​</a></h2>
<p>Let's compare the module concepts:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-module-structure">PowerShell Module Structure<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#powershell-module-structure" class="hash-link" aria-label="Direct link to PowerShell Module Structure" title="Direct link to PowerShell Module Structure" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">MyPowerShellModule/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── MyPowerShellModule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">psd1     </span><span class="token comment" style="color:rgb(98, 114, 164)"># Module manifest</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── MyPowerShellModule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">psm1     </span><span class="token comment" style="color:rgb(98, 114, 164)"># Module implementation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── Public/                     </span><span class="token comment" style="color:rgb(98, 114, 164)"># Public functions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzureResource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ps1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzureResource</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ps1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── Private/                    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Private functions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── helpers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ps1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── Tests/                      </span><span class="token comment" style="color:rgb(98, 114, 164)"># Tests for the module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── MyModule</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Tests</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ps1</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-module-structure">Terraform Module Structure<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#terraform-module-structure" class="hash-link" aria-label="Direct link to Terraform Module Structure" title="Direct link to Terraform Module Structure" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">my-terraform-module/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf           # Main module implementation</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── data.tf           # Data sources</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── variables.tf      # Input variables definition</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── outputs.tf        # Output values definition</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── terraform.tf       # Required providers and versions</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── README.md         # Documentation</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── examples/         # Example usage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── basic/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        ├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        └── variables.tf</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-your-first-terraform-module">Creating Your First Terraform Module<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#creating-your-first-terraform-module" class="hash-link" aria-label="Direct link to Creating Your First Terraform Module" title="Direct link to Creating Your First Terraform Module" translate="no">​</a></h2>
<p>Let's create a reusable module for a web application:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create module directory structure</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType Directory </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\modules\resource-group"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\modules\resource-group\main.tf"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\modules\resource-group\variables.tf"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\modules\resource-group\outputs.tf"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\modules\resource-group\terraform.tf"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\main.tf"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-files">Module Files<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#module-files" class="hash-link" aria-label="Direct link to Module Files" title="Direct link to Module Files" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/resource-group/variables.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the web application"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region where resources will be created"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/resource-group/main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/resource-group/outputs.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "id" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Id of the resourcegroup"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.rg.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/resource-group/terraform.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4.41.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">required_version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;= 1.6.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-the-module">Using the Module<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#using-the-module" class="hash-link" aria-label="Direct link to Using the Module" title="Direct link to Using the Module" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource-group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-from-mod"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-design-patterns">Module Design Patterns<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#module-design-patterns" class="hash-link" aria-label="Direct link to Module Design Patterns" title="Direct link to Module Design Patterns" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="input-variables-like-powershell-parameters">Input Variables (Like PowerShell Parameters)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#input-variables-like-powershell-parameters" class="hash-link" aria-label="Direct link to Input Variables (Like PowerShell Parameters)" title="Direct link to Input Variables (Like PowerShell Parameters)" translate="no">​</a></h3>
<p>In PowerShell functions, we use parameters with validation:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[CmdletBinding()]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"westus"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eastus"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"northeurope"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Function logic here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform, we use input variables with validation:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(var.name) &gt; </span><span class="token number">3</span><span class="token plain"> &amp;&amp; length(var.name) &lt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">60</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource group name must be between 4 and 60 characters."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region where resources will be created"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> contains(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"West US"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"North Europe"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">, var.location)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Allowed values are: West US, East US, North Europe, West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nested-modules-like-powershell-functions-calling-other-functions">Nested Modules (Like PowerShell Functions Calling Other Functions)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#nested-modules-like-powershell-functions-calling-other-functions" class="hash-link" aria-label="Direct link to Nested Modules (Like PowerShell Functions Calling Other Functions)" title="Direct link to Nested Modules (Like PowerShell Functions Calling Other Functions)" translate="no">​</a></h3>
<p>In PowerShell, we often have functions that call other functions:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-WebInfrastructure</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$webApp</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-WebApp</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        ResourceGroup = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        StorageAccount = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        WebApp = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$webApp</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform, we use nested modules:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage_account" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/storage_account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mystorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Where the storage_account module might look like:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/storage_account/main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-from-mod"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"../storage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">store"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.resource_group.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.resource_group..location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.resource_group</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.storage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-best-practices">Module Best Practices<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#module-best-practices" class="hash-link" aria-label="Direct link to Module Best Practices" title="Direct link to Module Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-consistent-structure-like-powershell-module-structure">1. Consistent Structure (Like PowerShell Module Structure)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#1-consistent-structure-like-powershell-module-structure" class="hash-link" aria-label="Direct link to 1. Consistent Structure (Like PowerShell Module Structure)" title="Direct link to 1. Consistent Structure (Like PowerShell Module Structure)" translate="no">​</a></h3>
<p>Just as PowerShell modules have a recommended structure, so do Terraform modules:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">module-name/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── README.md           # Documentation</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf             # Main resources</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── data.tf             # Data sources</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── variables.tf        # Input variables</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── outputs.tf          # Output values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── terraform.tf         # Provider requirements</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── examples/           # Example usage</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── basic/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       └── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── test/               # Tests</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── module_test.tftest</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-use-local-values-for-derived-variables-like-powershell-local-variables">2. Use Local Values for Derived Variables (Like PowerShell Local Variables)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#2-use-local-values-for-derived-variables-like-powershell-local-variables" class="hash-link" aria-label="Direct link to 2. Use Local Values for Derived Variables (Like PowerShell Local Variables)" title="Direct link to 2. Use Local Values for Derived Variables (Like PowerShell Local Variables)" translate="no">​</a></h3>
<p>In PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> Deploy-Resources </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroupName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseName</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccountName</span><span class="token plain"> = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseName</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToLower</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-replace</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"[^a-z0-9]"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Use the local variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> lower(replace(</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"/[^a-z0-9]/"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain">))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"../storage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.resource_group.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.resource_group..location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-version-your-modules-like-powershell-module-versioning">3. Version Your Modules (Like PowerShell Module Versioning)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#3-version-your-modules-like-powershell-module-versioning" class="hash-link" aria-label="Direct link to 3. Version Your Modules (Like PowerShell Module Versioning)" title="Direct link to 3. Version Your Modules (Like PowerShell Module Versioning)" translate="no">​</a></h3>
<p>In PowerShell, we version our modules in the manifest:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># MyModule.psd1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ModuleVersion = </span><span class="token string" style="color:rgb(255, 121, 198)">'1.2.0'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform, we can use Git tags for versions and reference them:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"git::https://github.com/myorg/terraform-modules.git//modules/resource-group?ref=v1.2.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Or use the Terraform Registry:</p>
<p><a href="https://registry.terraform.io/browse/modules?provider=azure" target="_blank" rel="noopener noreferrer" class="">Terraform Registry:.</a></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "vnet" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure/vnet/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2.6.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-module-library-like-powershell-gallery">Creating a Module Library (Like PowerShell Gallery)<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#creating-a-module-library-like-powershell-gallery" class="hash-link" aria-label="Direct link to Creating a Module Library (Like PowerShell Gallery)" title="Direct link to Creating a Module Library (Like PowerShell Gallery)" translate="no">​</a></h2>
<p>While PowerShell has the PowerShell Gallery, Terraform has module registries.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="private-module-registry">Private Module Registry<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#private-module-registry" class="hash-link" aria-label="Direct link to Private Module Registry" title="Direct link to Private Module Registry" translate="no">​</a></h3>
<p>For organizations, you can set up:</p>
<ol>
<li class="">Azure DevOps Artifacts</li>
<li class="">GitHub Packages</li>
<li class="">Terraform Cloud Private Registry</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-a-simple-git-based-registry">Setting up a Simple Git-Based Registry<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#setting-up-a-simple-git-based-registry" class="hash-link" aria-label="Direct link to Setting up a Simple Git-Based Registry" title="Direct link to Setting up a Simple Git-Based Registry" translate="no">​</a></h3>
<p>Create a repository structure:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform-modules/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── modules/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── resource-group/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   │   ├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   │   └── ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── storage/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   │   ├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   │   └── ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── network/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       ├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       └── ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── README.md</span><br></div></code></pre></div></div>
<p>Reference modules in your Terraform configurations:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"git::https://github.com/myorg/terraform-modules.git//modules/resource-group?ref=v1.0.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-testing-integration">Module Testing Integration<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#module-testing-integration" class="hash-link" aria-label="Direct link to Module Testing Integration" title="Direct link to Module Testing Integration" translate="no">​</a></h2>
<p>As covered in <a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5</a>, testing is crucial for reliable modules. Here's how to integrate testing into your module development workflow:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-module-structure">Testing Module Structure<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#testing-module-structure" class="hash-link" aria-label="Direct link to Testing Module Structure" title="Direct link to Testing Module Structure" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">modules/resource-group/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── variables.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── outputs.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── terraform.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── README.md</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── examples/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   ├── basic/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   │   └── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   └── advanced/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│       └── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── tests/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── unit.tftest.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── integration.tftest.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── variables.auto.tfvars</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unit-tests-for-modules">Unit Tests for Modules<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#unit-tests-for-modules" class="hash-link" aria-label="Direct link to Unit Tests for Modules" title="Direct link to Unit Tests for Modules" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/storage-account/tests/unit.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mock provider for fast unit testing</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">override_</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mock the resource group that the storage account depends on</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">override_resource</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">target</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.main</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">values</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/subscriptions/test/resourceGroups/test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"teststorageacct"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">replication_type</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Test"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Department</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"IT"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_storage_account_creation"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account name should match input variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.account_tier </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.account_tier</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account tier should match input variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.replication_type</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account replication type should match input variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_blob_properties"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.blob_properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.delete_retention_policy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.days </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Default blob retention policy should be 7 days"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.min_tls_version </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Minimum TLS version should be 1.2 for security"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_output_values"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> output.storage_account_id !</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account ID output should not be empty"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> can(regex(</span><span class="token string" style="color:rgb(255, 121, 198)">"^https://.*\\.blob\\.core\\.windows\\.net/$"</span><span class="token plain">, output.primary_blob_endpoint))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Primary blob endpoint should follow Azure pattern"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-tests-for-modules">Integration Tests for Modules<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#integration-tests-for-modules" class="hash-link" aria-label="Direct link to Integration Tests for Modules" title="Direct link to Integration Tests for Modules" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/storage-account/tests/integration.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integrationtest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integration-test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GRS"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Using geo-redundant storage for integration test</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Integration"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Testing"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">allow_blob_public_access</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">enable_https_traffic_only</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create test resource group first</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"setup_resource_group"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"../examples/prerequisites"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_storage_account_deployment"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">depends_on</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">run.setup_resource_group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.replication_type</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account should use GRS replication as specified"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.allow_blob_public_access </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Public blob access should be disabled for security"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_container_creation"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">depends_on</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">run.test_storage_account_deployment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Test that the containers are created successfully</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(azurerm_storage_container.containers) &gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"At least one storage container should be created"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_container.containers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"data"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"A container named 'data' should exist"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_network_rules"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Test that network rules are properly configured</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.main.network_rules</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.default_action </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deny"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Network rules should deny by default for security"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(azurerm_storage_account.main.network_rules</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.ip_rules) &gt; </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"At least one IP rule should be configured"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-module-testing-helpers">PowerShell Module Testing Helpers<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#powershell-module-testing-helpers" class="hash-link" aria-label="Direct link to PowerShell Module Testing Helpers" title="Direct link to PowerShell Module Testing Helpers" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># scripts/Test-TerraformModule.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Test-TerraformModule</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[CmdletBinding()]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integration"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TestType</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[switch]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Verbose</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Push-Location</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Testing Terraform module: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TestType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"unit"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running unit tests..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> = terraform test tests/unit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tftest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unit tests failed"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"integration"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running integration tests..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> = terraform test tests/integration</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tftest</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Integration tests failed"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Test-TerraformModule</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ModulePath </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TestType </span><span class="token string" style="color:rgb(255, 121, 198)">"unit"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verbose:</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Verbose</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Test-TerraformModule</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ModulePath </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TestType </span><span class="token string" style="color:rgb(255, 121, 198)">"integration"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verbose:</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Verbose</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"All tests passed for module: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulePath</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Module testing failed: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Pop-Location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test all modules in a directory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Test-AllTerraformModules</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulesPath</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integration"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TestType</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"all"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$modules</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-ChildItem</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ModulesPath</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Directory</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$module</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$modules</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Test-TerraformModule</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ModulePath </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$module</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">FullName </span><span class="token operator">-</span><span class="token plain">TestType </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TestType</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> Module = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$module</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Status = </span><span class="token string" style="color:rgb(255, 121, 198)">"Passed"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> Module = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$module</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Status = </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Error = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Exception</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Message </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Summary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`nTest Results Summary:"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Blue</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$color</span><span class="token plain"> = </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Status </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Passed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Green"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Red"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"  </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Module</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Status</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$color</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"    Error: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Error</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Red</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$passed</span><span class="token plain"> = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Status </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Passed"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$total</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`nOverall: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$passed</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$total</span><span class="token string" style="color:rgb(255, 121, 198)"> modules passed"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$passed</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$total</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Green"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Red"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="module-versioning-and-lifecycle-management">Module Versioning and Lifecycle Management<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#module-versioning-and-lifecycle-management" class="hash-link" aria-label="Direct link to Module Versioning and Lifecycle Management" title="Direct link to Module Versioning and Lifecycle Management" translate="no">​</a></h2>
<p>For this i would personally use dependabot to keep watch over new version and automatically create PR's for your module repository.</p>
<p>I will not cover the exact process but i believe this guide from GitHub should cover most circumstances:</p>
<p><a href="https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide#enabling-dependabot-for-your-repository" target="_blank" rel="noopener noreferrer" class="">Enabling dependabot for your repository.</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-and-next-steps">Conclusion and Next Steps<a href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive#conclusion-and-next-steps" class="hash-link" aria-label="Direct link to Conclusion and Next Steps" title="Direct link to Conclusion and Next Steps" translate="no">​</a></h2>
<p>In this sixth part of our PowerShell-to-Terraform series, you've mastered creating enterprise-grade, reusable infrastructure modules:</p>
<p><strong>What We've Accomplished:</strong></p>
<ol>
<li class=""><strong>Module Architecture</strong>: Structured, testable modules following PowerShell development patterns</li>
<li class=""><strong>Testing Integration</strong>: Comprehensive module testing using the native testing framework from Part 5</li>
<li class=""><strong>Lifecycle Management</strong>: Versioning, publishing, and maintaining modules at enterprise scale</li>
</ol>
<p><strong>PowerShell Developer Advantages:</strong>
Your PowerShell module development expertise translates perfectly to Terraform modules:</p>
<ul>
<li class="">Similar project structure and organization principles</li>
<li class="">Familiar parameter validation and input/output patterns</li>
<li class="">Testing approaches that build on your Pester experience</li>
<li class="">Version management strategies that mirror PowerShell Gallery patterns</li>
</ul>
<p><strong>Module Maturity Achieved:</strong></p>















































<table><thead><tr><th><strong>Capability</strong></th><th><strong>PowerShell Modules</strong></th><th><strong>Terraform Modules</strong></th><th><strong>Enterprise Benefits</strong></th></tr></thead><tbody><tr><td><strong>Code Organization</strong></td><td>Functions + Manifests</td><td>Resources + Variables</td><td>Reusable infrastructure patterns</td></tr><tr><td><strong>Parameter Validation</strong></td><td>Parameter attributes</td><td>Variable validation</td><td>Type-safe infrastructure inputs</td></tr><tr><td><strong>Testing</strong></td><td>Pester</td><td><code>.tftest.hcl</code> + Pester</td><td>Automated validation &amp; regression</td></tr><tr><td><strong>Versioning</strong></td><td>Semantic versioning</td><td>Git tags + registries</td><td>Controlled releases &amp; rollbacks</td></tr><tr><td><strong>Distribution</strong></td><td>PowerShell Gallery</td><td>Module registries</td><td>Team sharing &amp; standardization</td></tr><tr><td><strong>Documentation</strong></td><td>Comment-based help</td><td>README + examples</td><td>Self-documenting infrastructure</td></tr></tbody></table>
<p><strong>Advanced Patterns Mastered:</strong></p>
<ul>
<li class=""><strong>Module Factories</strong>: Dynamic infrastructure generation based on configuration</li>
<li class=""><strong>Composition Strategies</strong>: Building complex systems from simple, tested modules</li>
<li class=""><strong>Integration Testing</strong>: End-to-end validation using real infrastructure components</li>
</ul>
<p><strong>Coming Next:</strong>
In Part 7 Terraform CICD With GitHub Actions, our final chapter, we'll bring everything together by implementing comprehensive CI/CD pipelines that automatically test, validate, and deploy your modules and infrastructure using GitHub Actions - creating a complete end-to-end automation workflow.</p>
<p><em>You now have the skills to build and maintain enterprise-grade infrastructure module libraries Congratulations!</em></p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>modules</category>
            <category>infrastructure as code</category>
            <category>iac</category>
            <category>azure</category>
        </item>
        <item>
            <title><![CDATA[Testing Terraform Code for PowerShell Developers - Part 5]]></title>
            <link>https://mynster-it.dk/2025/08/19/TestingTerraformCode</link>
            <guid>https://mynster-it.dk/2025/08/19/TestingTerraformCode</guid>
            <pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Master Terraform's native testing framework from a PowerShell perspective - write reliable infrastructure tests with familiar patterns.]]></description>
            <content:encoded><![CDATA[<p>Master Terraform's native testing framework from a PowerShell perspective - write reliable infrastructure tests with familiar patterns.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><strong>Part 5: Testing Terraform Code</strong> ← <em>You are here</em></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-critical-need-for-infrastructure-testing">The Critical Need for Infrastructure Testing<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#the-critical-need-for-infrastructure-testing" class="hash-link" aria-label="Direct link to The Critical Need for Infrastructure Testing" title="Direct link to The Critical Need for Infrastructure Testing" translate="no">​</a></h2>
<p>With enterprise-grade state management and team collaboration from <a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4</a> now in place, it's time to address one of the most crucial aspects of professional infrastructure management: comprehensive testing.</p>
<p>As PowerShell developers, you understand the importance of testing - but infrastructure testing takes on even greater significance than application testing. A failed PowerShell script might cause inconvenience; failed infrastructure can cost thousands of dollars and impact business operations. The good news? Terraform v1.6+ introduced a <strong>native testing framework</strong> that brings testing directly into the Terraform ecosystem, making it as natural as writing the infrastructure code itself.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-infrastructure-testing-matters-more-than-script-testing">Why Infrastructure Testing Matters More Than Script Testing<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#why-infrastructure-testing-matters-more-than-script-testing" class="hash-link" aria-label="Direct link to Why Infrastructure Testing Matters More Than Script Testing" title="Direct link to Why Infrastructure Testing Matters More Than Script Testing" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell script failure - usually reversible</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-OldFiles</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token namespace">[int]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$DaysOld</span><span class="token plain"> = 30</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Get-ChildItem</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Path</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">LastWriteTime </span><span class="token operator">-lt</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$DaysOld</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># If this fails, we can usually recover files from backup</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform resource creation - has real cost and compliance implications</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_virtual_machine"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"production-vm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">vm_size</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_DS3_v2"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># $200+/month if this runs!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Network, storage, OS configuration...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>The key differences:</p>
<ul>
<li class=""><strong>Financial Impact</strong>: Every resource has a cost</li>
<li class=""><strong>Security Implications</strong>: Misconfigurations can expose data</li>
<li class=""><strong>Compliance Requirements</strong>: Infrastructure must meet regulatory standards</li>
<li class=""><strong>Dependency Complexity</strong>: Infrastructure components are interconnected</li>
<li class=""><strong>Cleanup Difficulty</strong>: Some resources can't be easily deleted</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraforms-native-testing-framework-the-powershell-developers-perspective">Terraform's Native Testing Framework: The PowerShell Developer's Perspective<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#terraforms-native-testing-framework-the-powershell-developers-perspective" class="hash-link" aria-label="Direct link to Terraform's Native Testing Framework: The PowerShell Developer's Perspective" title="Direct link to Terraform's Native Testing Framework: The PowerShell Developer's Perspective" translate="no">​</a></h2>
<p>Terraform v1.6+ introduced a <strong>game-changing native testing framework</strong> that brings testing directly into the Terraform ecosystem. No more external tools, complex setups, or learning new languages - you can now write tests in <code>.tftest.hcl</code> files that integrate seamlessly with your infrastructure code.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-pester-vs-terraform-native-testing">PowerShell Pester vs. Terraform Native Testing<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#powershell-pester-vs-terraform-native-testing" class="hash-link" aria-label="Direct link to PowerShell Pester vs. Terraform Native Testing" title="Direct link to PowerShell Pester vs. Terraform Native Testing" translate="no">​</a></h3>
<p>As PowerShell developers familiar with Pester, you'll recognize many concepts in Terraform's native testing:</p>













































<table><thead><tr><th>Aspect</th><th>PowerShell (Pester)</th><th>Terraform Native Testing</th></tr></thead><tbody><tr><td><strong>Test Files</strong></td><td><code>*.Tests.ps1</code></td><td><code>*.tftest.hcl</code></td></tr><tr><td><strong>Test Organization</strong></td><td><code>Describe</code>/<code>Context</code>/<code>It</code></td><td>Test files with <code>run</code> blocks</td></tr><tr><td><strong>Assertions</strong></td><td><code>Should</code> operators</td><td><code>assert</code> statements</td></tr><tr><td><strong>Setup/Teardown</strong></td><td><code>BeforeEach</code>/<code>AfterEach</code></td><td>Built into <code>run</code> blocks</td></tr><tr><td><strong>Mocking</strong></td><td><code>Mock</code> commands</td><td>Provider <code>override_*</code></td></tr><tr><td><strong>Parallel Execution</strong></td><td><code>-Parallel</code> parameter</td><td>Built-in parallelization</td></tr><tr><td><strong>Integration</strong></td><td>External tool/Module</td><td>Native <code>terraform test</code></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-first-terraform-test">Your First Terraform Test<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#your-first-terraform-test" class="hash-link" aria-label="Direct link to Your First Terraform Test" title="Direct link to Your First Terraform Test" translate="no">​</a></h3>
<p>Let's start with a simple storage account module and see how to test it:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/storage-account/main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> can(regex(</span><span class="token string" style="color:rgb(255, 121, 198)">"^[a-z0-9]{3,24}$"</span><span class="token plain">, var.name))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account name must be between 3 and 24 characters and contain only lowercase letters and numbers."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region for resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "sku" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account SKU"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "tags" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Tags to apply to resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> map(string)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"this"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> split(</span><span class="token string" style="color:rgb(255, 121, 198)">"_"</span><span class="token plain">, var.sku)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> split(</span><span class="token string" style="color:rgb(255, 121, 198)">"_"</span><span class="token plain">, var.sku)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Security configurations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">https_traffic_only_enabled</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">min_tls_version</span><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">allow_nested_items_to_be_public</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">blob_properties</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">versioning_enabled</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">delete_retention_policy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">days</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage_account_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The name of the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "storage_account_id" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The ID of the storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "primary_blob_endpoint" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The endpoint URL for blob storage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.primary_blob_endpoint</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Now let's create our first test file:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/storage-account.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test variables - like parameters in PowerShell functions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"teststorage123"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US 2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sku</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Test"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Purpose</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TerraformTesting"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 1: Validate the plan (like testing function logic without execution)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"validate_storage_account_plan"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account name should match input variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.https_traffic_only_enabled </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"HTTPS traffic only should be enabled for security"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.min_tls_version </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Minimum TLS version should be 1.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 2: Validate variable validation works (like testing parameter validation)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_invalid_name_validation"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Invalid_Name_With_Underscores"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">expect_failures</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 3: Apply and validate actual resource creation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"create_and_validate_storage_account"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.https_traffic_only_enabled </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"HTTPS-only should be enforced on created storage account"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(regexall(</span><span class="token string" style="color:rgb(255, 121, 198)">"^https://.*"</span><span class="token plain">, azurerm_storage_account.this.primary_blob_endpoint)) &gt; </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Blob endpoint should use HTTPS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.blob_properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.versioning_enabled </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Blob versioning should be enabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.blob_properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.delete_retention_policy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.days </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Delete retention should be 7 days"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-your-tests">Running Your Tests<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#running-your-tests" class="hash-link" aria-label="Direct link to Running Your Tests" title="Direct link to Running Your Tests" translate="no">​</a></h3>
<p>Just like running Pester tests with <code>Invoke-Pester</code>, you run Terraform tests with:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Run all tests in the current directory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Run specific test file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><span class="token plain"> tests/storage-account.tftest.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Run tests with verbose output (like Pester -Detailed)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-verbose</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># You can also set the environment variable TF_LOG to get additional output from terraform available options listed here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># https://developer.hashicorp.com/terraform/internals/debugging</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-native-testing-patterns">Advanced Native Testing Patterns<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#advanced-native-testing-patterns" class="hash-link" aria-label="Direct link to Advanced Native Testing Patterns" title="Direct link to Advanced Native Testing Patterns" translate="no">​</a></h2>
<p>Just like testing individual PowerShell functions, we can create focused test scenarios for specific aspects of our infrastructure. Here's how to build comprehensive test suites:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/comprehensive-storage.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US 2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 1: Basic functionality with default values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_default_configuration"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"defaultstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_tier </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Default SKU should result in Standard tier"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Default SKU should result in LRS replication"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 2: Premium storage configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_premium_storage"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"premiumstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">sku</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium_LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_tier </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium SKU should result in Premium tier"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium_LRS should result in LRS replication"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 3: Security configurations are enforced</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_security_defaults"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"securitystoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.https_traffic_only_enabled </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"HTTPS-only traffic must be enabled by default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.min_tls_version </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Minimum TLS version must be 1.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.allow_nested_items_to_be_public </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Public blob access must be disabled by default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 4: Tag inheritance works correctly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_tag_handling"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tagstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Testing"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TerraformSeries"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Owner</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Platform Team"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Environment"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Testing"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment tag should be properly set"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Project"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TerraformSeries"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Project tag should be properly set"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 5: Variable validation catches invalid inputs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_name_validation_failure"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Invalid_Storage_Name_With_Underscores"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">expect_failures</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Test 6: Apply test to verify actual resource creation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_actual_deployment"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"deployteststorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Purpose</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ActualDeploymentTest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> output.storage_account_name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"deployteststorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Output should match the input name"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(regexall(</span><span class="token string" style="color:rgb(255, 121, 198)">"^https://.*"</span><span class="token plain">, output.primary_blob_endpoint)) &gt; </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Blob endpoint should use HTTPS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-mocking-for-fast-unit-tests">Provider Mocking for Fast Unit Tests<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#provider-mocking-for-fast-unit-tests" class="hash-link" aria-label="Direct link to Provider Mocking for Fast Unit Tests" title="Direct link to Provider Mocking for Fast Unit Tests" translate="no">​</a></h3>
<p>One of the most powerful features is the ability to mock providers for lightning-fast unit tests. This is like using <code>Mock</code> in Pester to test logic without external dependencies:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/unit-tests.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Mock the Azure provider for isolated testing</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">mock_</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  mock_resource </span><span class="token string" style="color:rgb(255, 121, 198)">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">defaults</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mockedstorageaccount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">https_traffic_only_enabled</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">min_tls_version</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">primary_blob_endpoint</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://mockedstorageaccount.blob.core.windows.net/"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mockedtest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mock-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_logic_without_azure_calls"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account name should use the variable value"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> split(</span><span class="token string" style="color:rgb(255, 121, 198)">"_"</span><span class="token plain">, var.sku)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_tier</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Account tier should be derived from SKU variable"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_tag_merging_logic"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Test"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">Project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Mock"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Environment"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Test"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Tags should be properly merged"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.tags</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"Project"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Mock"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Custom tags should be applied"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="integration-testing-with-dependencies">Integration Testing with Dependencies<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#integration-testing-with-dependencies" class="hash-link" aria-label="Direct link to Integration Testing with Dependencies" title="Direct link to Integration Testing with Dependencies" translate="no">​</a></h3>
<p>Test how multiple resources work together, similar to integration tests in PowerShell:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/integration.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integration-test"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US 2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"setup_resource_group"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">source</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./tests/fixtures/resource-group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integration-test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_storage_with_real_rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"integrationteststorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> run.setup_resource_group.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> run.setup_resource_group.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.resource_group_name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> run.setup_resource_group.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account should be in the correct resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.location </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> run.setup_resource_group.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account should be in the same location as resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_storage_connectivity"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> apply</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Test that we can actually interact with the storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> can(regex(</span><span class="token string" style="color:rgb(255, 121, 198)">"^https://.*\\.blob\\.core\\.windows\\.net/$"</span><span class="token plain">, output.primary_blob_endpoint))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Blob endpoint should be a valid Azure Storage URL"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="side-by-side-testing-patterns-for-powershell-developers">Side-by-Side Testing Patterns for PowerShell Developers<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#side-by-side-testing-patterns-for-powershell-developers" class="hash-link" aria-label="Direct link to Side-by-Side Testing Patterns for PowerShell Developers" title="Direct link to Side-by-Side Testing Patterns for PowerShell Developers" translate="no">​</a></h2>
<p>As a PowerShell developer moving to Terraform, you'll appreciate seeing direct comparisons between testing approaches. Let's examine how common PowerShell testing patterns translate to Terraform's native testing framework.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-parameter-validation-tests">1. Parameter Validation Tests<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#1-parameter-validation-tests" class="hash-link" aria-label="Direct link to 1. Parameter Validation Tests" title="Direct link to 1. Parameter Validation Tests" translate="no">​</a></h3>
<p><strong>In PowerShell (Pester):</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Storage account name validation in Pester</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Describe </span><span class="token string" style="color:rgb(255, 121, 198)">"New-StorageAccount parameter validation"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Context </span><span class="token string" style="color:rgb(255, 121, 198)">"Name parameter validation"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should reject empty names"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                Should </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cannot validate argument on parameter 'Name'"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should reject names longer than 24 characters"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"thisnameiswaylongerthanthetwentyfourcharacterlimit"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                Should </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cannot validate argument on parameter 'Name'"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should reject names with invalid characters"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"invalid-name-with-dashes"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                Should </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cannot validate argument on parameter 'Name'"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should accept valid boundary cases"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token comment" style="color:rgb(98, 114, 164)"># Minimum valid length</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"abc"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-Not</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Throw</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token comment" style="color:rgb(98, 114, 164)"># Maximum valid length</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"abcdefghijklmnopqrstuvwx"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-Not</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Throw</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><strong>In Terraform:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/validation.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Testing variable validation in Terraform</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_invalid_names"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Test invalid empty name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">expect_failures</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_name_too_long"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"thisnameiswaylongerthanthetwentyfourcharacterlimit"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">expect_failures</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_name_with_special_chars"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"invalid-name-with-dashes"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">expect_failures</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_valid_boundary_cases"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"abc"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Minimum valid length</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US 2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Should proceed without error (implicit test)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-testing-business-logic-and-conditional-behavior">2. Testing Business Logic and Conditional Behavior<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#2-testing-business-logic-and-conditional-behavior" class="hash-link" aria-label="Direct link to 2. Testing Business Logic and Conditional Behavior" title="Direct link to 2. Testing Business Logic and Conditional Behavior" translate="no">​</a></h3>
<p><strong>In PowerShell (Pester):</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Testing environment-specific configurations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Describe </span><span class="token string" style="color:rgb(255, 121, 198)">"Get-StorageAccountConfig"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Context </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment-specific configurations"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should use LRS for development environments"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-StorageAccountConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Environment </span><span class="token string" style="color:rgb(255, 121, 198)">"development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ReplicationType </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-</span><span class="token plain">Be </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should use GRS for production environments"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-StorageAccountConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Environment </span><span class="token string" style="color:rgb(255, 121, 198)">"production"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ReplicationType </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-</span><span class="token plain">Be </span><span class="token string" style="color:rgb(255, 121, 198)">"GRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Context </span><span class="token string" style="color:rgb(255, 121, 198)">"Feature flag configurations"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should enable deletion retention when backup is enabled"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-StorageAccountConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">EnableBackup </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">DeleteRetentionPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Enabled </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-</span><span class="token plain">Be </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">DeleteRetentionPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Days </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-</span><span class="token plain">BeGreaterThan 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        It </span><span class="token string" style="color:rgb(255, 121, 198)">"Should set minimal retention when backup is disabled"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-StorageAccountConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">EnableBackup </span><span class="token boolean">$false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">DeleteRetentionPolicy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Days </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> Should </span><span class="token operator">-</span><span class="token plain">Be 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><strong>In Terraform:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># tests/conditional-logic.tftest.hcl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Testing environment-based configurations</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_environment_configurations"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Test development environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"devstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Development should use LRS for cost savings"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_production_configuration"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prodstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"production"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_storage_account.this.account_replication_type </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Production should use GRS for redundancy"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Testing feature flags</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">run </span><span class="token string" style="color:rgb(255, 121, 198)">"test_backup_configurations"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> plan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variables</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"backupstoragetest"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">enable_backup</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">assert</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(azurerm_storage_account.this.blob_properties</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.delete_retention_policy) &gt; </span><span class="token number">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Backup should be configured when enabled"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-organization-and-best-practices">Test Organization and Best Practices<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#test-organization-and-best-practices" class="hash-link" aria-label="Direct link to Test Organization and Best Practices" title="Direct link to Test Organization and Best Practices" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="test-file-structure">Test File Structure<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#test-file-structure" class="hash-link" aria-label="Direct link to Test File Structure" title="Direct link to Test File Structure" translate="no">​</a></h3>
<p>Organize your tests like you would organize PowerShell test files:</p>
<div class="language-plaintext codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-plaintext codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain"># Your main repo could contain multiple modules so we are just going with the storage accounts as an example</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">modules/storage-account/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">├── variables.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── outputs.tf</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">tests/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── tests/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── storage-account.tftest.hcl # Containing all of your tests for the storage-account test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># If you wanted to you could also have multiple tests and do it a bit more like Pester with unit and integration tests instead so your files/folder could look like this</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">└── tests/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── unit-storage-account.tftest.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    └── integration-storage-account.tftest.hcl</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"># This could allow you to split the tests up further</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cicd-integration">CI/CD Integration<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#cicd-integration" class="hash-link" aria-label="Direct link to CI/CD Integration" title="Direct link to CI/CD Integration" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># .github/workflows/terraform-test.yml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Terraform Tests'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">push</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">permissions</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">contents</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> read </span><span class="token comment" style="color:rgb(98, 114, 164)"># Needed to clone repo</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">jobs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">terraform-tests</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Terraform Tests'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">runs-on</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ubuntu</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">latest</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">steps</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Checkout the repository to the GitHub Actions runner</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Checkout</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> actions/checkout@v5</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Install the latest version of Terraform CLI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Setup Terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">uses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> hashicorp/setup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">terraform@v3</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Initialize a new or existing Terraform working directory, downloading modules, etc.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Checks that all Terraform configuration files adhere to a canonical format</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Format</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform fmt </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">check </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">recursive</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> Terraform Test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> terraform test</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways-for-powershell-developers">Key Takeaways for PowerShell Developers<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#key-takeaways-for-powershell-developers" class="hash-link" aria-label="Direct link to Key Takeaways for PowerShell Developers" title="Direct link to Key Takeaways for PowerShell Developers" translate="no">​</a></h2>
<p>Testing Terraform infrastructure with the native framework represents a significant leap forward in infrastructure reliability and development velocity. As PowerShell professionals transitioning to Terraform, you now have access to testing capabilities that are:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="familiar-yet-powerful">Familiar Yet Powerful<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#familiar-yet-powerful" class="hash-link" aria-label="Direct link to Familiar Yet Powerful" title="Direct link to Familiar Yet Powerful" translate="no">​</a></h3>
<ul>
<li class=""><strong>Native Integration</strong>: No external tools or languages required</li>
<li class=""><strong>Familiar Patterns</strong>: Assertions, mocking, and test organization similar to Pester</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cost-effective-and-safe">Cost-Effective and Safe<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#cost-effective-and-safe" class="hash-link" aria-label="Direct link to Cost-Effective and Safe" title="Direct link to Cost-Effective and Safe" translate="no">​</a></h3>
<ul>
<li class=""><strong>Provider Mocking</strong>: Test logic without creating expensive cloud resources</li>
<li class=""><strong>Automatic Cleanup</strong>: Built-in resource cleanup prevents cost surprises</li>
<li class=""><strong>Fast Feedback</strong>: Unit tests run in seconds, not minutes</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enterprise-ready">Enterprise-Ready<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#enterprise-ready" class="hash-link" aria-label="Direct link to Enterprise-Ready" title="Direct link to Enterprise-Ready" translate="no">​</a></h3>
<ul>
<li class=""><strong>CI/CD Integration</strong>: Native support in all major CI/CD platforms</li>
<li class=""><strong>Parallel Execution</strong>: Tests run concurrently for faster feedback</li>
<li class=""><strong>Comprehensive Coverage</strong>: From unit tests to full integration scenarios</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices-checklist">Best Practices Checklist<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#best-practices-checklist" class="hash-link" aria-label="Direct link to Best Practices Checklist" title="Direct link to Best Practices Checklist" translate="no">​</a></h3>
<p><strong>Start with mocked unit tests</strong> for fast feedback on logic
<strong>Use descriptive test names</strong> that explain what you're testing
<strong>Integrate with CI/CD</strong> for automated testing on every change
<strong>Clean up resources</strong> automatically to control costs</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next?<a href="https://mynster-it.dk/2025/08/19/TestingTerraformCode#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h3>
<p>In Part 6 Terraform Modules DeepDive, we'll explore how to build production-ready Terraform modules that incorporate these testing patterns from the ground up. You'll learn how to structure modules for testability and create reusable infrastructure components that your team can trust.</p>
<p>The combination of Terraform's declarative infrastructure and native testing framework provides PowerShell developers with a robust, familiar, and cost-effective path to infrastructure automation excellence. Your journey from imperative scripts to tested, declarative infrastructure is well underway!</p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>testing</category>
            <category>native-testing</category>
            <category>pester</category>
        </item>
        <item>
            <title><![CDATA[Terraform for PowerShell Scripters - Advanced State Management - Part 4]]></title>
            <link>https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration</link>
            <guid>https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration</guid>
            <pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Master advanced Terraform state management techniques, workspaces, and team collaboration workflows from a PowerShell perspective.]]></description>
            <content:encoded><![CDATA[<p>Master advanced Terraform state management techniques, workspaces, and team collaboration workflows from a PowerShell perspective.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><strong>Part 4: Advanced State Management and Collaboration</strong> ← <em>You are here</em></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enterprise-state-management-and-team-collaboration">Enterprise State Management and Team Collaboration<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#enterprise-state-management-and-team-collaboration" class="hash-link" aria-label="Direct link to Enterprise State Management and Team Collaboration" title="Direct link to Enterprise State Management and Team Collaboration" translate="no">​</a></h2>
<p>Now that you've mastered <a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">advanced Terraform concepts and PowerShell integration</a> from Part 3, it's time to tackle one of the most critical aspects of enterprise Terraform adoption: state management and team collaboration.</p>
<p>As PowerShell professionals, you're likely familiar with the challenges of coordinating automation across teams. Terraform's state management introduces both new challenges and powerful solutions for enterprise-scale infrastructure management. In this part, we'll explore advanced state backends, workspace strategies, and collaboration patterns that enable teams to work safely and efficiently with shared infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-management-refresher">State Management Refresher<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#state-management-refresher" class="hash-link" aria-label="Direct link to State Management Refresher" title="Direct link to State Management Refresher" translate="no">​</a></h2>
<p>As PowerShell users, we're accustomed to working with ephemeral scripts - run them, make changes, run them again. Terraform's state-based approach is fundamentally different:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell: No built-in state tracking</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token string" style="color:rgb(255, 121, 198)">"myRG"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"myStorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$null</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create if it doesn't exist</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token string" style="color:rgb(255, 121, 198)">"myRG"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"myStorage"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token string" style="color:rgb(255, 121, 198)">"WestUS"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">SkuName </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform: Tracks state automatically</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"myStorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"myRG"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-state-beyond-the-basics">Remote State: Beyond the Basics<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#remote-state-beyond-the-basics" class="hash-link" aria-label="Direct link to Remote State: Beyond the Basics" title="Direct link to Remote State: Beyond the Basics" translate="no">​</a></h2>
<p>We briefly covered remote state in Part 3, but let's go deeper into how it works and the advanced options available.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-locking">State Locking<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#state-locking" class="hash-link" aria-label="Direct link to State Locking" title="Direct link to State Locking" translate="no">​</a></h3>
<p>One major issue in team environments is handling concurrent changes. PowerShell doesn't have a built-in mechanism for this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell: No built-in locking for infrastructure changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># You'd need to implement your own with something like:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$lockFile</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"\\fileshare\locks\deployment.lock"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$lockFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deployment in progress by another user!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$lockFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Run your deployment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-Item</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$lockFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Terraform's remote backends handle this automatically through state locking:</p>
<p><strong>State lock basicly means as soon as 1 person is in the midly of an apply or destroy the file gets locked meaning noone else can run it at the same time</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backend</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"terraform-state-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate23942"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">container_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">key</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod.terraform.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># State locking happens automatically</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-backend-configuration">Advanced Backend Configuration<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#advanced-backend-configuration" class="hash-link" aria-label="Direct link to Advanced Backend Configuration" title="Direct link to Advanced Backend Configuration" translate="no">​</a></h3>
<p>Let's explore more options for the Azure backend:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backend</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">use_msi</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain">                                    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Using managed identity</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">use_azuread_auth</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain">                                    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Using Azure Authentication</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tenant_id</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"00000000-0000-0000-0000-000000000000"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Your tenant id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">client_id</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"00000000-0000-0000-0000-000000000000"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Client id from the managed identity</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"abcd1234"</span><span class="token plain">                              </span><span class="token comment" style="color:rgb(98, 114, 164)"># the storage account you want to store you state in</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">container_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain">                               </span><span class="token comment" style="color:rgb(98, 114, 164)"># the container name within the storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">key</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod.terraform.tfstate"</span><span class="token plain">                </span><span class="token comment" style="color:rgb(98, 114, 164)"># The name for your terraform state file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-workspaces-environment-isolation">Terraform Workspaces: Environment Isolation<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#terraform-workspaces-environment-isolation" class="hash-link" aria-label="Direct link to Terraform Workspaces: Environment Isolation" title="Direct link to Terraform Workspaces: Environment Isolation" translate="no">​</a></h2>
<p>In PowerShell, we might handle multiple environments with different scripts or parameters:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Environment-specific PowerShell script</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use parameter to determine configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Content</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".\config.</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Deploy with environment-specific settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">baseName</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">location</span><br></div></code></pre></div></div>
<p>Terraform workspaces provide a built-in way to manage multiple environments:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create and switch to environments</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform workspace new dev</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform workspace new test</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform workspace new prod</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform workspace </span><span class="token function" style="color:rgb(80, 250, 123)">select</span><span class="token plain"> dev</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Apply with workspace-specific configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply</span><br></div></code></pre></div></div>
<p>In your Terraform code, reference the current workspace:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Configuration based on workspace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">env_config</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">dev</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_size</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">test</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_size</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Medium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">prod</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">instance_size</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Large"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Get current configuration based on workspace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">config</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.env_config</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">terraform.workspace</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_linux_virtual_machine"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">count</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.config.instance_count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"vm-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">workspace</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">count</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">index</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">size</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.config.instance_size</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Other configuration...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-migration-and-refactoring">State Migration and Refactoring<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#state-migration-and-refactoring" class="hash-link" aria-label="Direct link to State Migration and Refactoring" title="Direct link to State Migration and Refactoring" translate="no">​</a></h2>
<p>One of the most challenging tasks is refactoring your Terraform code without destroying and recreating resources.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="importing-existing-resources">Importing Existing Resources<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#importing-existing-resources" class="hash-link" aria-label="Direct link to Importing Existing Resources" title="Direct link to Importing Existing Resources" translate="no">​</a></h3>
<p>In PowerShell, you'd typically script around existing resources:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell approach to working with existing resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"existing-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Use existing resource group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"newStorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform, you can import existing resources:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Command to import an existing resource group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform import azurerm_resource_group</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">main </span><span class="token operator">/</span><span class="token plain">subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/existing-rg</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Command to import storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform import azurerm_storage_account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">main </span><span class="token operator">/</span><span class="token plain">subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/existing-rg/providers/Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Storage/storageAccounts/existingStorage</span><br></div></code></pre></div></div>
<p>Then define the resources in your configuration:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"existing-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform now manages this existing resource</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"existingStorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.main.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.main.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="refactoring-with-state-move">Refactoring with State Move<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#refactoring-with-state-move" class="hash-link" aria-label="Direct link to Refactoring with State Move" title="Direct link to Refactoring with State Move" translate="no">​</a></h3>
<p>You can refactor your Terraform configuration without destroying resources:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Move a resource within your state file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state </span><span class="token function" style="color:rgb(80, 250, 123)">mv</span><span class="token plain"> azurerm_storage_account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">old azurerm_storage_account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">new</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Move a resource into a module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state </span><span class="token function" style="color:rgb(80, 250, 123)">mv</span><span class="token plain"> azurerm_storage_account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">example module</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">storage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">azurerm_storage_account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">main</span><br></div></code></pre></div></div>
<p>In PowerShell, this refactoring would require completely different scripts or careful parameter updates.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-management-powershell-helper-functions">State Management PowerShell Helper Functions<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#state-management-powershell-helper-functions" class="hash-link" aria-label="Direct link to State Management PowerShell Helper Functions" title="Direct link to State Management PowerShell Helper Functions" translate="no">​</a></h2>
<p>Here are some PowerShell functions to help with Terraform state management:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Backup-TerraformState</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">".\terraform-state-backups"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"state-</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function operator" style="color:rgb(80, 250, 123)">-</span><span class="token string function" style="color:rgb(80, 250, 123)">Format </span><span class="token string function string" style="color:rgb(255, 121, 198)">'yyyy-MM-dd-HHmmss'</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType Directory </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-Null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Check if state exists</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".\terraform.tfstate"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Copy-Item</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".\terraform.tfstate"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Destination </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token string" style="color:rgb(255, 121, 198)">\</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupName</span><span class="token string" style="color:rgb(255, 121, 198)">.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"State backed up to </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token string" style="color:rgb(255, 121, 198)">\</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupName</span><span class="token string" style="color:rgb(255, 121, 198)">.tfstate"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Warning</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"No local state file found - checking for remote state"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># Pull remote state to a local file for backup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform state pull &gt; </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token string" style="color:rgb(255, 121, 198)">\</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupName</span><span class="token string" style="color:rgb(255, 121, 198)">.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Remote state backed up to </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupPath</span><span class="token string" style="color:rgb(255, 121, 198)">\</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BackupName</span><span class="token string" style="color:rgb(255, 121, 198)">.tfstate"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed to back up remote state"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Get-TerraformStateResource</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceType</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resource</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceType</span><span class="token string" style="color:rgb(255, 121, 198)">.</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> = terraform state show </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resource</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Out-String</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resources</span><span class="token plain"> = terraform state list </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token namespace">[PSCustomObject]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                Resource = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-team-collaboration-patterns">Advanced Team Collaboration Patterns<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#advanced-team-collaboration-patterns" class="hash-link" aria-label="Direct link to Advanced Team Collaboration Patterns" title="Direct link to Advanced Team Collaboration Patterns" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="branch-based-workflow-integration">Branch-Based Workflow Integration<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#branch-based-workflow-integration" class="hash-link" aria-label="Direct link to Branch-Based Workflow Integration" title="Direct link to Branch-Based Workflow Integration" translate="no">​</a></h3>
<p>PowerShell users often work with Git for source control. Here's how to integrate Terraform with branch-based workflows:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># terraform-git-workflow.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-TerraformBranchWorkflow</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"feature"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"develop"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"release"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BranchType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ReleaseVersion</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Determine environment based on branch type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token plain"> = </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BranchType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"feature"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"develop"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"release"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"staging"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Build workspace name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"> = </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BranchType</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"feature"</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"feature-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token string" style="color:rgb(255, 121, 198)">-dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elseif</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BranchType</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"release"</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ReleaseVersion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"release-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ReleaseVersion</span><span class="token string" style="color:rgb(255, 121, 198)">-staging"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BranchType</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Get current Git branch</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentBranch</span><span class="token plain"> = git rev-parse </span><span class="token operator">--</span><span class="token plain">abbrev-ref HEAD</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$gitHash</span><span class="token plain"> = git rev-parse </span><span class="token operator">--</span><span class="token plain">short HEAD</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Git Branch: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$currentBranch</span><span class="token string" style="color:rgb(255, 121, 198)"> (</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$gitHash</span><span class="token string" style="color:rgb(255, 121, 198)">)"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Target Environment: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform Workspace: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create or select workspace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingWorkspaces</span><span class="token plain"> = terraform workspace list </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Trim</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'* '</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"> </span><span class="token operator">-in</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingWorkspaces</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform workspace </span><span class="token function" style="color:rgb(80, 250, 123)">select</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform workspace new </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Apply branch-specific variable file</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"environments/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-not</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Variable file not found: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Add Git metadata to deployment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$gitVars</span><span class="token plain"> = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Git metadata (auto-generated)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">git_branch = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentBranch</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">git_commit = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$gitHash</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">deployed_by = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain">:USERNAME</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">deployment_timestamp = "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Format </span><span class="token string" style="color:rgb(255, 121, 198)">'yyyy-MM-ddTHH:mm:ssZ'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tempVarFile</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"git-vars-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tempVarFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$gitVars</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># Plan with combined variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating Terraform plan..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tempVarFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">out=</span><span class="token string" style="color:rgb(255, 121, 198)">"tfplan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Plan created successfully: tfplan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token comment" style="color:rgb(98, 114, 164)"># For non-production, auto-apply if this is CI/CD</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain">:CI </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Auto-applying in CI/CD for </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)"> environment..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                terraform apply </span><span class="token string" style="color:rgb(255, 121, 198)">"tfplan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Plan ready for review. Apply with: terraform apply tfplan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># Clean up temporary files</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-Item</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tempVarFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ErrorAction SilentlyContinue</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-FeatureBranchInfrastructure</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"feature-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token string" style="color:rgb(255, 121, 198)">-dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Safety check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"This will destroy all infrastructure for feature branch: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Red</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$confirmation</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Read-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Type the feature name to confirm destruction"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$confirmation</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Destruction cancelled"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Switch to feature workspace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform workspace </span><span class="token function" style="color:rgb(80, 250, 123)">select</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Destroy infrastructure</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform destroy </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"environments/dev.tfvars"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">auto-approve</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Delete workspace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform workspace </span><span class="token function" style="color:rgb(80, 250, 123)">select</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform workspace delete </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Feature branch infrastructure destroyed: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$FeatureName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="code-review-integration">Code Review Integration<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#code-review-integration" class="hash-link" aria-label="Direct link to Code Review Integration" title="Direct link to Code Review Integration" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># terraform-pr-validation.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Test-TerraformPullRequest</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TargetBranch</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$OutputFormat</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"markdown"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        ValidationPassed = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Errors = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Warnings = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        PlanSummary = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># 1. Terraform format check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Checking Terraform formatting..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$fmtResult</span><span class="token plain"> = terraform fmt </span><span class="token operator">-</span><span class="token plain">check </span><span class="token operator">-</span><span class="token plain">recursive</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform formatting issues found. Run 'terraform fmt -recursive' to fix."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ValidationPassed = </span><span class="token boolean">$false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># 2. Terraform validation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Validating Terraform configuration..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform init </span><span class="token operator">-</span><span class="token plain">backend=false</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform validate</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform validation failed. Check configuration syntax."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ValidationPassed = </span><span class="token boolean">$false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># 3. Security scan (using Checkov if available)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Command</span><span class="token plain"> checkov </span><span class="token operator">-</span><span class="token plain">ErrorAction SilentlyContinue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running security scan..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$checkovResult</span><span class="token plain"> = checkov </span><span class="token operator">-</span><span class="token plain">d </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"> </span><span class="token operator">--</span><span class="token plain">framework terraform </span><span class="token operator">--</span><span class="token plain">output </span><span class="token function" style="color:rgb(80, 250, 123)">cli</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Warnings </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Security scan found potential issues. Review Checkov output."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># 4. Generate plan for review environments</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reviewEnvironments</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"staging"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reviewEnvironments</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"environments/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Generating plan for </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)"> environment..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planOutput</span><span class="token plain"> = terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"environments/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">out=</span><span class="token string" style="color:rgb(255, 121, 198)">"review-plan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> 2&gt;&amp;1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Parse plan output for summary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planJson</span><span class="token plain"> = terraform show </span><span class="token operator">-</span><span class="token plain">json </span><span class="token string" style="color:rgb(255, 121, 198)">"review-plan-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        Create = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planJson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">resource_changes </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        Update = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planJson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">resource_changes </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        Delete = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planJson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">resource_changes </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"delete"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PlanSummary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Check for dangerous changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$dangerousChanges</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$planJson</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">resource_changes </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"delete"</span><span class="token plain"> </span><span class="token operator">-or</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">change</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">actions </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"delete"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$dangerousChanges</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count </span><span class="token operator">-gt</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Warnings </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Dangerous changes detected in </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)"> environment (resources will be deleted/recreated)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed to generate plan for </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)"> environment"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ValidationPassed = </span><span class="token boolean">$false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># 5. Generate review comment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$OutputFormat</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"markdown"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> = Generate-TerraformPRComment </span><span class="token operator">-</span><span class="token plain">Results </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"terraform-pr-comment.md"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PR comment generated: terraform-pr-comment.md"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unexpected error during validation: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Exception</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Message</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ValidationPassed = </span><span class="token boolean">$false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$results</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> Generate-TerraformPRComment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">## Terraform Plan Review</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">### Validation Results</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ValidationPassed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n✅ **Validation Passed** - No critical issues found`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n❌ **Validation Failed** - Critical issues found`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count </span><span class="token operator">-gt</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n### ❌ Errors`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$error</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Errors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"- </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$error</span><span class="token string" style="color:rgb(255, 121, 198)">`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Warnings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count </span><span class="token operator">-gt</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n### ⚠️ Warnings`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$warning</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Warnings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"- </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$warning</span><span class="token string" style="color:rgb(255, 121, 198)">`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PlanSummary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Count </span><span class="token operator">-gt</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n### 📋 Plan Summary`n`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PlanSummary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Keys</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$plan</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Results</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PlanSummary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"**</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token string" style="color:rgb(255, 121, 198)"> Environment:**`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"- 🆕 Create: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$plan</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Create</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)"> resources`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"- 🔄 Update: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$plan</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Update</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)"> resources`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"- 🗑️ Delete: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$plan</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Delete</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)"> resources`n`n"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"> </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`n---`n*Generated by Terraform PR validation at </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-team-state-isolation">Multi-Team State Isolation<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#multi-team-state-isolation" class="hash-link" aria-label="Direct link to Multi-Team State Isolation" title="Direct link to Multi-Team State Isolation" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># team-state-management.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Initialize-TeamWorkspace</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"platform"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Generate team-specific workspace name</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create team-specific backend configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendKey</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendConfig</span><span class="token plain"> = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">terraform {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  backend "</span><span class="token plain">azurerm</span><span class="token string" style="color:rgb(255, 121, 198)">" {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    resource_group_name  = "</span><span class="token plain">terraform-state-</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token operator">-</span><span class="token plain">rg</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    storage_account_name = "</span><span class="token plain">tfstate</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    container_name       = "</span><span class="token plain">team-</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    key                  = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendKey</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create team-specific directory structure</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"teams/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">!</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType Directory </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token string" style="color:rgb(255, 121, 198)">/backend.tf"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendConfig</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Create team-specific variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamVars</span><span class="token plain"> = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Team: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Type: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">  </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Project: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Environment: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">team_name = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">team_type = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">project = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">environment = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Team-specific resource naming</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">resource_prefix = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token operator">-</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token operator">-</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)"># Team-specific tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">common_tags = {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  Team = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  TeamType = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$TeamType</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  Project = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Project</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  Environment = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  ManagedBy = "</span><span class="token plain">Terraform</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token string" style="color:rgb(255, 121, 198)">/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamVars</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Team workspace initialized: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Directory: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Backend key: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$backendKey</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        WorkspaceName = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$workspaceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        TeamDirectory = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$teamDir</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        BackendKey = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendKey</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Advanced state management is where Terraform truly shines compared to traditional PowerShell scripting approaches. The comprehensive state management capabilities provide enterprise-grade collaboration and governance features that would require significant custom development in PowerShell.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-takeaways-for-powershell-users"><strong>Key Takeaways for PowerShell Users:</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#key-takeaways-for-powershell-users" class="hash-link" aria-label="Direct link to key-takeaways-for-powershell-users" title="Direct link to key-takeaways-for-powershell-users" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-state-security-and-compliance"><strong>1. State Security and Compliance</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#1-state-security-and-compliance" class="hash-link" aria-label="Direct link to 1-state-security-and-compliance" title="Direct link to 1-state-security-and-compliance" translate="no">​</a></h4>
<ul>
<li class=""><strong>Enterprise-grade security</strong>: Terraform state encryption, access controls, and audit trails</li>
<li class=""><strong>PowerShell integration</strong>: Automated compliance reporting and security validation</li>
<li class=""><strong>Best practices</strong>: Treating state files with the same security rigor as production databases</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-advanced-workspace-management"><strong>2. Advanced Workspace Management</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#2-advanced-workspace-management" class="hash-link" aria-label="Direct link to 2-advanced-workspace-management" title="Direct link to 2-advanced-workspace-management" translate="no">​</a></h4>
<ul>
<li class=""><strong>Environment isolation</strong>: Workspaces provide clean separation similar to PowerShell parameter sets</li>
<li class=""><strong>Naming conventions</strong>: Structured approaches that mirror PowerShell function naming</li>
<li class=""><strong>Cross-workspace sharing</strong>: Resource sharing patterns for complex architectures</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-state-migration-and-disaster-recovery"><strong>3. State Migration and Disaster Recovery</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#3-state-migration-and-disaster-recovery" class="hash-link" aria-label="Direct link to 3-state-migration-and-disaster-recovery" title="Direct link to 3-state-migration-and-disaster-recovery" translate="no">​</a></h4>
<ul>
<li class=""><strong>Migration automation</strong>: PowerShell scripts for seamless state transitions</li>
<li class=""><strong>Import strategies</strong>: Bringing existing Azure resources under Terraform management</li>
<li class=""><strong>Backup and recovery</strong>: Automated backup strategies with retention policies</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-team-collaboration-patterns"><strong>4. Team Collaboration Patterns</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#4-team-collaboration-patterns" class="hash-link" aria-label="Direct link to 4-team-collaboration-patterns" title="Direct link to 4-team-collaboration-patterns" translate="no">​</a></h4>
<ul>
<li class=""><strong>Git workflow integration</strong>: Branch-based deployment strategies</li>
<li class=""><strong>Code review automation</strong>: PR validation with security scanning</li>
<li class=""><strong>Multi-team isolation</strong>: Team-specific state management for large organizations</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enterprise-benefits-vs-powershell-scripting"><strong>Enterprise Benefits vs. PowerShell Scripting:</strong><a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#enterprise-benefits-vs-powershell-scripting" class="hash-link" aria-label="Direct link to enterprise-benefits-vs-powershell-scripting" title="Direct link to enterprise-benefits-vs-powershell-scripting" translate="no">​</a></h3>








































<table><thead><tr><th><strong>Capability</strong></th><th><strong>PowerShell Approach</strong></th><th><strong>Terraform + PowerShell Approach</strong></th></tr></thead><tbody><tr><td><strong>State Tracking</strong></td><td>Manual JSON/XML files</td><td>Automatic state with locking</td></tr><tr><td><strong>Team Collaboration</strong></td><td>Shared scripts in Git</td><td>Remote state with workspaces</td></tr><tr><td><strong>Access Control</strong></td><td>Azure RBAC on resources</td><td>Azure RBAC + state-level controls</td></tr><tr><td><strong>Audit Trail</strong></td><td>Activity logs only</td><td>State changes + deployment history</td></tr><tr><td><strong>Disaster Recovery</strong></td><td>Manual backup scripts</td><td>Automated state backup/restore</td></tr><tr><td><strong>Environment Management</strong></td><td>Parameter-based scripts</td><td>Workspace isolation + variables</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-and-next-steps">Conclusion and Next Steps<a href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration#conclusion-and-next-steps" class="hash-link" aria-label="Direct link to Conclusion and Next Steps" title="Direct link to Conclusion and Next Steps" translate="no">​</a></h2>
<p>In this fourth part of our PowerShell-to-Terraform series, you've mastered the enterprise-critical aspects of Terraform state management and team collaboration:</p>
<p><strong>What We've Mastered:</strong></p>
<ol>
<li class=""><strong>Enterprise State Backends</strong>: Secure, scalable remote state with locking mechanisms</li>
<li class=""><strong>Workspace Strategies</strong>: Environment isolation and multi-team collaboration patterns</li>
<li class=""><strong>Security &amp; Compliance</strong>: State encryption, access controls, and audit capabilities</li>
<li class=""><strong>Migration &amp; Recovery</strong>: Automated disaster recovery and state transition workflows</li>
<li class=""><strong>Team Collaboration</strong>: Git workflows, code review processes, and role-based access</li>
</ol>
<p><strong>PowerShell Professional Advantages:</strong>
Your PowerShell expertise enables you to build sophisticated automation around Terraform state management, creating enterprise-grade infrastructure workflows that exceed what either tool could accomplish alone.</p>
<p><strong>Infrastructure Maturity Progression:</strong>
✅ Foundation → ✅ Variables &amp; State → ✅ Advanced Integration → ✅ Enterprise Collaboration → Testing → Modules → CI/CD</p>
<p><strong>Coming Next:</strong>
In Part 5, we'll explore comprehensive testing strategies for Terraform infrastructure - from static analysis to end-to-end testing using both PowerShell patterns you know and Terraform-native testing frameworks.</p>
<p><em>Your infrastructure is now enterprise-ready with proper state management and team collaboration!</em></p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>state management</category>
            <category>remote state</category>
            <category>collaboration</category>
        </item>
        <item>
            <title><![CDATA[Getting Started with Terraform for PowerShell Scripters - Part 3]]></title>
            <link>https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration</link>
            <guid>https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration</guid>
            <pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Advanced Terraform concepts and how to integrate Terraform with your existing PowerShell automation workflows.]]></description>
            <content:encoded><![CDATA[<p>Advanced Terraform concepts and how to integrate Terraform with your existing PowerShell automation workflows.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform</a></li>
<li class=""><strong>Part 3: Advanced Terraform and PowerShell Integration</strong> ← <em>You are here</em></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-terraform-for-powershell-professionals">Advanced Terraform for PowerShell Professionals<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#advanced-terraform-for-powershell-professionals" class="hash-link" aria-label="Direct link to Advanced Terraform for PowerShell Professionals" title="Direct link to Advanced Terraform for PowerShell Professionals" translate="no">​</a></h2>
<p>With the fundamentals of variables, state management, and data sources from <a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2</a> now mastered, it's time to explore the advanced concepts that will make you truly productive with Terraform. In this part, we'll cover modules (Terraform's equivalent to PowerShell modules), loops and conditionals, and most importantly, how to integrate Terraform with your existing PowerShell automation workflows.</p>
<p>As PowerShell professionals, you understand the power of modular, reusable code. Terraform modules work similarly to PowerShell modules but with infrastructure-specific features that enable enterprise-scale automation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-modules-introduction-for-powershell-users">Terraform Modules: Introduction for PowerShell Users<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#terraform-modules-introduction-for-powershell-users" class="hash-link" aria-label="Direct link to Terraform Modules: Introduction for PowerShell Users" title="Direct link to Terraform Modules: Introduction for PowerShell Users" translate="no">​</a></h2>
<p>In PowerShell, we use functions and modules to make code reusable. Here's a simple introduction to Terraform modules:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">New-StandardVM</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Size</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_DS2_v2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># VM creation logic here</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Usage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-StandardVM</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"webserver"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroup </span><span class="token string" style="color:rgb(255, 121, 198)">"prod-rg"</span><br></div></code></pre></div></div>
<p>Terraform modules work similarly - they're reusable sets of Terraform configuration files. Here's a basic example:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># modules/simple-webapp/main.tf (simplified for introduction)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the web application"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource group name"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_service_plan"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-plan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">os_type</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Linux"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sku_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"P1v2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_linux_web_app"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"examplemortenkr"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_service_plan.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">service_plan_id</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_service_plan.example.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">site_config</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># outputs.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "website_url" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">azurerm_linux_web_app</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">example</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">default_hostname</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Using the module:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a resource group for the web application</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OurWebApp-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create the web application using the module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "webapp" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/simple-webapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-webapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "website_url" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.webapp.website_url</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Note:</strong> This is a basic introduction to modules. We'll explore advanced module patterns, testing, versioning, and enterprise strategies in Part 6 of this series.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="loops-and-conditionals">Loops and Conditionals<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#loops-and-conditionals" class="hash-link" aria-label="Direct link to Loops and Conditionals" title="Direct link to Loops and Conditionals" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-each-like-powershell-foreach-object">For Each (Like PowerShell ForEach-Object)<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#for-each-like-powershell-foreach-object" class="hash-link" aria-label="Direct link to For Each (Like PowerShell ForEach-Object)" title="Direct link to For Each (Like PowerShell ForEach-Object)" translate="no">​</a></h3>
<p>In PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgNames</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"rg1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgNames</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_names" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> list(string)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"rg1"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"rg2"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"rg3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">for_each</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> toset(var.resource_group_names)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> each.value</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="count-simple-repeated-resources">Count (Simple Repeated Resources)<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#count-simple-repeated-resources" class="hash-link" aria-label="Direct link to Count (Simple Repeated Resources)" title="Direct link to Count (Simple Repeated Resources)" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create 3 similar storage accounts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">count</span><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"storage</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">count</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">index</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conditional-resources-like-powershell-if-statements">Conditional Resources (Like PowerShell If Statements)<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#conditional-resources-like-powershell-if-statements" class="hash-link" aria-label="Direct link to Conditional Resources (Like PowerShell If Statements)" title="Direct link to Conditional Resources (Like PowerShell If Statements)" translate="no">​</a></h3>
<p>In PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzAppServicePlan</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"plan"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Tier </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Simplified</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzAppServicePlan</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"plan"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Tier </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Simplified</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_app_service_plan"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Other properties...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">sku</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token property">"Standard"</span><span class="token plain"> : </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token property">"S1"</span><span class="token plain"> : </span><span class="token string" style="color:rgb(255, 121, 198)">"B1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="switch">Switch<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#switch" class="hash-link" aria-label="Direct link to Switch" title="Direct link to Switch" translate="no">​</a></h3>
<p>If you wanted to do a similar example to above with a switch instead you could take advantage of the locals variables like shown here</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tier</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$size</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"S1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"staging"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tier</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$size</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"S1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tier</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$size</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"B1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    default </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throw</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unknown environment: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"App Service Plan Tier: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tier</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"App Service Plan Size: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$size</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tiers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">prod</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">staging</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">dev</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sizes</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">prod</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"S1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">staging</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"S1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">dev</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"B1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_app_service_plan"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">sku</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.tiers</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.sizes</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="integrating-terraform-with-powershell">Integrating Terraform with PowerShell<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#integrating-terraform-with-powershell" class="hash-link" aria-label="Direct link to Integrating Terraform with PowerShell" title="Direct link to Integrating Terraform with PowerShell" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-powershell-beforeafter-terraform">Running PowerShell Before/After Terraform<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#running-powershell-beforeafter-terraform" class="hash-link" aria-label="Direct link to Running PowerShell Before/After Terraform" title="Direct link to Running PowerShell Before/After Terraform" translate="no">​</a></h3>
<p>Terraform can't do everything - sometimes you need PowerShell for specific tasks. Here's how to integrate them:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># deployment.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Region</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"westus"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Run Terraform</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running Terraform deployment..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tfResult</span><span class="token plain"> = terraform apply </span><span class="token operator">-</span><span class="token plain">auto-approve </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"environment=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"location=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Region</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$LASTEXITCODE</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> 0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform deployment failed"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">exit</span><span class="token plain"> 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Extract outputs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$websiteUrl</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">raw website_url</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Post-deployment tasks</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Performing post-deployment tasks..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$websiteUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/api/warmup"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-terraform-output-in-powershell">Using Terraform Output in PowerShell<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#using-terraform-output-in-powershell" class="hash-link" aria-label="Direct link to Using Terraform Output in PowerShell" title="Direct link to Using Terraform Output in PowerShell" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all outputs as JSON usefull for larger datasets in the output that you need to work with</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$outputs</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">json </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use specific outputs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccountName</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">raw storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$connectionString</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">raw connection_string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use in further automation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$context</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageContext</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ConnectionString </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$connectionString</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$container</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageContainer</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"data"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Context </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$context</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-local-exec-provisioner">Using local-exec Provisioner<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#using-local-exec-provisioner" class="hash-link" aria-label="Direct link to Using local-exec Provisioner" title="Direct link to Using local-exec Provisioner" translate="no">​</a></h3>
<p>Terraform can run PowerShell commands directly note that when doing this it is no longer following the state of terraform and you will have to implement this your self in the scripts you are running:</p>
<p><strong>Note that this will be run each time you run terraform apply/destroy since it does not follow the state like terraform does</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Storage account configuration...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provisioner</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "local-exec" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pwsh -Command \"New-AzStorageContainer -Name 'data' -Context (New-AzStorageContext -StorageAccountName </span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)"> -StorageAccountKey </span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">self</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">primary_access_key</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">) -Permission Off\""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-example-complete-environment-with-powershell-integration">Practical Example: Complete Environment with PowerShell Integration<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#practical-example-complete-environment-with-powershell-integration" class="hash-link" aria-label="Direct link to Practical Example: Complete Environment with PowerShell Integration" title="Direct link to Practical Example: Complete Environment with PowerShell Integration" translate="no">​</a></h2>
<p>Here's a more complete example that combines Terraform and PowerShell:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf - Terraform configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"app-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "webapp" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/webapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"app-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sku_tier</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token property">"Standard"</span><span class="token plain"> : </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">module</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "database" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">source</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"./modules/database"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"db-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tier</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token property">"GeneralPurpose"</span><span class="token plain"> : </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "website_url" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.webapp.app_url</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "database_connection_string" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> module.database.connection_string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sensitive</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># deploy.ps1 - PowerShell wrapper</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Ensure Azure login</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$account</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzContext</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-not</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$account</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Connect-AzAccount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Run pre-deployment validation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Validating deployment prerequisites..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approval</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Read-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"You're deploying to PRODUCTION. Type 'yes' to confirm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approval</span><span class="token plain"> </span><span class="token operator">-ne</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"yes"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deployment cancelled"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Red</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">exit</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Initialize Terraform</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Plan and apply</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating Terraform plan..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"environment=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"location=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">out=tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Applying Terraform plan..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply tfplan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get outputs for further processing</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deployment completed, processing outputs..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$websiteUrl</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">raw website_url</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$connectionString</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">raw database_connection_string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Post-deployment steps</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Performing post-deployment configuration..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Configure app settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$settings</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"WEBSITE_NODE_DEFAULT_VERSION"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"~16"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"DATABASE_CONNECTION_STRING"</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$connectionString</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"ENVIRONMENT"</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToUpper</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$webAppName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"app-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Set-AzWebApp</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token string" style="color:rgb(255, 121, 198)">"app-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$webAppName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AppSettings </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deployment and configuration complete!"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Website URL: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$websiteUrl</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-advanced-state-management">Introduction to Advanced State Management<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#introduction-to-advanced-state-management" class="hash-link" aria-label="Direct link to Introduction to Advanced State Management" title="Direct link to Introduction to Advanced State Management" translate="no">​</a></h2>
<p>As your Terraform usage grows beyond simple configurations, you'll need to consider remote state for team collaboration. Here's a basic introduction:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-azure-storage-for-remote-state">Using Azure Storage for Remote State<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#using-azure-storage-for-remote-state" class="hash-link" aria-label="Direct link to Using Azure Storage for Remote State" title="Direct link to Using Azure Storage for Remote State" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># backend.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backend</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"terraform-state-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate23942"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">container_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">key</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod.terraform.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<blockquote>
<p><strong>Note:</strong> This is a basic introduction to remote state. For comprehensive coverage of enterprise state management, workspaces, team collaboration patterns, and security considerations, see Part 4: Advanced State Management and Collaboration.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-script-to-set-up-remote-state">PowerShell Script to Set Up Remote State<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#powershell-script-to-set-up-remote-state" class="hash-link" aria-label="Direct link to PowerShell Script to Set Up Remote State" title="Direct link to PowerShell Script to Set Up Remote State" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># setup-terraform-state.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"terraform-state-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"westus"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function" style="color:rgb(80, 250, 123)">Get-Random</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function operator" style="color:rgb(80, 250, 123)">-</span><span class="token string function" style="color:rgb(80, 250, 123)">Minimum 10000 </span><span class="token string function operator" style="color:rgb(80, 250, 123)">-</span><span class="token string function" style="color:rgb(80, 250, 123)">Maximum 99999</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create resource group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                      </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                      </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                      </span><span class="token operator">-</span><span class="token plain">SkuName Standard_LRS `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                      </span><span class="token operator">-</span><span class="token plain">Kind StorageV2 `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                      </span><span class="token operator">-</span><span class="token plain">EnableHttpsTrafficOnly </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create blob container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$context</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Context</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageContainer</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Context </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$context</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Permission Off</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Output configuration for backend.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendConfig</span><span class="token plain"> = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">terraform {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  backend "</span><span class="token plain">azurerm</span><span class="token string" style="color:rgb(255, 121, 198)">" {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    resource_group_name  = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    storage_account_name = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    container_name       = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    key                  = "</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tfstate</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"./backend.tf"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$backendConfig</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform backend configuration created in backend.tf"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource Group: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroup</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage Account: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-and-next-steps">Conclusion and Next Steps<a href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration#conclusion-and-next-steps" class="hash-link" aria-label="Direct link to Conclusion and Next Steps" title="Direct link to Conclusion and Next Steps" translate="no">​</a></h2>
<p>In this third part of our PowerShell-to-Terraform series, you've mastered advanced concepts that bring enterprise-level capabilities to your infrastructure automation:</p>
<p><strong>What We've Achieved:</strong></p>
<ol>
<li class=""><strong>Terraform Modules</strong>: Created reusable infrastructure components (like PowerShell modules)</li>
<li class=""><strong>Advanced Loops</strong>: Used <code>for_each</code> and <code>count</code> for dynamic resource creation</li>
<li class=""><strong>Conditional Logic</strong>: Implemented infrastructure decisions based on variables and data</li>
<li class=""><strong>PowerShell Integration</strong>: Built hybrid automation workflows combining both tools</li>
<li class=""><strong>Error Handling</strong>: Advanced debugging and troubleshooting techniques</li>
<li class=""><strong>Performance Optimization</strong>: Module design patterns for scale and maintainability</li>
</ol>
<p><strong>PowerShell Developer Advantages:</strong>
Now you can leverage your existing PowerShell skills while gaining Terraform's declarative infrastructure benefits. You understand how to:</p>
<ul>
<li class="">Design modular infrastructure like you design PowerShell modules</li>
<li class="">Integrate Terraform into existing PowerShell automation workflows</li>
<li class="">Debug infrastructure issues using familiar PowerShell techniques</li>
<li class="">Scale infrastructure management using proven software development patterns</li>
</ul>
<p><strong>From PowerShell Scripter to Infrastructure Engineer:</strong></p>



































<table><thead><tr><th>PowerShell Concepts</th><th>Terraform Equivalent</th><th>Integration Benefits</th></tr></thead><tbody><tr><td>Functions/Modules</td><td>Terraform Modules</td><td>Reusable infrastructure patterns</td></tr><tr><td>ForEach-Object</td><td>for_each expressions</td><td>Dynamic resource provisioning</td></tr><tr><td>If/Switch statements</td><td>Conditional expressions</td><td>Environment-specific logic</td></tr><tr><td>Error handling</td><td>Provider error management</td><td>Robust deployment workflows</td></tr><tr><td>Debugging</td><td>TF_LOG and plan analysis</td><td>Infrastructure troubleshooting</td></tr></tbody></table>
<p><strong>Infrastructure Maturity Progression:</strong>
✅ Foundation → ✅ Variables &amp; State → ✅ Advanced Integration → Collaboration → Testing → Modules → CI/CD</p>
<p><strong>Coming Next:</strong>
In Part 4, we'll tackle the enterprise challenges of state management and team collaboration - learning how to work with Terraform in team environments, implement proper state backends, and manage infrastructure at scale with multiple contributors.</p>
<p><em>You're now equipped to build complex, modular infrastructure with PowerShell integration!</em></p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>infrastructure as code</category>
            <category>iac</category>
            <category>azure</category>
            <category>modules</category>
            <category>automation</category>
        </item>
        <item>
            <title><![CDATA[Getting Started with Terraform for PowerShell People - Part 2]]></title>
            <link>https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform</link>
            <guid>https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform</guid>
            <pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn about Terraform resources, variables, and state management from a PowerShell perspective, with practical examples.]]></description>
            <content:encoded><![CDATA[<p>Learn about Terraform resources, variables, and state management from a PowerShell perspective, with practical examples.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Part 1: Getting Started with Terraform for PowerShell People</a></li>
<li class=""><strong>Part 2: Resources, Variables, and State in Terraform</strong> ← <em>You are here</em></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="building-flexible-infrastructure-with-powershell-parallels">Building Flexible Infrastructure with PowerShell Parallels<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#building-flexible-infrastructure-with-powershell-parallels" class="hash-link" aria-label="Direct link to Building Flexible Infrastructure with PowerShell Parallels" title="Direct link to Building Flexible Infrastructure with PowerShell Parallels" translate="no">​</a></h2>
<p>Now that you've got your <a class="" href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople">Terraform foundation in place</a> and successfully deployed your first resources, it's time to make your infrastructure code more flexible and maintainable. In this part, we'll explore concepts that will feel familiar from PowerShell development: making code reusable with parameters (variables), returning useful information (outputs), and querying existing resources (data sources).</p>
<p>As PowerShell developers, you already understand the power of parameterized scripts and functions. Terraform variables work similarly but with additional features like type validation and complex data structures that enable robust infrastructure definitions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="terraform-resources-in-depth">Terraform Resources in Depth<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#terraform-resources-in-depth" class="hash-link" aria-label="Direct link to Terraform Resources in Depth" title="Direct link to Terraform Resources in Depth" translate="no">​</a></h2>
<p>In PowerShell, we use cmdlets like <code>New-AzVM</code> or <code>New-AzStorageAccount</code> to create resources. In Terraform, we use resource blocks:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-subscription-id"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example-resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_virtual_network"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example-network"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">address_space</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.0.0/16"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Notice how resources can reference each other - similar to storing outputs in PowerShell variables and using them as inputs to other cmdlets.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resource-dependencies">Resource Dependencies<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#resource-dependencies" class="hash-link" aria-label="Direct link to Resource Dependencies" title="Direct link to Resource Dependencies" translate="no">​</a></h3>
<p>In PowerShell, we manage dependencies explicitly with ordered commands:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell - explicit ordering</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token string" style="color:rgb(255, 121, 198)">"WestEurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$vnet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzVirtualNetwork</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"example-vnet"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Location </span><span class="token operator">-</span><span class="token plain">AddressPrefix </span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.0.0/16"</span><br></div></code></pre></div></div>
<p>In Terraform, dependencies are automatically detected through references:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform - implicit dependency through reference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_virtual_network"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example-network"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># This creates an implicit dependency</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>You can also create explicit dependencies which can be handy when some resources take a long time to create and be in place:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_subnet"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Properties...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">depends_on</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    azurerm_virtual_network.example</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="variables-and-outputs">Variables and Outputs<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#variables-and-outputs" class="hash-link" aria-label="Direct link to Variables and Outputs" title="Direct link to Variables and Outputs" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="variables-in-terraform-like-powershell-parameters">Variables in Terraform (Like PowerShell Parameters)<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#variables-in-terraform-like-powershell-parameters" class="hash-link" aria-label="Direct link to Variables in Terraform (Like PowerShell Parameters)" title="Direct link to Variables in Terraform (Like PowerShell Parameters)" translate="no">​</a></h3>
<p>In PowerShell, we use parameters to make scripts flexible:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroupName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"default-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Westeurope"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>In Terraform, we use input variables:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># variables.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"default-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name of the resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region to deploy resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment (dev, test, prod)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Using variables in your main configuration:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-subscription-id"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">resource_group_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_virtual_network"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example-network"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">address_space</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.0.0/16"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="outputs-like-powershell-return-values">Outputs (Like PowerShell Return Values)<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#outputs-like-powershell-return-values" class="hash-link" aria-label="Direct link to Outputs (Like PowerShell Return Values)" title="Direct link to Outputs (Like PowerShell Return Values)" translate="no">​</a></h3>
<p>In PowerShell, we return values from functions:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> Create-ResourceGroup </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$name</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> = Create-ResourceGroup </span><span class="token operator">-</span><span class="token plain">name </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">location </span><span class="token string" style="color:rgb(255, 121, 198)">"Westeurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceId</span><br></div></code></pre></div></div>
<p>In Terraform, we use output values:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># outputs.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_group_id" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The ID of the resource group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "vnet_address_space" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_virtual_network.example.address_space</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"The address space of the VNet"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>After running <code>terraform apply</code>, the output will be printed like so:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m10s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creation complete after </span><span class="token number">12</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/default-rg-dev</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_virtual_network.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_virtual_network.example: Creation complete after </span><span class="token number">8</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/default-rg-dev/providers/Microsoft.Network/virtualNetworks/example-network</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Apply complete! Resources: </span><span class="token number">2</span><span class="token plain"> added, </span><span class="token number">0</span><span class="token plain"> changed, </span><span class="token number">0</span><span class="token plain"> destroyed.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Outputs:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">resource_group_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/subscriptions/***/resourceGroups/default-rg-dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">vnet_address_space</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> toset(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.0.0/16"</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">)</span><br></div></code></pre></div></div>
<p>you can see outputs with:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform output</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">resource_group_id = "/subscriptions/***/resourceGroups/default-rg-dev"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">vnet_address_space = toset([</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">  "10.0.0.0/16",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">])</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># or for a specific output</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform output resource_group_id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># "/subscriptions/***/resourceGroups/default-rg-dev"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-terraform-state-in-depth">Understanding Terraform State in Depth<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#understanding-terraform-state-in-depth" class="hash-link" aria-label="Direct link to Understanding Terraform State in Depth" title="Direct link to Understanding Terraform State in Depth" translate="no">​</a></h2>
<p>One major difference from PowerShell is that Terraform keeps track of what it has created in a state file. This is crucial for understanding how Terraform works.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-file-contents-and-powershell-comparison">State File Contents and PowerShell Comparison<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#state-file-contents-and-powershell-comparison" class="hash-link" aria-label="Direct link to State File Contents and PowerShell Comparison" title="Direct link to State File Contents and PowerShell Comparison" translate="no">​</a></h3>
<p>In PowerShell, if you want to track deployment state, you might create something like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell manual state tracking</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Timestamp = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ResourceGroupName = </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Location = </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    StorageAccountName = </span><span class="token string" style="color:rgb(255, 121, 198)">"teststorageagjhkunt123"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Must be globally unique</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Resources = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Outputs = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Resources </span><span class="token operator">+=</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"ResourceGroup"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Name = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Id = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Properties = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroup</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># After creating each resource</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StorageAccountName </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Location </span><span class="token operator">-</span><span class="token plain">SkuName Standard_LRS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Resources </span><span class="token operator">+=</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"StorageAccount"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Name = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StorageAccountName</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Id = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Properties = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Save state</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deploymentState</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\deployment-state.json"</span><br></div></code></pre></div></div>
<p>And then you will end up with a long json file like this example <em>truncated</em></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Resources"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ResourceGroup"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Properties"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ResourceGroupName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Location"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"westeurope"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ProvisioningState"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Succeeded"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Tags"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"TagsTable"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ResourceId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/subscriptions/***/resourceGroups/test-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ManagedBy"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/subscriptions/***/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/teststorageagjhkunt123"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"StorageAccount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"teststorageagjhkunt123"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"Properties"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token property">"Removed due to length"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Timestamp"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2025-07-13T13:44:42.577466+02:00"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Location"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"ResourceGroupName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Outputs"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"StorageAccountName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"teststorageagjhkunt123"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Terraform handles this automatically and stores much more detailed information:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"terraform_version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.8.5"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"resources"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"mode"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"managed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"azurerm_storage_account"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"provider"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"provider[\"registry.terraform.io/hashicorp/azurerm\"]"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"instances"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/subscriptions/.../storageAccounts/mystorageaccount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"mystorageaccount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"primary_access_key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"sensitive_key_here"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token comment" style="color:rgb(98, 114, 164)">// ... hundreds of other attributes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-state-configuration">Remote State Configuration<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#remote-state-configuration" class="hash-link" aria-label="Direct link to Remote State Configuration" title="Direct link to Remote State Configuration" translate="no">​</a></h3>
<p>By default, Terraform uses a local <code>terraform.tfstate</code> file, but in team environments, you'll want to use remote state:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># backend.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backend</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstatestorage"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">container_name</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">key</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"project1.tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-remote-state-with-powershell">Setting Up Remote State with PowerShell<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#setting-up-remote-state-with-powershell" class="hash-link" aria-label="Direct link to Setting Up Remote State with PowerShell" title="Direct link to Setting Up Remote State with PowerShell" translate="no">​</a></h3>
<p>Here's a PowerShell script to set up the remote state infrastructure:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># setup-remote-state.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$SubscriptionId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroupName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"terraform-state-rg"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"tfstate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Connect to Azure</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-AzAccount</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Set-AzContext</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">SubscriptionId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$SubscriptionId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create resource group for state storage</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroupName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Created resource group: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$rg</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">ResourceGroupName</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroupName</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">SkuName </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_LRS"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Kind </span><span class="token string" style="color:rgb(255, 121, 198)">"StorageV2"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">EnableHttpsTrafficOnly </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Created storage account: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">StorageAccountName</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ctx</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Context</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$container</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageContainer</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Context </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ctx</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Permission Off</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Created container: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$container</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Name</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Output backend configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"`nAdd this to your backend.tf file:"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">terraform {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  backend "</span><span class="token plain">azurerm</span><span class="token string" style="color:rgb(255, 121, 198)">" {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    resource_group_name  = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceGroupName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    storage_account_name = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$StorageAccountName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    container_name       = "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ContainerName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    key                  = "</span><span class="token plain">terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tfstate</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">  }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@ </span><span class="token operator">-</span><span class="token plain">ForegroundColor Cyan</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="working-with-state-commands">Working with State Commands<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#working-with-state-commands" class="hash-link" aria-label="Direct link to Working with State Commands" title="Direct link to Working with State Commands" translate="no">​</a></h3>
<p>Terraform provides several commands for managing state that are useful for troubleshooting:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># List all resources in the state (like Get-ChildItem for infrastructure)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state list</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Show detailed information about a specific resource (like Get-AzResource with details)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state show </span><span class="token string" style="color:rgb(255, 121, 198)">'azurerm_resource_group.example'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Remove a resource from state without destroying it (like unregistering without deletion)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state </span><span class="token function" style="color:rgb(80, 250, 123)">rm</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'azurerm_resource_group.example'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Move a resource in state (useful for refactoring)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state </span><span class="token function" style="color:rgb(80, 250, 123)">mv</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'azurerm_resource_group.old_name'</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'azurerm_resource_group.new_name'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Pull remote state to local file for inspection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state pull &gt; current-state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">json</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Push local state to remote (use with caution!)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform state push terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tfstate</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="state-inspection-with-powershell">State Inspection with PowerShell<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#state-inspection-with-powershell" class="hash-link" aria-label="Direct link to State Inspection with PowerShell" title="Direct link to State Inspection with PowerShell" translate="no">​</a></h3>
<p>You can also inspect Terraform state using PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Read and analyze Terraform state</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$state</span><span class="token plain"> = terraform output </span><span class="token operator">-</span><span class="token plain">json </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all resource IDs</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceIds</span><span class="token plain"> = terraform state list</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Show resource details</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceIds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform state show </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"---"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Gray</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Export state summary</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stateSummary</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Timestamp = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Resources = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceIds</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceInfo</span><span class="token plain"> = terraform state show </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">json </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stateSummary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Resources </span><span class="token operator">+=</span><span class="token plain"> @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Id = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceInfo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Name = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceInfo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stateSummary</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Set-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"state-summary.json"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-sources-the-terraform-equivalent-of-get--cmdlets">Data Sources: The Terraform Equivalent of Get-* Cmdlets<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#data-sources-the-terraform-equivalent-of-get--cmdlets" class="hash-link" aria-label="Direct link to Data Sources: The Terraform Equivalent of Get-* Cmdlets" title="Direct link to Data Sources: The Terraform Equivalent of Get-* Cmdlets" translate="no">​</a></h2>
<p>In PowerShell, we frequently use <code>Get-*</code> cmdlets to retrieve information about existing resources:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell - querying existing resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingRG</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingVNet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzVirtualNetwork</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-vnet"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingRG</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ResourceGroupName</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use the existing resources in our script</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$subnet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzVirtualNetworkSubnetConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token string" style="color:rgb(255, 121, 198)">"app-subnet"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AddressPrefix </span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.1.0/24"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$existingVNet</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Add-AzVirtualNetworkSubnetConfig</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subnet </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$subnet</span><br></div></code></pre></div></div>
<p>In Terraform, we use data sources to query existing infrastructure:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform - data sources to query existing resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">data </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">data </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_virtual_network"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-vnet"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_resource_group.shared.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use the existing resources in our configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_subnet"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"app"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"app-subnet"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_resource_group.shared.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">virtual_network_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_virtual_network.shared.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">address_prefixes</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.1.0/24"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-data-source-patterns">Common Data Source Patterns<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#common-data-source-patterns" class="hash-link" aria-label="Direct link to Common Data Source Patterns" title="Direct link to Common Data Source Patterns" translate="no">​</a></h3>
<p>Here are some frequently used data sources that PowerShell users will find familiar:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get current Azure client configuration (like Get-AzContext)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">data </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_client_config"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"current"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get information about an existing Key Vault (like Get-AzKeyVault)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">data </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_key_vault"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-keyvault"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"shared-resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get a Key Vault secret (like Get-AzKeyVaultSecret)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">data </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_key_vault_secret"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"database_password"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"db-password"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">key_vault_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_key_vault.shared.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use the secret in a resource</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_mssql_server"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example-sqlserver"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">administrator_login</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"sqladmin"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">administrator_login_password</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> data.azurerm_key_vault_secret.database_password.value</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-example-web-app-with-variables">Practical Example: Web App with Variables<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#practical-example-web-app-with-variables" class="hash-link" aria-label="Direct link to Practical Example: Web App with Variables" title="Direct link to Practical Example: Web App with Variables" translate="no">​</a></h2>
<p>Here's a complete example deploying an Azure Web App with reusable variables:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-subscription-id"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># variables.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "base_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Base name for resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment (dev, test, prod)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "location" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Azure region"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># main.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_service_plan"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-plan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">os_type</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Linux"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">sku_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"P1v2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_linux_web_app"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"examplemortenkr"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_service_plan.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">service_plan_id</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_service_plan.example.id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">site_config</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># outputs.tf</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">output</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "website_url" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">value</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">azurerm_linux_web_app</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">example</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation" style="color:rgb(255, 121, 198)">default_hostname</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Running this example:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"base_name=mywebapp"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"environment=dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"base_name=mywebapp"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"environment=dev"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-variable-types-and-validation">Advanced Variable Types and Validation<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#advanced-variable-types-and-validation" class="hash-link" aria-label="Direct link to Advanced Variable Types and Validation" title="Direct link to Advanced Variable Types and Validation" translate="no">​</a></h2>
<p>PowerShell has rich parameter validation otherwise refered to as a ValidateSet which is just a set of options that can be chosen for a given parameter. Terraform provides similar capabilities:</p>
<p><strong>PowerShell Parameter Validation:</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[ValidateRange(1, 100)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[int]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$InstanceCount</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidatePattern</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"^[a-z0-9-]+$"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$ResourceName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p><strong>Terraform Variable Validation:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "environment" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment name"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> contains(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"test"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">, var.environment)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Environment must be dev, test, or prod."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "instance_count" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> number</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Number of instances to create"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.instance_count &gt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> &amp;&amp; var.instance_count &lt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Instance count must be between 1 and 100."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "resource_name" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">description</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Name for the resource"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">validation</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">condition</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> can(regex(</span><span class="token string" style="color:rgb(255, 121, 198)">"^[a-z0-9-]+$"</span><span class="token plain">, var.resource_name))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">error_message</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource name must contain only lowercase letters, numbers, and hyphens."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="complex-variable-types">Complex Variable Types<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#complex-variable-types" class="hash-link" aria-label="Direct link to Complex Variable Types" title="Direct link to Complex Variable Types" translate="no">​</a></h3>
<p>Terraform supports complex data types similar to PowerShell objects and hashtables:</p>
<p><strong>PowerShell Objects and Hashtables:</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell hashtable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appSettings</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"ASPNETCORE_ENVIRONMENT"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Production"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"ConnectionStrings__DefaultConnection"</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$connectionString</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell custom object</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$vmConfig</span><span class="token plain"> = </span><span class="token namespace">[PSCustomObject]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Name = </span><span class="token string" style="color:rgb(255, 121, 198)">"web-vm-01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Size = </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_B2s"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Os = </span><span class="token string" style="color:rgb(255, 121, 198)">"Ubuntu"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><strong>Terraform Object and Map Types:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform map variable (like PowerShell hashtable)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "app_settings" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> map(string)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"ASPNETCORE_ENVIRONMENT"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Production"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"WEBSITE_TIME_ZONE"</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"UTC"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform object variable (like PowerShell custom object)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "vm_config" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> object(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">os</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"web-vm-01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard_B2s"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">os</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Ubuntu"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># List of objects (like PowerShell array of objects)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">variable</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "subnets" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> list(object(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">address_prefix</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> string</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">default</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"frontend"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">address_prefix</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.1.0/24"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">name</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"backend"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">address_prefix</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"10.0.2.0/24"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-complex-variables">Using Complex Variables<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#using-complex-variables" class="hash-link" aria-label="Direct link to Using Complex Variables" title="Direct link to Using Complex Variables" translate="no">​</a></h3>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Using the complex variables in resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_linux_web_app"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.vm_config.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># ...other configuration...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">app_settings</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.app_settings</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_subnet"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">count</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> length(var.subnets)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.subnets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">count.index</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">address_prefixes</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">var.subnets</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">count.index</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">.address_prefix</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">virtual_network_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_virtual_network.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-values-terraforms-equivalent-to-powershell-local-variables">Local Values: Terraform's Equivalent to PowerShell Local Variables<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#local-values-terraforms-equivalent-to-powershell-local-variables" class="hash-link" aria-label="Direct link to Local Values: Terraform's Equivalent to PowerShell Local Variables" title="Direct link to Local Values: Terraform's Equivalent to PowerShell Local Variables" translate="no">​</a></h2>
<p>In PowerShell functions, we often compute values locally:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> Deploy-WebApp </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BaseName</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Local computed values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroupName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BaseName</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appServiceName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$BaseName</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">-app"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$storageAccountName</span><span class="token plain"> = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BaseName</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToLower</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-replace</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'[^a-z0-9]'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">''</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$commonTags</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Environment = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Project = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$BaseName</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        ManagedBy = </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        CreatedDate = </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Use the computed values</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceGroupName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Location</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Tag </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$commonTags</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>In Terraform, we use <code>locals</code> blocks for computed values:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Computed naming</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">app_service_name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-app"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">storage_account_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> lower(replace(</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">base_name</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">"/[^a-z0-9]/"</span><span class="token plain">, </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain">))</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Common tags applied to all resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">common_tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">Project</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.base_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">ManagedBy</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">CreatedDate</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> formatdate(</span><span class="token string" style="color:rgb(255, 121, 198)">"YYYY-MM-DD"</span><span class="token plain">, timestamp())</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Conditional logic.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># The two below examples basicly says if the variable environment is set to "prod" the app_service_pla_tier is PremiumV2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># And the same goes for backuup_retention_days if environment is set to "prod" then the retention is set to 30</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">app_service_plan_tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token property">"PremiumV2"</span><span class="token plain"> : </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">backup_retention_days</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.environment </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"> ? </span><span class="token number">30</span><span class="token plain"> : </span><span class="token number">7</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Use locals in resources</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.common_tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.storage_account_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.common_tags</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Use conditional local</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">backup_retention_policy</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">days</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> local.backup_retention_days</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-of-locals-vs-direct-variable-references">Benefits of Locals vs Direct Variable References<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#benefits-of-locals-vs-direct-variable-references" class="hash-link" aria-label="Direct link to Benefits of Locals vs Direct Variable References" title="Direct link to Benefits of Locals vs Direct Variable References" translate="no">​</a></h3>






























<table><thead><tr><th>Approach</th><th>PowerShell</th><th>Terraform</th></tr></thead><tbody><tr><td><strong>Direct Usage</strong></td><td><code>$var</code> directly in commands</td><td><code>var.variable_name</code> in resources</td></tr><tr><td><strong>Computed Values</strong></td><td>Local variables in functions</td><td><code>locals</code> block</td></tr><tr><td><strong>Reusability</strong></td><td>Function parameters</td><td>Variables + locals combination</td></tr><tr><td><strong>DRY Principle</strong></td><td>Avoid repetition with variables</td><td>Avoid repetition with locals</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="variable-files-environment-specific-configuration">Variable Files: Environment-Specific Configuration<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#variable-files-environment-specific-configuration" class="hash-link" aria-label="Direct link to Variable Files: Environment-Specific Configuration" title="Direct link to Variable Files: Environment-Specific Configuration" translate="no">​</a></h2>
<p>In PowerShell, we often use configuration files for different environments:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell approach - environment-specific config files</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$config</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Content</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">".\config.</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertFrom-Json</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or using parameter splatting</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$devParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ResourceGroupName = </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp-dev-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AppServicePlanTier = </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    DatabaseTier = </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$prodParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ResourceGroupName = </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp-prod-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    AppServicePlanTier = </span><span class="token string" style="color:rgb(255, 121, 198)">"Premium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    DatabaseTier = </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Terraform uses <code>.tfvars</code> files for environment-specific values:</p>
<p><strong>dev.tfvars:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">base_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">app_service_plan_tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">app_service_plan_size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"B1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">database_tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Basic"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">database_capacity</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">enable_backup</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">enable_monitoring</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><br></div></code></pre></div></div>
<p><strong>prod.tfvars:</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token property">base_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"myapp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"East US"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">app_service_plan_tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PremiumV2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">app_service_plan_size</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"P1v2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">database_tier</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GeneralPurpose"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">database_capacity</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">enable_backup</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">enable_monitoring</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token property">backup_retention_days</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token number">30</span><br></div></code></pre></div></div>
<p><strong>Using variable files:</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Deploy to dev environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"dev.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"dev.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Deploy to prod environment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"prod.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token string" style="color:rgb(255, 121, 198)">"prod.tfvars"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-script-for-environment-management">PowerShell Script for Environment Management<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#powershell-script-for-environment-management" class="hash-link" aria-label="Direct link to PowerShell Script for Environment Management" title="Direct link to PowerShell Script for Environment Management" translate="no">​</a></h3>
<p>You can create a PowerShell wrapper to manage different environments:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># deploy.ps1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">param</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[Parameter(Mandatory=$true)]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">ValidateSet</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"dev"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"test"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prod"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[string]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[switch]</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$PlanOnly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfvars"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-not</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Test-Path</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Variable file </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token string" style="color:rgb(255, 121, 198)"> not found!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">exit</span><span class="token plain"> 1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deploying to </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)"> environment..."</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Green</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Initialize Terraform</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform init</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$PlanOnly</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Just show the plan</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Apply the changes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    terraform plan </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token operator">-</span><span class="token plain">file=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$varFile</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">out=</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfplan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$confirmation</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Read-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Apply these changes to </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">? (yes/no)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$confirmation</span><span class="token plain"> </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"yes"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        terraform apply </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfplan"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-Item</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfplan"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deployment cancelled"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ForegroundColor Yellow</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Remove-Item</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$Environment</span><span class="token string" style="color:rgb(255, 121, 198)">.tfplan"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Force</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-and-next-steps">Conclusion and Next Steps<a href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform#conclusion-and-next-steps" class="hash-link" aria-label="Direct link to Conclusion and Next Steps" title="Direct link to Conclusion and Next Steps" translate="no">​</a></h2>
<p>In this second part of our PowerShell-to-Terraform series, you've learned to build flexible, maintainable infrastructure code using familiar concepts adapted to Terraform's declarative approach:</p>
<p><strong>What We've Mastered:</strong></p>
<ol>
<li class=""><strong>Resource Dependencies</strong>: Terraform's automatic dependency resolution vs PowerShell's explicit ordering</li>
<li class=""><strong>Variables &amp; Validation</strong>: Type-safe infrastructure parameters with built-in validation rules</li>
<li class=""><strong>Data Sources</strong>: Terraform's approach to querying existing infrastructure (like PowerShell's <code>Get-*</code> cmdlets)</li>
<li class=""><strong>Advanced Variable Types</strong>: Complex objects, maps, and lists for sophisticated configurations</li>
<li class=""><strong>Local Values</strong>: Computed values and DRY principles (like local variables in PowerShell functions)</li>
<li class=""><strong>Environment Management</strong>: Using <code>.tfvars</code> files for environment-specific configurations</li>
<li class=""><strong>State Deep Dive</strong>: Understanding Terraform's comprehensive state tracking vs PowerShell's stateless operations</li>
</ol>
<p><strong>PowerShell Developer Key Insights:</strong></p>
<ul>
<li class="">Variables in Terraform are more powerful than PowerShell parameters with runtime validation</li>
<li class="">Data sources eliminate the need for custom <code>Get-*</code> cmdlet equivalent scripts</li>
<li class="">Local values provide the same benefits as local variables in PowerShell functions</li>
<li class="">Terraform state removes the need for manual resource tracking that PowerShell scripts often require</li>
</ul>
<p><strong>Infrastructure Maturity Progression:</strong>
✅ Foundation → ✅ Variables &amp; State → Integration → Collaboration → Testing → Modules → CI/CD</p>
<p><strong>Coming Next:</strong>
Part 3 (releasing July 29), we'll explore advanced concepts like modules (Terraform's equivalent to PowerShell modules), loops and conditionals, and how to integrate Terraform with your existing PowerShell automation workflows for hybrid infrastructure solutions.</p>
<p><em>You're now ready to build production-ready, parameterized infrastructure!</em></p>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>infrastructure as code</category>
            <category>iac</category>
            <category>azure</category>
            <category>variables</category>
        </item>
        <item>
            <title><![CDATA[Getting Started with Terraform for PowerShell People - Part 1]]></title>
            <link>https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople</link>
            <guid>https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople</guid>
            <pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how Terraform works from a PowerShell person's perspective, including installation, basic concepts, and your first configuration.]]></description>
            <content:encoded><![CDATA[<p>Learn how Terraform works from a PowerShell person's perspective, including installation, basic concepts, and your first configuration.</p>
<blockquote>
<p><strong>📚 Series Navigation:</strong></p>
<ul>
<li class=""><strong>Part 1: Getting Started with Terraform for PowerShell People</strong> ← <em>You are here</em></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/22/ResourcesVariablesAndStateInTerraform">Part 2: Resources, Variables, and State in Terraform (July 22)</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/07/29/AdvancedTerraformAndPowerShellIntegration">Part 3: Advanced Terraform and PowerShell Integration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/05/AdvancedStateManagementAndCollaboration">Part 4: Advanced State Management and Collaboration</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/19/TestingTerraformCode">Part 5: Testing Terraform Code</a></li>
<li class=""><a class="" href="https://mynster-it.dk/2025/08/26/TerraformModulesDeepDive">Part 6: Terraform Modules Deep Dive</a></li>
<li class="">Part 7: CI/CD with GitHub Actions <em>(September 9)</em></li>
</ul>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-terraform-for-powershell-users">Introduction to Terraform for PowerShell Users<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#introduction-to-terraform-for-powershell-users" class="hash-link" aria-label="Direct link to Introduction to Terraform for PowerShell Users" title="Direct link to Introduction to Terraform for PowerShell Users" translate="no">​</a></h2>
<p>Welcome to the first part of our comprehensive series designed specifically for PowerShell developers transitioning to Terraform. As PowerShell professionals, we're accustomed to writing imperative code that tells a system exactly <em>how</em> to do something. Terraform introduces a different paradigm - infrastructure as code (IaC) that is <em>declarative</em>, where you define <em>what</em> you want the end state to be.</p>
<p>Throughout this 7-part series, we'll help you transition from PowerShell scripting to Terraform by drawing parallels between concepts you already know and the new world of declarative infrastructure management. Whether you're managing Azure resources with PowerShell cmdlets or building complex automation workflows, this series will bridge that knowledge to Terraform's approach.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-concept-imperative-vs-declarative">Key Concept: Imperative vs. Declarative<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#key-concept-imperative-vs-declarative" class="hash-link" aria-label="Direct link to Key Concept: Imperative vs. Declarative" title="Direct link to Key Concept: Imperative vs. Declarative" translate="no">​</a></h2>
<p>Let's start with a simple comparison:</p>
<p><strong>PowerShell (Imperative):</strong></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Note you should login with `Connect-AzAccount` before running this script</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># define variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"MyResourceGroup"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"WestEurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"123dfs56fgjghjghjg"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Must be globally unique</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a resource group if it doesn't exist</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-not</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ErrorAction SilentlyContinue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource group created"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Resource group already exists"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a storage account if it doesn't exist</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-not</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ErrorAction SilentlyContinue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzStorageAccount</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ResourceGroupName </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                          </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$stName</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                          </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                          </span><span class="token operator">-</span><span class="token plain">SkuName Standard_LRS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account created"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Output</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Storage account already exists"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><strong>Terraform (Declarative):</strong></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># note you will need to run `terraform init` and login with `az login` before running terraform plan/apply</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-subscription-id"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define an Azure resource group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MyResourceGroup"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"123dfs56asdasdqwefg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Notice how PowerShell requires you to check if resources exist and handle that logic, while Terraform just declares the desired state.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-and-setup">Installation and Setup<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#installation-and-setup" class="hash-link" aria-label="Direct link to Installation and Setup" title="Direct link to Installation and Setup" translate="no">​</a></h2>
<p>Installing Terraform is straightforward. There are several methods available:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="windows-using-chocolatey">Windows (using Chocolatey)<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#windows-using-chocolatey" class="hash-link" aria-label="Direct link to Windows (using Chocolatey)" title="Direct link to Windows (using Chocolatey)" translate="no">​</a></h3>
<p>Chocolatey can be downloaded from here
<a href="https://chocolatey.org/install#generic" target="_blank" rel="noopener noreferrer" class="">Chocolatey download</a></p>
<p>Once installed the easiest way to install terraform is running the following in an elevated PowerShell terminal</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install Chocolatey if you don't have it</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">choco install terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Verify installation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform </span><span class="token operator">-</span><span class="token plain">version</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Then we also need the az cli module in order to authenticate</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">choco install azure-</span><span class="token function" style="color:rgb(80, 250, 123)">cli</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Now add it to the environment path using this command</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain">:PATH </span><span class="token operator">+=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">";C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-development-environment">Setting Up Your Development Environment<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#setting-up-your-development-environment" class="hash-link" aria-label="Direct link to Setting Up Your Development Environment" title="Direct link to Setting Up Your Development Environment" translate="no">​</a></h3>
<p>For the best Terraform experience, especially coming from PowerShell, I recommend setting up VS Code:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install VS Code extensions for Terraform development</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">code </span><span class="token operator">--</span><span class="token function" style="color:rgb(80, 250, 123)">install-extension</span><span class="token plain"> HashiCorp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">terraform</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">code </span><span class="token operator">--</span><span class="token function" style="color:rgb(80, 250, 123)">install-extension</span><span class="token plain"> ms-vscode</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">powershell</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Optional not needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">code </span><span class="token operator">--</span><span class="token function" style="color:rgb(80, 250, 123)">install-extension</span><span class="token plain"> ms-azuretools</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">vscode-azureresourcegroups</span><br></div></code></pre></div></div>
<p>These extensions provide:</p>
<ul>
<li class="">Syntax highlighting and IntelliSense for Terraform</li>
<li class="">Terraform plan/apply integration</li>
<li class="">Azure resource browsing - Optional</li>
<li class="">PowerShell debugging support for hybrid scripts</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="provider-configuration">Provider Configuration<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#provider-configuration" class="hash-link" aria-label="Direct link to Provider Configuration" title="Direct link to Provider Configuration" translate="no">​</a></h2>
<p>In PowerShell, we connect to Azure using <code>Connect-AzAccount</code>. In Terraform, we configure providers:
In Terraform while running it interactively we run <code>az login</code></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Configure the Azure provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Configure the Microsoft Azure Provider</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"your-subscription-id"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Replace with your Azure subscription ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Authentication happens via Az CLI, environment variables, or other methods</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-first-terraform-configuration">Your First Terraform Configuration<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#your-first-terraform-configuration" class="hash-link" aria-label="Direct link to Your First Terraform Configuration" title="Direct link to Your First Terraform Configuration" translate="no">​</a></h2>
<p>Let's create a simple Terraform project:</p>
<ol>
<li class="">Create a new directory and a file named <code>main.tf</code>:</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType Directory </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\TerraformProject"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Set-Location</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\TerraformProject"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">New-Item</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ItemType File </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">".\main.tf"</span><br></div></code></pre></div></div>
<ol start="2">
<li class="">Add this content to <code>main.tf</code>:</li>
</ol>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">terraform</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">required_providers</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">azurerm</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">source</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hashicorp/azurerm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">version</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"~&gt; 4.30.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">provider</span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic"> "azurerm" </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">features</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">subscription_id</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># your subscription id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a resource group</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-first-terraform-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"West Europe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">tags</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">environment</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">created_by</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a storage account</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"123dfs56fg"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># needs to be globally unique</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_group_name</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> azurerm_resource_group.example.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_tier</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">account_replication_type</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ol start="3">
<li class="">Initialize Terraform (downloads providers):</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform init</span><br></div></code></pre></div></div>
<ol start="4">
<li class="">Create an execution plan:</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform plan</span><br></div></code></pre></div></div>
<p>With this we will get this output:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  + create</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Terraform will perform the following actions:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># azurerm_resource_group.example will be created</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  + </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">id</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"westeurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-first-terraform-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">tags</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          + </span><span class="token property">"created_by"</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Terraform"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">          + </span><span class="token property">"environment"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Development"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># azurerm_storage_account.example will be created</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  + </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">access_tier</span><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">account_kind</span><span class="token plain">                       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"StorageV2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">account_replication_type</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LRS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">account_tier</span><span class="token plain">                       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">allow_nested_items_to_be_public</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">cross_tenant_replication_enabled</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">default_to_oauth_authentication</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">dns_endpoint_type</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Standard"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">https_traffic_only_enabled</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">id</span><span class="token plain">                                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">infrastructure_encryption_enabled</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">is_hns_enabled</span><span class="token plain">                     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">large_file_share_enabled</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">local_user_enabled</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">location</span><span class="token plain">                           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"westeurope"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">min_tls_version</span><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TLS1_2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">name</span><span class="token plain">                               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"123dfs5dghggdh6fg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">nfsv3_enabled</span><span class="token plain">                      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_access_key</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_connection_string</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_endpoint</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_host</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_internet_endpoint</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_internet_host</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_microsoft_endpoint</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_blob_microsoft_host</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_connection_string</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_endpoint</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_host</span><span class="token plain">                   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_internet_endpoint</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_internet_host</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_microsoft_endpoint</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_dfs_microsoft_host</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_endpoint</span><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_host</span><span class="token plain">                  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_internet_endpoint</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_internet_host</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_microsoft_endpoint</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_file_microsoft_host</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_location</span><span class="token plain">                   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_queue_endpoint</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_queue_host</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_queue_microsoft_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_queue_microsoft_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_table_endpoint</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_table_host</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_table_microsoft_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_table_microsoft_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_endpoint</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_host</span><span class="token plain">                   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_internet_endpoint</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_internet_host</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_microsoft_endpoint</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">primary_web_microsoft_host</span><span class="token plain">         </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">public_network_access_enabled</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">queue_encryption_key_type</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">resource_group_name</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"my-first-terraform-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_access_key</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_connection_string</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_endpoint</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_host</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_internet_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_internet_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_microsoft_endpoint</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_blob_microsoft_host</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_connection_string</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (sensitive value)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_endpoint</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_host</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_internet_endpoint</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_internet_host</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_microsoft_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_dfs_microsoft_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_endpoint</span><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_host</span><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_internet_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_internet_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_microsoft_endpoint</span><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_file_microsoft_host</span><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_location</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_queue_endpoint</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_queue_host</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_queue_microsoft_endpoint</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_queue_microsoft_host</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_table_endpoint</span><span class="token plain">           </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_table_host</span><span class="token plain">               </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_table_microsoft_endpoint</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_table_microsoft_host</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_endpoint</span><span class="token plain">             </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_host</span><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_internet_endpoint</span><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_internet_host</span><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_microsoft_endpoint</span><span class="token plain">   </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">secondary_web_microsoft_host</span><span class="token plain">       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">sftp_enabled</span><span class="token plain">                       </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">shared_access_key_enabled</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + </span><span class="token property">table_encryption_key_type</span><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + blob_properties (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + network_rules (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + queue_properties (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + routing (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + share_properties (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      + static_website (known after apply)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Plan: </span><span class="token number">2</span><span class="token plain"> to add, </span><span class="token number">0</span><span class="token plain"> to change, </span><span class="token number">0</span><span class="token plain"> to destroy.</span><br></div></code></pre></div></div>
<ol start="5">
<li class="">Apply the changes:</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform apply</span><br></div></code></pre></div></div>
<p>When prompted, type <code>yes</code> to confirm.</p>
<p>We will see something similar to the above plan and then additionally see the following:
<em>Note that due to storage accounts having to be globally unique you might run into an error like:</em></p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m10s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creation complete after </span><span class="token number">12</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">╷</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ Error: creating Storage Account (Subscription: </span><span class="token string" style="color:rgb(255, 121, 198)">"***"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ Resource Group Name: </span><span class="token string" style="color:rgb(255, 121, 198)">"my-first-terraform-rg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│ Storage Account Name: </span><span class="token string" style="color:rgb(255, 121, 198)">"123dfs56fg"</span><span class="token plain">): performing Create: unexpected status </span><span class="token number">409</span><span class="token plain"> (</span><span class="token number">409</span><span class="token plain"> Conflict) with error: StorageAccountAlreadyTaken: The storage account named </span><span class="token number">123</span><span class="token plain">dfs56fg is already taken.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   with azurerm_storage_account.example,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   on main.tf line </span><span class="token number">26</span><span class="token plain">, in resource </span><span class="token string" style="color:rgb(255, 121, 198)">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token property">"example"</span><span class="token plain">:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│   </span><span class="token number">26</span><span class="token plain">: </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_storage_account"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">│</span><br></div></code></pre></div></div>
<ul>
<li class="">Just change the name of the sotrage account untill something sticks</li>
</ul>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m10s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Creation complete after </span><span class="token number">10</span><span class="token plain">s </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Creating...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m10s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m20s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m30s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m40s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">00</span><span class="token plain">m50s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Still creating... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">01</span><span class="token plain">m00s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Creation complete after </span><span class="token number">1</span><span class="token plain">m5s </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg/providers/Microsoft.Storage/storageAccounts/</span><span class="token number">123</span><span class="token plain">dfs5dghggdh6fg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Apply complete! Resources: </span><span class="token number">2</span><span class="token plain"> added, </span><span class="token number">0</span><span class="token plain"> changed, </span><span class="token number">0</span><span class="token plain"> destroyed.</span><br></div></code></pre></div></div>
<p>Further we will now have a new file called <code>terraform.tfstate</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-state-file">Understanding the State File<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#understanding-the-state-file" class="hash-link" aria-label="Direct link to Understanding the State File" title="Direct link to Understanding the State File" translate="no">​</a></h2>
<p>The <code>terraform.tfstate</code> file is one of Terraform's most critical components and represents a key difference from PowerShell scripting. Let's explore what it is and why it matters:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-state-file">What is the State File?<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#what-is-the-state-file" class="hash-link" aria-label="Direct link to What is the State File?" title="Direct link to What is the State File?" translate="no">​</a></h3>
<p>In PowerShell automation, we typically don't have a persistent record of what resources we've created - we either query the system each time or maintain our own tracking mechanism. Terraform, however, uses a state file to track everything it manages.</p>
<p>Think of the state file as Terraform's "database" - it contains a complete mapping between your Terraform configuration and the real-world resources it created.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-inside-the-state-file">What's Inside the State File?<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#whats-inside-the-state-file" class="hash-link" aria-label="Direct link to What's Inside the State File?" title="Direct link to What's Inside the State File?" translate="no">​</a></h3>
<p>The state file contains:</p>
<ol>
<li class=""><strong>Resource mappings</strong>: Connections between resource names in your code and their real IDs in Azure/AWS/etc.</li>
<li class=""><strong>Attribute values</strong>: All properties of your resources, including those generated by the provider</li>
<li class=""><strong>Metadata</strong>: Information about the Terraform version, provider versions, and dependencies</li>
<li class=""><strong>Sensitive data</strong>: Access keys, connection strings, and other secrets (which is why security is important)</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-state-files-matter-powershell-vs-terraform">Why State Files Matter (PowerShell vs. Terraform)<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#why-state-files-matter-powershell-vs-terraform" class="hash-link" aria-label="Direct link to Why State Files Matter (PowerShell vs. Terraform)" title="Direct link to Why State Files Matter (PowerShell vs. Terraform)" translate="no">​</a></h3>

























<table><thead><tr><th>PowerShell Approach</th><th>Terraform Approach</th></tr></thead><tbody><tr><td>Query resources each run</td><td>Read state file first</td></tr><tr><td>Manual tracking of dependencies</td><td>Automatic dependency resolution</td></tr><tr><td>Write your own logic to detect changes</td><td>Automatic diff between state and config</td></tr><tr><td>You handle secrets separately</td><td>Secrets stored in state file (use caution!)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-considerations">Security Considerations<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#security-considerations" class="hash-link" aria-label="Direct link to Security Considerations" title="Direct link to Security Considerations" translate="no">​</a></h3>
<blockquote>
<p><strong>Security Note:</strong> The state file contains sensitive information like access keys and connection strings. Never commit state files to version control. For production environments, use remote state with appropriate access controls.</p>
</blockquote>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Never do this with state files</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">git add terraform</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">tfstate  </span><span class="token comment" style="color:rgb(98, 114, 164)"># BAD: Contains secrets</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Instead, add to .gitignore</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*.tfstate"</span><span class="token plain"> &gt;&gt; </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">gitignore</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">echo</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"*.tfstate.backup"</span><span class="token plain"> &gt;&gt; </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">gitignore</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cleanup-the-deployment-again">Cleanup the deployment again<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#cleanup-the-deployment-again" class="hash-link" aria-label="Direct link to Cleanup the deployment again" title="Direct link to Cleanup the deployment again" translate="no">​</a></h2>
<p>To cleanup the resources we just deployed we can just run</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">terraform destroy</span><br></div></code></pre></div></div>
<p>When prompted, type <code>yes</code> to confirm.</p>
<p>Which would give you the plan again this time with red - in it to display what it is destroying and the following</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">Plan: </span><span class="token number">0</span><span class="token plain"> to add, </span><span class="token number">0</span><span class="token plain"> to change, </span><span class="token number">2</span><span class="token plain"> to destroy.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Do you really want to destroy all resources?</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Terraform will destroy all your managed infrastructure, as shown above.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  There is no undo. Only 'yes' will be accepted to confirm.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Enter a value: yes</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Destroying... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg/providers/Microsoft.Storage/storageAccounts/</span><span class="token number">123</span><span class="token plain">dfs5dghggdh6fg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_storage_account.example: Destruction complete after </span><span class="token number">4</span><span class="token plain">s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Destroying... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Still destroying... </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token property">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain">/subscriptions</span><span class="token comment" style="color:rgb(98, 114, 164)">/***/</span><span class="token plain">resourceGroups/my-first-terraform-rg, </span><span class="token number">00</span><span class="token plain">m10s elapsed</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">azurerm_resource_group.example: Destruction complete after </span><span class="token number">17</span><span class="token plain">s</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Destroy complete! Resources: </span><span class="token number">2</span><span class="token plain"> destroyed.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-terraform-workflow">Understanding the Terraform Workflow<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#understanding-the-terraform-workflow" class="hash-link" aria-label="Direct link to Understanding the Terraform Workflow" title="Direct link to Understanding the Terraform Workflow" translate="no">​</a></h2>
<p>The Terraform workflow can be understood by comparing it to familiar PowerShell concepts:</p>






























<table><thead><tr><th>PowerShell</th><th>Terraform</th><th>Description</th></tr></thead><tbody><tr><td><code>Import-Module/Install-Module</code></td><td><code>terraform init</code></td><td>Prepares environment/dependencies</td></tr><tr><td><code>Get-*</code>, scripted checks</td><td><code>terraform plan</code></td><td>Shows what would happen (read-only)</td></tr><tr><td><code>New-*</code>, <code>Set-*</code> cmdlets</td><td><code>terraform apply</code></td><td>Makes actual changes</td></tr><tr><td><code>Remove-*</code> cmdlets</td><td><code>terraform destroy</code></td><td>Removes all created resources</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-vs-terraform-state-management">PowerShell vs. Terraform: State Management<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#powershell-vs-terraform-state-management" class="hash-link" aria-label="Direct link to PowerShell vs. Terraform: State Management" title="Direct link to PowerShell vs. Terraform: State Management" translate="no">​</a></h2>
<p>One fundamental difference is how state is managed:</p>
<p><strong>PowerShell:</strong></p>
<ul>
<li class="">Stateless by default</li>
<li class="">You query current state each time</li>
<li class="">You write logic to handle differences</li>
</ul>
<p><strong>Terraform:</strong></p>
<ul>
<li class="">Stores state in a state file</li>
<li class="">Compares desired state to current state</li>
<li class="">Automatically determines required changes</li>
</ul>
<blockquote>
<p><strong>Security Note:</strong> Terraform state files can contain sensitive information. Never commit them to version control. For production environments, consider using remote state with appropriate access controls.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion-and-next-steps">Conclusion and Next Steps<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#conclusion-and-next-steps" class="hash-link" aria-label="Direct link to Conclusion and Next Steps" title="Direct link to Conclusion and Next Steps" translate="no">​</a></h2>
<p>In this first part of our PowerShell-to-Terraform series, we've established the foundation you need to start your infrastructure automation journey. We've covered:</p>
<ol>
<li class=""><strong>Conceptual Bridge</strong>: Understanding the shift from PowerShell's imperative approach to Terraform's declarative model</li>
<li class=""><strong>Environment Setup</strong>: Installation methods and VS Code configuration for optimal development experience</li>
<li class=""><strong>Your First Terraform Configuration</strong>: Created, planned, applied, and destroyed your first Terraform configuration</li>
<li class=""><strong>State Awareness</strong>: Understanding how Terraform tracks and manages infrastructure state</li>
<li class=""><strong>Security Foundations</strong>: Best practices for handling sensitive data in state files</li>
</ol>
<p><strong>What We've Achieved:</strong></p>
<ul>
<li class="">Installed and configured Terraform with proper tooling</li>
<li class="">Understood the fundamental workflow differences between PowerShell and Terraform</li>
<li class="">Successfully deployed and managed Azure resources declaratively</li>
<li class="">Established security best practices from day one</li>
</ul>
<p><strong>Coming Next:</strong>
Part 2 (releasing July 22) will build on this foundation by exploring how to make your Terraform code more flexible and reusable using variables, outputs, and data sources - concepts that will feel familiar from PowerShell parameters and return values.</p>
<p><strong>Series Progress:</strong> ✅ Foundation → Variables &amp; State → Integration → Collaboration → Testing → Modules → CI/CD</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-terraform-journey-ahead">Your Terraform Journey Ahead<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#your-terraform-journey-ahead" class="hash-link" aria-label="Direct link to Your Terraform Journey Ahead" title="Direct link to Your Terraform Journey Ahead" translate="no">​</a></h2>
<p>This series is designed to take you from PowerShell scripter to Terraform expert through a carefully planned progression:</p>
<p><strong>🎯 Learning Path Overview:</strong></p>
<ul>
<li class=""><strong>Parts 1-2</strong>: Foundation and core concepts (where you are now)</li>
<li class=""><strong>Parts 3-4</strong>: Integration with PowerShell and team collaboration</li>
<li class=""><strong>Parts 5-6</strong>: Testing strategies and production-ready modules</li>
<li class=""><strong>Part 7</strong>: Complete CI/CD automation with GitHub Actions</li>
</ul>
<p><strong>💡 What Makes This Series Different:</strong>
Unlike general Terraform tutorials, every concept is explained through PowerShell parallels, making your existing knowledge an advantage rather than something to forget. You'll learn not just <em>what</em> to do, but <em>why</em> it matters from a PowerShell professional's perspective.</p>
<p><strong>🚀 By the End, You'll Have:</strong></p>
<ul>
<li class="">A complete enterprise infrastructure automation platform</li>
<li class="">Skills that combine PowerShell flexibility with Terraform's declarative power</li>
<li class="">Practical experience with testing, modules, and CI/CD for infrastructure</li>
<li class="">Knowledge that positions you for modern cloud infrastructure roles</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-gotchas-for-powershell-users">Common Gotchas for PowerShell Users<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#common-gotchas-for-powershell-users" class="hash-link" aria-label="Direct link to Common Gotchas for PowerShell Users" title="Direct link to Common Gotchas for PowerShell Users" translate="no">​</a></h2>
<p>When transitioning from PowerShell to Terraform, watch out for these common issues:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-string-interpolation-differences">1. String Interpolation Differences<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#1-string-interpolation-differences" class="hash-link" aria-label="Direct link to 1. String Interpolation Differences" title="Direct link to 1. String Interpolation Differences" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$environment</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform - note the syntax difference</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">locals</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">resource_name</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rg-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">environment</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">-</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">$</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string interpolation keyword" style="color:rgb(189, 147, 249);font-style:italic">var</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string interpolation type variable" style="color:rgb(189, 147, 249);font-style:italic">location</span><span class="token string interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-error-handling-philosophy">2. Error Handling Philosophy<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#2-error-handling-philosophy" class="hash-link" aria-label="Direct link to 2. Error Handling Philosophy" title="Direct link to 2. Error Handling Philosophy" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell - explicit error handling</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">New-AzResourceGroup</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rgName</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Location </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$location</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Success!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Error</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Failed: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Exception</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">Message</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># Custom remediation logic</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">finally</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cleanup actions if necessary"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># For example, removing temporary files or resetting variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform - declarative error handling</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">resource </span><span class="token keyword type variable" style="color:rgb(189, 147, 249);font-style:italic">"azurerm_resource_group"</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">name</span><span class="token plain">     </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.resource_group_name</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">location</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">=</span><span class="token plain"> var.location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform handles errors automatically</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># You define what you want, not how to handle failures</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-case-sensitivity">3. Case Sensitivity<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#3-case-sensitivity" class="hash-link" aria-label="Direct link to 3. Case Sensitivity" title="Direct link to 3. Case Sensitivity" translate="no">​</a></h3>
<p>PowerShell is generally case-insensitive, but Terraform is case-sensitive:</p>
<ul>
<li class="">Resource names: <code>azurerm_resource_group</code> (not <code>azurerm_Resource_Group</code>)</li>
<li class="">Variable references: <code>var.location</code> (not <code>var.Location</code>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-comments-syntax">4. Comments Syntax<a href="https://mynster-it.dk/2025/07/15/GettingStartedWithTerraformForPowerShellPeople#4-comments-syntax" class="hash-link" aria-label="Direct link to 4. Comments Syntax" title="Direct link to 4. Comments Syntax" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># PowerShell comment</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">PowerShell</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">multi-line</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">comment</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><br></div></code></pre></div></div>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Terraform comment (only single-line supported)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Multi-line</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">comments</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">*/</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>terraform</category>
            <category>powershell</category>
            <category>infrastructure as code</category>
            <category>iac</category>
            <category>azure</category>
        </item>
        <item>
            <title><![CDATA[Getting Started with Microsoft Graph PowerShell - A Comprehensive Guide]]></title>
            <link>https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule</link>
            <guid>https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule</guid>
            <pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to get started with Microsoft Graph PowerShell SDK, including authentication, finding commands, permissions, and practical examples.]]></description>
            <content:encoded><![CDATA[<p>Learn how to get started with Microsoft Graph PowerShell SDK, including authentication, finding commands, permissions, and practical examples.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-microsoft-graph-powershell-sdk">Introduction to Microsoft Graph PowerShell SDK<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#introduction-to-microsoft-graph-powershell-sdk" class="hash-link" aria-label="Direct link to Introduction to Microsoft Graph PowerShell SDK" title="Direct link to Introduction to Microsoft Graph PowerShell SDK" translate="no">​</a></h2>
<p>I recently hosted a talk on the <a href="https://discord.gg/pdq" target="_blank" rel="noopener noreferrer" class="">PDQ Discord for a PowerShell Wednesday</a></p>
<p>You can watch the session here if you prefer to watch rather than read.</p>
<div class="youtube-embed"><iframe src="https://www.youtube.com/embed/hyuEvG_LNvw" title="YouTube video" allowfullscreen=""></iframe></div>
<p>In this session we walked through:</p>
<ul>
<li class="">Installing the Microsoft Graph PowerShell modules</li>
<li class="">Authentication options (delegated, client secret, and certificate)</li>
<li class="">Finding the right commands and permissions</li>
<li class="">Filtering and query optimization</li>
<li class="">Debugging your Graph requests</li>
<li class="">Practical examples including sending an email</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installation-and-setup">Installation and Setup<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#installation-and-setup" class="hash-link" aria-label="Direct link to Installation and Setup" title="Direct link to Installation and Setup" translate="no">​</a></h2>
<p>Installing the Microsoft Graph PowerShell SDK is straightforward using the PowerShell Gallery:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install the core Microsoft Graph module (recommended for current user only)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Install-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph </span><span class="token operator">-</span><span class="token plain">Scope CurrentUser</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># If you need beta endpoints, install the beta module as well</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Install-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Beta </span><span class="token operator">-</span><span class="token plain">Scope CurrentUser</span><br></div></code></pre></div></div>
<p>Pro tip: Only import the specific modules you need rather than the entire collection. The full Microsoft Graph module contains over 25,000 commands when including beta endpoints!</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Import specific modules instead of the entire collection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Authentication</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Users</span><br></div></code></pre></div></div>
<p>Why? you might ask let me give you to time stamp for import of the complete <code>Microsoft.Graph</code> compared to the 2 listed above</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Authentication</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Users</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Days              : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Hours             : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Minutes           : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Seconds           : 4</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Milliseconds      : 114</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Ticks             : 41142211</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalDays         : 4,76182997685185E-05</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalHours        : 0,00114283919444444</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMinutes      : 0,0685703516666667</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalSeconds      : 4,1142211</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMilliseconds : 4114,2211</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Compared to:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Measure-Command</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> Microsoft</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Graph</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Days              : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Hours             : 0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Minutes           : 4</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Seconds           : 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Milliseconds      : 607</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">Ticks             : 2906076527</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalDays         : 0,00336351449884259</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalHours        : 0,0807243479722222</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMinutes      : 4,84346087833333</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalSeconds      : 290,6076527</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">TotalMilliseconds : 290607,6527</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-methods">Authentication Methods<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#authentication-methods" class="hash-link" aria-label="Direct link to Authentication Methods" title="Direct link to Authentication Methods" translate="no">​</a></h2>
<p>Microsoft Graph offers several authentication methods, each suitable for different scenarios in this session we only covered 3 (User auth, Client Secret, Certificate):</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-interactive-delegated-authentication">1. Interactive (Delegated) Authentication<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#1-interactive-delegated-authentication" class="hash-link" aria-label="Direct link to 1. Interactive (Delegated) Authentication" title="Direct link to 1. Interactive (Delegated) Authentication" translate="no">​</a></h3>
<p>Best for testing or when running scripts manually:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Authenticate with delegated permissions (browser login)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Scopes </span><span class="token string" style="color:rgb(255, 121, 198)">"User.Read.All"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># You can specify multiple scopes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Scopes </span><span class="token string" style="color:rgb(255, 121, 198)">"User.Read.All"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string" style="color:rgb(255, 121, 198)">"Mail.Send"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># You can also specify a tenant ID</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TenantId </span><span class="token string" style="color:rgb(255, 121, 198)">"contoso.onmicrosoft.com"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Scopes </span><span class="token string" style="color:rgb(255, 121, 198)">"User.Read.All"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-client-secret-authentication">2. Client Secret Authentication<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#2-client-secret-authentication" class="hash-link" aria-label="Direct link to 2. Client Secret Authentication" title="Direct link to 2. Client Secret Authentication" translate="no">​</a></h3>
<p>Best for automated scripts and applications:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create credential object using app ID and client secret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"appid"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$secret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"secret"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Client secret auth (for automation)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$credential</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-Object</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TypeName System</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Management</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Automation</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">PSCredential </span><span class="token operator">-</span><span class="token plain">ArgumentList </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-SecureString</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">String </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$secret</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AsPlainText </span><span class="token operator">-</span><span class="token plain">Force</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TenantId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ClientSecretCredential </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$credential</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-certificate-authentication">3. Certificate Authentication<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#3-certificate-authentication" class="hash-link" aria-label="Direct link to 3. Certificate Authentication" title="Direct link to 3. Certificate Authentication" translate="no">​</a></h3>
<p>Best for secure automation without storing and using secrets:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a self-signed certificate (for development only)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$certName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"GraphAPIAccess"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$cert</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-SelfSignedCertificate</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"CN=</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$certName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CertStoreLocation </span><span class="token string" style="color:rgb(255, 121, 198)">"Cert:\CurrentUser\My"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">KeyExportPolicy Exportable </span><span class="token operator">-</span><span class="token plain">KeySpec Signature </span><span class="token operator">-</span><span class="token plain">KeyLength 2048 </span><span class="token operator">-</span><span class="token plain">KeyAlgorithm RSA </span><span class="token operator">-</span><span class="token plain">HashAlgorithm SHA256</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Export the certificate for uploading to Azure AD</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-Certificate</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Cert </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$cert</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FilePath </span><span class="token string" style="color:rgb(255, 121, 198)">".\</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$certName</span><span class="token string" style="color:rgb(255, 121, 198)">.cer"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Remember to upload the cert to your application otherwise you will get a failure when trying to connect.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Connect using certificate</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">TenantId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CertificateThumbprint </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$cert</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Thumbprint </span><span class="token operator">-</span><span class="token plain">AppId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><br></div></code></pre></div></div>
<p>After connecting, you can check your authentication context:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Check your authentication context</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgContext</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># View detailed scope information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgContext</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Scopes</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-commands-and-required-permissions">Finding Commands and Required Permissions<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#finding-commands-and-required-permissions" class="hash-link" aria-label="Direct link to Finding Commands and Required Permissions" title="Direct link to Finding Commands and Required Permissions" translate="no">​</a></h2>
<p>The Microsoft Graph PowerShell SDK includes thousands of commands, making it essential to have efficient search strategies:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-commands">Finding Commands<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#finding-commands" class="hash-link" aria-label="Direct link to Finding Commands" title="Direct link to Finding Commands" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Find all commands related to users</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Command </span><span class="token string" style="color:rgb(255, 121, 198)">"*user*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Find specific commands for managing user calendars</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Command </span><span class="token string" style="color:rgb(255, 121, 198)">"*user*calendar*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter by HTTP method</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">".*users.*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter by API version</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ApiVersion v1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">0 </span><span class="token operator">-</span><span class="token plain">Command </span><span class="token string" style="color:rgb(255, 121, 198)">"*user*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Find by URI pattern</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/{id}"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="finding-required-permissions">Finding Required Permissions<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#finding-required-permissions" class="hash-link" aria-label="Direct link to Finding Required Permissions" title="Direct link to Finding Required Permissions" translate="no">​</a></h3>
<p>For each command, you'll need specific permissions:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># cmdlet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Diving deeper into the permissions you can just search for specific keywords that you are interested in like Calendar and specifying which type of permission you are looking for.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"> Calendar</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"> Calendar </span><span class="token operator">-</span><span class="token plain">PermissionType </span><span class="token string" style="color:rgb(255, 121, 198)">'Delegated'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"> Calendar </span><span class="token operator">-</span><span class="token plain">PermissionType </span><span class="token string" style="color:rgb(255, 121, 198)">'Application'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># You could also find it using the command and expandin the property permissions but due note that not all commands currently has this permission attached to it.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Command </span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUserCalendar</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ExpandProperty Permissions </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> PermissionType</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> IsAdmin</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> FullDescription </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Sort-Object</span><span class="token plain"> PermissionType </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Format-Table</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Finding all the permissions that a user can consent to the below command only looks at the endpoints for user if you wanted all just remove the `user`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"> user </span><span class="token operator">-</span><span class="token plain">PermissionType </span><span class="token string" style="color:rgb(255, 121, 198)">"Delegated"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> Consent </span><span class="token operator">-EQ</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Finding all the permissions that a Admin has to consent to the below command only looks at the endpoints for user if you wanted all just remove the `user`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphPermission</span><span class="token plain"> user </span><span class="token operator">-</span><span class="token plain">PermissionType </span><span class="token string" style="color:rgb(255, 121, 198)">"Application"</span><br></div></code></pre></div></div>
<p>You can also explore permissions for specific commands:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get detailed permission information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Find-MgGraphCommand</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Command </span><span class="token string" style="color:rgb(255, 121, 198)">"Get-MgUserCalendar"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">First 1 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ExpandProperty Permissions</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-filters-and-improving-query-performance">Using Filters and Improving Query Performance<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#using-filters-and-improving-query-performance" class="hash-link" aria-label="Direct link to Using Filters and Improving Query Performance" title="Direct link to Using Filters and Improving Query Performance" translate="no">​</a></h2>
<p>Microsoft Graph supports OData filters that can significantly improve performance by reducing the data transferred:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Simple query - gets the first 100 users</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># to get all just add -All</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">All</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filtered query - only enabled users</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accountEnabled eq true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Multiple filter conditions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accountEnabled eq true and startsWith(city, 'Seattle')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter and select specific properties</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accountEnabled eq true"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token function" style="color:rgb(80, 250, 123)">Select</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"displayName,mail,jobTitle"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Limit the number of results</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Top 5 </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accountEnabled eq true"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging-filter-syntax">Debugging Filter Syntax<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#debugging-filter-syntax" class="hash-link" aria-label="Direct link to Debugging Filter Syntax" title="Direct link to Debugging Filter Syntax" translate="no">​</a></h3>
<p>The OData filter syntax can be challenging as it is a bit diffrent from what we are used to from powershell.
I can recommend using the following techniques to create or debug your filter:</p>
<ol>
<li class="">Use the Microsoft Graph Explorer web interface at <a href="https://developer.microsoft.com/graph/graph-explorer" target="_blank" rel="noopener noreferrer" class="">https://developer.microsoft.com/graph/graph-explorer</a></li>
<li class="">Build you filter in the Azure/Entra portal and monitor the network traffic to get the filters
<ol>
<li class="">Press F12 in your browser</li>
<li class="">Go to the Network tab</li>
<li class="">Filter for "fetch/XHR" requests</li>
<li class="">Look for requests to graph.microsoft.com</li>
</ol>
</li>
<li class="">Ask an AI to assist you with the filter but test it and make sure it works as expected</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Example of a complex filter from Graph Explorer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Here we are getting only the "accounts that are enabled" from users whose city starts with "Se" and their department has to start with "Mark"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Filter</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"accountEnabled eq true and startsWith(city,'Se') and startsWith(department,'Mark')"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="debugging-graph-requests">Debugging Graph Requests<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#debugging-graph-requests" class="hash-link" aria-label="Direct link to Debugging Graph Requests" title="Direct link to Debugging Graph Requests" translate="no">​</a></h2>
<p>When troubleshooting, these techniques can help:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="examining-http-requests">Examining HTTP Requests<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#examining-http-requests" class="hash-link" aria-label="Direct link to Examining HTTP Requests" title="Direct link to Examining HTTP Requests" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Add debug parameter to see full HTTP requests/responses</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Get-MgUser</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Debug</span><br></div></code></pre></div></div>
<p>Right just going over each box 1 by 1</p>
<ol>
<li class="">The first box lets us know how our current session is authenticated in this case we are using a delegated scope and have authenticated interactively</li>
<li class="">The second box shows us which scopes we have authenticated our session with in this</li>
<li class="">Shows us the exact HTTP request.
<ol>
<li class="">HTTP Method: GET</li>
<li class="">Abosolute Uri: <a href="https://graph.microsoft.com/v1.0/users" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0/users</a></li>
<li class="">Headers sent with the request</li>
<li class="">And finaly our body which in this case is empty</li>
</ol>
</li>
<li class="">The final box contains the actual result from your query if it is a success</li>
</ol>
<p><img decoding="async" loading="lazy" alt="debug" src="https://mynster-it.dk/assets/images/2025-05-13-IntroductionToMsGraphModuleDebug-1eb0b1f94bcf28a038e90623ed3f0f18.png" width="2542" height="1156" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="using-browser-developer-tools-quick-tip">Using Browser Developer Tools Quick tip<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#using-browser-developer-tools-quick-tip" class="hash-link" aria-label="Direct link to Using Browser Developer Tools Quick tip" title="Direct link to Using Browser Developer Tools Quick tip" translate="no">​</a></h3>
<ol>
<li class="">Press F12 in your browser</li>
<li class="">Go to the Network tab</li>
<li class="">Filter for "fetch/XHR" requests</li>
<li class="">Look for requests to graph.microsoft.com</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-error-types-you-will-meet-and-what-they-mean">Common Error Types you will meet and what they mean<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#common-error-types-you-will-meet-and-what-they-mean" class="hash-link" aria-label="Direct link to Common Error Types you will meet and what they mean" title="Direct link to Common Error Types you will meet and what they mean" translate="no">​</a></h3>
<ul>
<li class="">401 Unauthorized: Authentication issues</li>
<li class="">403 Forbidden: Permission problems</li>
<li class="">404 Not Found: Resource doesn't exist</li>
<li class="">400 Bad Request: Incorrectly formatted request</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="practical-examples">Practical Examples<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#practical-examples" class="hash-link" aria-label="Direct link to Practical Examples" title="Direct link to Practical Examples" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-an-email-with-graph-api">Sending an Email with Graph API<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#sending-an-email-with-graph-api" class="hash-link" aria-label="Direct link to Sending an Email with Graph API" title="Direct link to Sending an Email with Graph API" translate="no">​</a></h3>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Connect with Mail.Send permission</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Connect-MgGraph</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Scopes </span><span class="token string" style="color:rgb(255, 121, 198)">"Mail.Send"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create email parameters</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    message = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        subject = </span><span class="token string" style="color:rgb(255, 121, 198)">"Test Email from Graph API"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            content = </span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;h1&gt;Hello from Microsoft Graph!&lt;/h1&gt;&lt;p&gt;This is a test email sent via PowerShell.&lt;/p&gt;"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        toRecipients = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"recipient@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    saveToSentItems = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Send the email</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"your-user-id-or-upn"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Send-MgUserMail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">UserId </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">BodyParameter </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="best-practices">Best Practices<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#best-practices" class="hash-link" aria-label="Direct link to Best Practices" title="Direct link to Best Practices" translate="no">​</a></h2>
<ol>
<li class=""><strong>Use specific scopes</strong>: Request only the permissions your application needs</li>
<li class=""><strong>Prefer delegated over application permissions</strong> when possible</li>
<li class=""><strong>Use filters</strong> to reduce data transfer and improve performance</li>
<li class=""><strong>Use proper authentication</strong> for your scenario (interactive for user context, client credentials/certificate for automation)</li>
<li class=""><strong>Check the documentation</strong> when you encounter issues</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/05/13/IntroductionToMsGraphModule#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The Microsoft Graph PowerShell SDK provides a powerful way to access Microsoft 365 resources. By understanding authentication options, efficiently finding commands and permissions, and using appropriate filters, you can build robust automation solutions.</p>
<p>For more information, check these resources:</p>
<ul>
<li class=""><a href="https://docs.microsoft.com/en-us/powershell/microsoftgraph/" target="_blank" rel="noopener noreferrer" class="">Microsoft Graph PowerShell Documentation</a></li>
<li class=""><a href="https://docs.microsoft.com/en-us/graph/api/overview" target="_blank" rel="noopener noreferrer" class="">Microsoft Graph API Reference</a></li>
<li class=""><a href="https://developer.microsoft.com/graph/graph-explorer" target="_blank" rel="noopener noreferrer" class="">Microsoft Graph Explorer</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>microsoft graph</category>
            <category>authentication</category>
            <category>api</category>
        </item>
        <item>
            <title><![CDATA[ActionableMessages PowerShell Module - New Prebuilt Cards in v1.0.4]]></title>
            <link>https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew</link>
            <guid>https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew</guid>
            <pubDate>Sun, 27 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore the new prebuilt Adaptive Cards introduced in version 1.0.4 of the ActionableMessages PowerShell module.]]></description>
            <content:encoded><![CDATA[<p>Explore the new prebuilt Adaptive Cards introduced in version 1.0.4 of the ActionableMessages PowerShell module.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="actionablemessages-powershell-module---new-prebuilt-cards-in-v104">ActionableMessages PowerShell Module - New Prebuilt Cards in v1.0.4<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#actionablemessages-powershell-module---new-prebuilt-cards-in-v104" class="hash-link" aria-label="Direct link to ActionableMessages PowerShell Module - New Prebuilt Cards in v1.0.4" title="Direct link to ActionableMessages PowerShell Module - New Prebuilt Cards in v1.0.4" translate="no">​</a></h2>
<p>Version 1.0.4 of the ActionableMessages PowerShell module introduces <strong>8 new prebuilt Adaptive Cards</strong> to simplify common workflows. These cards are designed to address frequent use cases like notifications, approvals, surveys, and monitoring, making it easier than ever to create interactive emails.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What’s New?<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#whats-new" class="hash-link" aria-label="Direct link to What’s New?" title="Direct link to What’s New?" translate="no">​</a></h2>
<p>Here’s a quick overview of the new cards:</p>
<ul>
<li class=""><strong><code>New-AMNotificationCard</code></strong>: Create system notifications with optional severity levels.</li>
<li class=""><strong><code>New-AMServiceAlertCard</code></strong>: Notify users about service status changes with actionable options.</li>
<li class=""><strong><code>New-AMServerMonitoringCard</code></strong>: Monitor server health and notify users about issues.</li>
<li class=""><strong><code>New-AMServerPurposeSurveyCard</code></strong>: Collect information about server purpose and usage.</li>
<li class=""><strong><code>New-AMITResourceRequestCard</code></strong>: Request IT resources with detailed input fields.</li>
<li class=""><strong><code>New-AMApprovalCard</code></strong>: Streamline approval workflows with customizable actions.</li>
<li class=""><strong><code>New-AMApplicationUsageSurveyCard</code></strong>: Gather feedback on application usage and importance.</li>
<li class=""><strong><code>New-AMDiskSpaceAlertCard</code></strong>: Alert users about low disk space with actionable options.</li>
</ul>
<p>Let’s explore some examples of these cards in action.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amnotificationcard"><code>New-AMNotificationCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amnotificationcard" class="hash-link" aria-label="Direct link to new-amnotificationcard" title="Direct link to new-amnotificationcard" translate="no">​</a></h3>
<p>The <code>New-AMNotificationCard</code> is perfect for sending system notifications. You can customize the title, message, severity, and include a link for more details.</p>
<p><img decoding="async" loading="lazy" alt="New-AMNotificationCard" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAn4AAADzCAIAAACXA4wYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAACB7SURBVHhe7d1fjFXVocfxUeqfihL8Q/2DzrX1OsMchhmmw8ygkLF/KCL0XKSGIgIjxF5LtVquXAgm2la8MRAJoYYYMjFKCBCjvPDEEyRqX3woMTg+3z4IJPfBRL3v965/e++11l57z545sM45zPeTk+bsf+vf3nv92OecqR1dAAAgIqIXAICoiF4AAKIiegEAiIroBQAgKqIXAICoiF4AAKIiegEAiIroBQAgKqIXAICoiF4AAKKaJHrr9frp06cvX778DQAAKCXiUoSmiE4TogXKolccLEpZtWqVWQYAAKVEaIroLE/fsugV0U3uAgAwJSI6RYCahZCy6BW5bd4BAIDKygO0LHq/+eYb8w4AAFRWHqBELwAAVxjRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAER1TUTvc2tHTm4d2b/MLM4s/X3jW0dObuxbY5avqgWvbhRDPfhqv1kGAExd5OhdNiAy0noNH92w+A/93WbrdMWP3trC2kurB8c3D+uOHN889O7a3ijhl0P0AkCbaUr0jg0erA/sW5tG1+CuxqbyyNG7/JHF76nE1aH7vunFwHNme1xTid4lA72vrxs8Wl9olqeM6AWAxjUlerOc6H5xnQyw8RULzIppiRm9Sx4ZOCqDdni83rsmbfWCBX+o9z9rFuKaSvSuWTEox38t0QsATdTk6O1av2pIrDn8s4Y+c44YvbXXN8m6jqzoqZk1zUb0AkCbaWb0di8d6js8NnJy88C2JMdqC2s76+kH0fKb4O2LzCal+4nl/Yc3Dh+XW0eOb17y+pBc60Zv93Nr5eHHN/TVxVIu7M2aJH7SY1csX3xENEYWO/jW8u5wso4sPiaO3dT3pFkOqy2qvb5uyVFV2smx4fF1fRuzsFu4XzZ+4Lla7dV1Q7IjY0OHVtSWdnUtHek7vEl1fMxqQJqs6f5bh99b17chbV8+emu1nWsHde1iiEThy+VaXa/1Sg6pLep9Y/0S2a+tI8dk3xf0qfVK98YVA+8lw/LGSI3oBYCGNSV67deGxc9Y4Sofy8aGDq8d2FcfOLBe5dDmxc+Yjd3P1U0kv79e7iAy+C0Vt3b01vWDnc5doVr0vrNuQNd7aIOpYv+ywIO4fmp8f1XZE29toO+ILGHk2AbVSJOmP/2T6aaOwMEjG2QvDqzXaTpyaM3i97YOvysasFE3IIk3k6wDhzapAtcOvq8TPe2gF721hfs3ix1kUaJ2XdpRkdtdtT/VBw7q3m0aFJv2rVw4mrZ2bMkhsaY+8K48Nv0QontbMuBH1g3sWzd4bGxYJTrRCwCNaEr0ej+zGlvyxojJudHB2hPZ17496hlr+M0RuVAbWSy/ZB0b3DmgNlrS6F26TH0Ru1k8U5pNFaP35Kb+DUm9JrztQxI6eku/mc5/It2tn8KPyfwTzNPn+Eqzg/7I3Qr77p3rdQmqFp2sIptHk+dgE67JU74TvbquwVezIaq9JcNy4EV1cO4DZ/UB8tjA9qStXYsWvSt22NS3Xrwf7FO/JhvcmfzbqG+wXzWG6AWARjQleq1UMzlnPdo+MbLodflEO2Q+sE0y5pk1MsDe/UXgYdRE7wr9uGkHT9Xodb5srvUekuUEfrFsondlj1nO69cPkWl3lAGVWGaleep9JY0/3R6ddkp95RJZix29boE6rZ0dTAcX7pOF518mLP3o1a0NvGTfV6qdxb8YzM4S3/UCQOOaHb1JzunZ3DwgHt88eKje/+roogPqCVJHb/pom6c3HVXP0MfX9S41q5Vq0esWq9MxEL1LRtWx6xf9wqzI8T7+NewCc4XnWug8W4cKLN7B5Ppflvdud161evCpVx+7aWBXbv+febUYRC8ANK6lonew732ZBP0bzDY90TvRG/wttInP0YX71CexR+yfH+dqNPHpRu8B9UskQwfS1oFtZtlS6z0oN4W/CZb0scGnXvNcO73o7Tff7Cq6zc4n0m70ph8Re8LRO7Z4i1l26J3dL7Zrf5H/GCJ6AaARzY5e84Gznv3NVhMz6e+VdPQuWa62bh7YngRHKn1yTQ6xolHHXvJlp/z+eIPc2Yvek+mvlpIn75PrepeYNY76StXgrcMHRnt+atZ11Rb0JH/XW/hdr/qtkzCt6LV6lPRx6PVBtexEb/cr6nvio2sXpo/+tYULX1lunlyT6O1N2lZ7U32qb7W2q29w0Z/U78ZrumHWN8Hmq3SiFwAa0pTo1T+zkr+nVSGX5srC3nfk4shR9QPmcfN72vTT4J5dyc+P3yv+hXMWD+YbX5OFotJD6vfGRzbo+HGi971NQ8c3DR6op79wLvk/2Orebn73K17DRzf5/29WSx5RPwfzfuGc/fJrWtG7aei9MfUz4+QXzkfrC82/DJzozf69orsjf5ZsfWhs0nTr8Pi6gUNrF4lDkuEyrdW/uE4GfMEu/c8U9dtvuWnz4BGeegGgUU2J3uwl/3L3pYHsw9ulI/06j49vGnh1SP8VaZoEgvwz0+yvfjcO7lJPfnb0CslPt0za1Rb1vqUDdWz43dU1ETbyvRu9+5d3b1stU0o3abL/W+nun40s2r9hWP8trG7JG6M96YNmX3/2l7Inx5YcXt1r/Wx7eh849z05uOiQ+Tul9E91FTd6BVG76G9S+/C7axdZf1XcvcV0c+TYU4tWqlXLR/oOWX8q7bRW/jGx7oj+G2v9m3OiFwAaETl6W48X2y0nl6wAgDZH9BK9AICoiF6iFwAQFdFL9AIAoprx0QsAQFxELwAAURG9AABERfQCABAV0QsAQFRELwAAURG9AABERfQCABAV0QsAQFRELwAAURG9AABERfQCABAV0QsAQFRELwAAURG9AABERfQCABAV0QsAQFRELwAAURG9AABERfQCABAV0QsAQFRELwAAURG9AABE1SrRe/zCt99fOGYWrrC95y5WKnwKbfjr2UvffX3ur2ZpclPdv8QVLKp1HP/i++++OG4Wrjh5AVw6t9cstRV5TX737fcXz75pVgRZHbwmLw/gmhM1ei+JSST/UmlH9FZF9E5Zu0bvm+e+nix0NaIXaDNNeeo9duG7by+4E+3VjN6qytrgZQPRe2VVit5pJ2i7Rm/lm4LoBdoM0ZshepuG6A0heoFrVWtFr/yEzXwQ7UzE1nr/wISZfWQ5es/skzpv5pW1m30uHLNnt6I2ZGWmK9MJLj/TBVPE7CZbYspxplSrSd6xsrRkk+6RU6M+UB0i9nQ+nLQGeZLaPXZjsq7Zp8A+XA9aOkRqnLOKrGE3ZyF8it1BC5xu2QWzRrzSYq1T454Fa/9L5465F4DFLtaMnui+U5TuoFkQ8mdECg9auHmBSt1iZXV2garxJec3GL3pm5Q7yACaqJWiN5tS1dydzHdyIk4nHTVthdLXTPfJJlmFXVry3l6fTPFJRSVt8KetbF6zC5f8mVozs206FaqJNevgF+kUKQ9POqualx6y99wFtd6t2mlh0dRcWrtD7WmNj2mYGpm0+6repC49aKaiJD+sRav96gSlhTtlWsNbfLpLh9quyznKtNA+MGENUTq8cmXaZsmupfiMFAxaoHmhSmUJabHHLiRH+SUUnV97ZLKiSocLQFO1UvTaM0s2F5dNhRY1s1vrrRk8m4OcaV2xSytug/tesOdKZ070W2u4YSB5BaacjvujJJmqVX+91jpdsw6vXHt4bO3OatYa9xDvLNizv3+CnBY6vXbqssq3S9NtsLuQbc31wj0wle+XVNKA8BkpHrRQ84KVVjkdJefX7qBdvnOI3y8ATdRK0WvPX+lkJKcS+dTivPIzXW56DUavqMWbgu16C9vgvRecCdSa1Pz5MZGfcN016nEq7WDa8cB0rA+85OWu4FdtDfJktSfkQOWjJdSpbE930LyzYC96mwRrTTq8smHpOCQvU75bgjzE31Ntlbu5vchXbcjGiwOdy8mPqKyD4TOSr04pbF6wUllIukPKGduS82t30DmzFa5MAM3QFtEbSiCfP71GjN6sWPEmMAsL7v5StkaORjYtTtpxuf7bSxdFVLtb/bnVGuSy2m3FKeLP2tme7qB5Z8Fe9DYJ1ppJey25JQRapcnd3F7kq7bJrVYWWnGlZB0Mty1fnVLYPM2rVFNXghXAztiWnF+7g+6ZnfzKBNAMLR+9oZ1D/Om1KHrd+UvNgEm9xW1w3wtedIlFWaxoakFsePvbzfNKnrTjSVGyteEDFblbcnhJ7S5/BLTc4fYa9xDvLNiL/glyip2015JbQr5VhnNOFVmmU3VeYQPs0sJtqzpoed4pU+xT45Rccn7tkfHqFYvlVyaAZmj96FWbrInD/lGSxZ/Zg9GrJ6x0N7mP9eRR0obAjOZMrKKKr8+d+yIwBWuqXre04FwpRybdTTUv3RT4SY47MvLYpGsqMNJBLqnd424q+5lVeNC8s2Avuk3Si2n8Vzvd+brsf0Acv5AcJUvLLjBVYKi/fz17IV3pNSAp1rtCis9IftAKmhes9PgXaWut69brb/H5VYtmk3V5KGKTf2XaHQTQFG0QvYKePc3L3i1jzT6KNYW5m0wOyZdYaddbrQ1mAnUnOG9SztH7H3eqNpvMsUnhbqXWpuDc6k7B8li9s9jBGuTS2n3W+LjJkax0D3cHzTsL9qJ+L//OJ1941dOdtM0uM93T6VQ2FGIQvFYl7J5atSf/AJIvcZR3VQTOiBAetFDzgpVarfXH3L8g9W7u+bXHWZY/yZUpi7UHH0B0TYneFuLPbtMlJ7iWnc5y03EzFOQfrrKWvjKBmWqGR2/g+XtaWjtXiN6Zi2EHWtEMi14RQu6no1fmgcD9vLTlEL0zVotfmcBMNdOeerOv8bzv1aZLF9j0YCtF9M5E7XBlAjPVTIteAACajOgFACAqohcAgKiIXgAAoiJ6AQCIiugFACAqohcAgKiIXgAAoiJ6AQCIiugFACAqohcAgKiIXgAAoiJ6AQCIiugFACAqohcAgKiIXgAAoooavcMAAFxzTMhVRvQCANAQE3KVEb0AADTEhFxlRC8AAA0xIVcZ0QsAQENMyFVG9AIA0BATcpURvQAANMSEXGVELwAADTEhVxnRCwBAQ0zIVUb0AgDQEBNylRG9AAA0xIRcZUQvAAANMSFXGdELAEBDTMhVRvQCANAQE3KVEb0AADTEhFxlRC8AAA0xIVcZ0QsAQENMyFVG9AIA0BATcpURvQAANMSEXGVELwAADTEhVxnRCwBAQ0zIVTZjovfjL7//7suPzMI14qOJb7+f+NAsXHH7P7n83cVP95slAFG8/emlby9/+rZZQpswIVdZi0fvh1999+332auBJCB6p+oqRO+BTy+GTqWca9KzXDzpWLtd+uSAWanIk2s2ffWxWVdEDlrgStBXWvgK0c2uVnJ+N1nypMcCCaK3LZmQq6wNojedttQMON34nLnRO92pfxrRWzrI9ulzTuXHX2bNk5UGW6ty13TWfq8rTdppvw9Snbp8KRiQwfWCifxJx1BHb24EiN5rSYRcJHrbkgm5ytopevX8OM3nMKJ3qq5w9HrNKJxfwp3ySs7a5pdTPiYy8ic+lP/rPTer5l2+lF+vqr705VfhVHaoqj+ROe00YLrjj1ZE9CLMhFxlbRW9XhioJyT1nOF/AqkeqpJNeh605259oDpEz8V6tWRXYQ6RbdBFld0Pcuekxqwx8i5K1+eC58N0q9qUVZTrslWO1VovZuSiKcHuQroyLTarqHjcLn76sTvattDIW7WLVy6A7fFXijLSWi/bqcc8t3NyYdjnSwnFakoOYzLUXtd0gfn1smp9prKTUsA0Ug2OtXPSVKPoksixBznru3PlyMP1wOoTnXQ8cP1r+Z31+/yeijvsquXZoj1Wso+mEGvw9eHyf7N7J7ynL9h3c66zEtz7sWBg7Q7aNYr1TgOs01RUkd0qq3Z7tN16/fOih0K93MvMKlmfXLdraAMm5Cpro+jVk052RX40kU7lzqSgru9004df6fX6TtBrvNsmm03Su069NzdtUpS6PYK3hLr30nvp7U8n9J2mbl1n4kgP19OEOSS5de1Fp1KrcKdMe2a036uWO4dkM4K7KI9K5gWnXl1RVoijaOStQfbJwt2pNr9GsZsn36sR8099tiZfY3Eb7E3OcEmmXtkqe70cf3GIrM4aw7C0zPxI2j3Kyi++otSmdPDtQVbv7fMiO2WVqZuR1a72T8fZ29mpJblTbPZgmksxWcw22R10rijVEnvcCvd0FPU90ACr8Xa/kq8w1InIxsoZGXG4U7vVtrKKZHvsU+ZcxupAU4g8ymqSrt1qYVamfVQyaOGrAi3MhFxlbRC98go2r+RmyMluAOe+tchrXRzu3qL6QGvROdy55STnNss4E0oqv7O1xruBZQneoj0LOIWbjkjZzSx3swfHLt9pXnF/c70oGkmX002rbZ7S0Ui5OZHx57tsTb7G4jbk5j57t6T77kiKRqp6ZXXO4IRY5auOmPfZwFYbBEkU5fQ3a61dsiI3Wacpf9bsNd7OxWOVEI03+8umTnzpLspmpG8Mqzo5IFbvSva0FfZd7m+fheyqKBjG3CVtrxHFOodYm4orct8L2fho2TUQOC/2UGflWJeN5lWB9mBCrrI2eurN3xLqqk2DWd9I/h2VUHfCZW/aKp8O0ns+lV8j+DeV4c8gQrZn/ga2++XNAu70ZK1x73NrKNQrKd8p3Bkx81Kl5XuRr9oSGHkhOD5KfnL018jqku748pNRsqbiOZK8WbJwzK0Tlx4iq7N2DstOh6C6ow4JlpzID7skq8uG17z0brmh8PorFv3r32q8PzimIr9Vmaw60XhRSNKFrEzZa7+puetTKdnTYprkvlSb/QvSaVugC6Gxzfb0B8q6Hoorct+bs+y3Nrsl3fPi7WaGPRvJhFsF2oQJucraKnrtm1lf9MmNnc3jgalHkZe+il5367UTvcFeS07h4UlKyPciX7Um1yf1egkaHB8ttylrvCC3ehOQw9lZSjqVa2Q+4zW53pr1zCvb0x1zvV60ylSanx8DvEaqGkWXs5IDg58fdqmkuty87A2sWPS7b5WWOwuKbKEYjeCFkYyn2EcdqMu3ml14ReUGpGRPS3Hf/XOdDUW45NDYZnv6A+VeAAUV+eMfPn3K5OdFy/fXrQJtwoRcZe0avd4Mmy36t03C3Anysg4fqMndksO9myc3lST8Rmp+yc4a7+7ySiiZBZxis/YU9VpyCs+3ypAluL2wh8LileAs5kYs47fQmnEKKrL5zZal6YoCV0ho2gpNZ069TjmikK8+FoekW63WFstdHvIo/ZtnfWx+8ItOR8GVJuQ64o15/kqw1xSfoKKWqMPVz4VMe8RA2YvFB+Z6UbKnrbDvoUtID0VByf614awJjFuyqbii3Pjnq0hMel4MfZHY/ZVl+tcqWp4JucraKnrt28O+stX69N6Tt2520ed/ZqWu9fRGtctU1bnRa+2pFoO3mbzzs/uq7GdWyeHlN7C1qLvm9jQ90Jqk3E7JTekIuHW5JWTjkx83eyhsxSOvFoPziyTLT/a050qxvmCikW1INtnvnR6pwU/aY7fNFm6YXY57CkQ5ly5eziZEuad9RqyTlbFOR0KPT7a/GtXwJeHyLrb9n3wV6ruU67J7HuX+WY3eztZfVBfnoioha4xZzNqgemE1yb2i7AEp3tNR1Hd5uH0S7aFwB7bkZ1ZZH/0rKqu0rCK/U+5oixq/NAf650VVYY1wdoe6/VUFJtWVXCFoMSbkKmuD6BUXYvJyZk99jcrXpU8+cieObFN64Tp3gi7WlKbuT73zlx/Zd50+RN0YTlEhViHu5JKsdBvv3Mx6N6twa1G3R/6dT75w1c1sFjDTR343fW+Ll1VmumfBkHpD4aow8vakk7EPTA5xmp28dL1yHIKD6fTOO4NmnUPWazUypQ7Uh3inQLYqvFg8G8paclmi22btn/XCG3yfdeFZ/fKuHO/CNrJxDlwJ1s52FaHx0axRktSi2/KCKyowIMXXniPYd/+C9IbCHlivtcl6rzFZLaJY6wIoryjpQrrGHu2sisB5keWke+bOi1mvPm5Jtqq6ghcbWo0JucpaPHqbKnDzROfPAgCAlmNCrjKitxjRCwCowIRcZURvMaIXAFCBCbnKiN5iRC8AoAITcpURvQAANMSEXGVELwAADTEhVxnRCwBAQ0zIVUb0AgDQEBNylRG9AAA0xIRcZUQvAAANMSFXGdELAEBDTMhVRvQCANAQE3KVEb0AADTEhFxlRC8AAA0xIVcZ0QsAQENMyFVG9AIA0BATcpURvQAANMSEXGVELwAADTEhVxnRCwBAQ0zIVUb0AgDQEBNylRG9AAA0xIRcZVGjFwAAEL0AAERF9AIAEBXRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAERF9AIAEBXRCwBAVEQvAABREb0AAETVnOjtHF41e+z963b9o2PPBK+r9xIjLMZZjLYZdwBAC2hC9IokEJFwx4oX7v9JVyeuJjHCYpzFaJO+ANA6mhC94jlM5IEJB1x9YrTFmJvRBwA0WxOiVzyE8bwbkxhtMeZm9AEAzdaE6O3YM2EyAbGIMTejDwBoNqJ3RiB6AaB1EL0zAtELAK2D6J0RiF4AaB1E74xA9AJA6yB6ZwSiFwBaB9E7IxC9ANA6iN720L10Tc9jv3Veo7/9l5/8q9jU/+R/Pn74f1aN/++ao/+nd84jegGgdRC9beCRP5587M9/f3THKff18UP9y/QODy/55YqD/y3SVy/mEb0A0DpaK3p/sGdi1lM7zIIy//GzHXvO3zbSc++vz87a/sE9D5r1jbiv/rlog3ntnpi1/czc0bEHzMbpu3/09A0vnbmzR7zdO1uUvGWvXt+4le9cNu9CuoZ+teLgPxcs/83Kv31tVuUQvQDQOloreue8PNGx48Q9Zkmo3/G8XrNs3ubzHa+cnveQ2dAIFb3nZ6/ed9fP9931xIkfvigzeNbmvfeb7UEv3P7859c/U5am9/36s47dn83tE2+vdPT+7aJ5l9M1/PivDv6ze9k68f6nG/9Lr8wjegGgdbRW9KpQ/HzOgFnsXHD45j0TP/jNFf5vLehaVEZqK+dtOa+frc2KgCmlaaTo7RpeJZ53ux9da5aLEb0A0DpaK3o7+z64wcpa9WmzSeJ5W8Sz6el5an3nwn23bhdhOdGx6/yN618TT6sP/FJ+Lj1nUG1VgZ0k39NzX/BTMBe95pDks+6Vd9fP/GCn+u/dvnzmjv4e3SpZnXrNHu18YPDwbN0Asc8Lp370sDzMKtaK3q7X5iR7Xv/sQblm6oLR2zXyhHzeffTf9OJD/cv0r66CRO1m9AEAzdZi0dv51O2/n+h48YP75Hv1afPLJ+5VG7LofXjv7FcmOl448aPe+r0rzly/Z+Lmx5/S2XlDfUxsVzE80bHz1N1i4aGDP9wz8cNfmp8jaYHozcKy5976ZyLFb1nxu/m9r80Rsf3Kqbt/vOz+BQdvETs8e3D+gvr9P+68b/WZW1fsuG+BaYBO2VD0qi7sPHvH4vr8xftufXZc1TVl+ejtXrpG5u4jvzbLnZ2P7vi4Z/S3ZiGH6AWA1tFq0ds5f7VIPhVgVpoKafTKr1T3fHa7+WxYZdsL4/fpzN528IHOHrHnTU+duFkXsvx0x56zdyzQOxul0bv31t0T1z39mlk9cuq6PRO3Lhfvij5DHpv7ovm3Qmn0/lz+jOvBkg+0y+Sjd3DL211LV5sF5dEdp3oeI3oBoA20XPR29ozftGfiptVPqYfXNGKz6FVv3FeafLtPz3tw9207Rf79bu5L4mm4fs9T5zuePzzflGEEold9pCxj3v1sWb9mj4o9nOh9oHffnGfP3rDj/PW71D6F0as+GxePzmJx52dzltflmqkr+ZlViugFgHbRetGrnxR//8HcbeJ/x9PUdJ96z97eV5+/IHl1qc+TB0/M2nP+tvqJWeo30ndvON+x5fDtz2fPzSk/eh+s3/Xs+Y7dZ++UX9nKp97rn96bFa4+YXbS9KF9t4gn423j9/TW5z/8QulTr/FAj/rsevcZszxFRC8AXEtaMHr1r6vkX9yKx1azyv6ut2/8RpGO/35i3mKRi7+bVz8zV34gLOyYs2OiY9fEdRt2y6XR0x07zs+yfy+dUBmZ/nHRqZv+Q9R1/tbRlWqj+ium3Z/rr3LvGzo455nD6otnGckdL56aN7Rv3s/Hb9wjovfwvQvG7nlCfddbGL1jtz9zSrfzjm2iWKIXANCS0at/GyUebe+0/oo3i97OzvuHPrjlZfUp7p6J67efuTN5fpVPuuLB9xH1IbUuxPkrYUNlpDm8Y+f5G7eM391lfQv74NN3PfOZ+SR55+c3P7lb/b9t9Nz7+NlZIn13T9z26Mofrf/sOvX+pt8cnFP6Xe9dmz+Xe6ofS88d0uk+ZUQvAFxLWjJ64frVO5cefHiSn2g99ue/dy9dYxZyiF4AaB1Ebxvof3KXSF/x7Fv4eufyI388YfYOIXoBoHUQvTMC0QsArYPonRGIXgBoHUTvjED0AkDrIHpnBKIXAFoH0TsjEL0A0DqI3hmB6AWA1kH0zghELwC0jiZE73W7/nH/T7pMJuDqE6MtxtyMPgCg2ZoQvbPH3r9jhfmP4SMCMdpizM3oAwCarQnR2zm8SjyEiTzg2fdqEyMsxlmMthhzM/oAgGZrQvQKIgnEc5iIhI70P2PA6yq8xAiLcSZ3AaClNCd6AQCYsYheAACiInoBAIiK6AUAICqiFwCAqIheAACiInoBAIiK6AUAICqiFwCAqIheAACiInoBAIiK6AUAICqiFwCAqIheAACiInoBAIhq+tF7+fJl8w4AAFRWHqBl0Xv69OlVq/hvsAMAMAUiOkWAmoWQsuit1+sit0lfAAAqEqEpolMEqFkOKYteQRwsoluU8g0AACgl4lKEZnnuCpNELwAAuLKIXgAAoiJ6AQCIiugFACAqohcAgKiIXgAAoiJ6AQCIiugFACAqohcAgKiIXgAAoiJ6AQCIqKvr/wFvDfLQleGpqAAAAABJRU5ErkJggg==" width="638" height="243" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a notification card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$notificationParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId = </span><span class="token string" style="color:rgb(255, 121, 198)">"system-notifications"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Title        = </span><span class="token string" style="color:rgb(255, 121, 198)">"Backup Completed"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Message      = </span><span class="token string" style="color:rgb(255, 121, 198)">"The nightly backup completed successfully."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Severity     = </span><span class="token string" style="color:rgb(255, 121, 198)">"Good"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Details      = </span><span class="token string" style="color:rgb(255, 121, 198)">"Backup completed at 02:00 AM. No errors were encountered."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    DetailsUrl   = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com/backup-report"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$notificationCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMNotificationCard</span><span class="token plain"> @notificationParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$notificationCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"System Notification"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amservicealertcard"><code>New-AMServiceAlertCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amservicealertcard" class="hash-link" aria-label="Direct link to new-amservicealertcard" title="Direct link to new-amservicealertcard" translate="no">​</a></h3>
<p>The <code>New-AMServiceAlertCard</code> notifies users about service status changes and provides actionable options that you determine like restarting the service or acknowledging the alert.</p>
<p><img decoding="async" loading="lazy" alt="New-AMServiceAlertCard" src="https://mynster-it.dk/assets/images/New-AMServiceAlertCard-2838d6d136675cdd31d8e8ee36daf2db.png" width="633" height="361" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a service alert card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serviceAlertParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId       = </span><span class="token string" style="color:rgb(255, 121, 198)">"service-monitoring"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Server             = </span><span class="token string" style="color:rgb(255, 121, 198)">"WEBSRV01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ServiceName        = </span><span class="token string" style="color:rgb(255, 121, 198)">"IIS"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ServiceDisplayName = </span><span class="token string" style="color:rgb(255, 121, 198)">"Web Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Status             = </span><span class="token string" style="color:rgb(255, 121, 198)">"Stopped"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    MonitoringUrl      = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://monitoring.example.com/service-status"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionUrl          = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://monitoring.example.com/restart-service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionTitle        = </span><span class="token string" style="color:rgb(255, 121, 198)">"Restart Service"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serviceAlertCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMServiceAlertCard</span><span class="token plain"> @serviceAlertParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serviceAlertCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Service Alert: IIS Stopped"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amservermonitoringcard"><code>New-AMServerMonitoringCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amservermonitoringcard" class="hash-link" aria-label="Direct link to new-amservermonitoringcard" title="Direct link to new-amservermonitoringcard" translate="no">​</a></h3>
<p>The <code>New-AMServerMonitoringCard</code> helps monitor server health and notify users about issues like degraded performance or offline status.</p>
<p><img decoding="async" loading="lazy" alt="New-AMServerMonitoringCard" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnYAAADvCAIAAADwwA4MAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAACFiSURBVHhe7d1LbBR3vuhxY4dXDJYxGIINHvPyY/AAtrExJGIUwSSEiefMCWQmFyUgdENORAIi5GKxQGdh3YURD+lM2AyL5EyEr0aEBVaCWCAWBhZwxbGOiCNld87iziDdRaS5c/f3/h+/qvpXdXX73w5/u3G+H7VQP6qqq6tRf/tfXe6uagMAAAGQWAAAgiCxAAAEQWIBAAiCxAIAEASJBQAgCBILAEAQJBYAgCCyiR0cHBwbG3v69OkPAACgJJVLFU2VToloWiqxaiI19b59++QyAAAoSUVTpTO3sqnEqhTTVwAAyqLSqQIqFxypxKoOyzkAAOAtN6CpxP7www9yDgAAeMsNKIkFAODHIrEAAARBYgEACILEAgAQBIkFACAIEgsAQBAkFgCAIEgsAABBkFgAAIIgsQAABEFiAQAIgsQCABAEiQUAIAgSCwBAECQWAIAgSCwAAEGQ2LJsHO6ufbxz3ve75j3cus5edbCrYXyHvub7vpVHOhsfqzP9jcfsbW2bjm1ec6xdLgAAflLCJXbjuS11DwdqdHvUaWfN4+0rP5GbKtCmY10Nd/rmx2v7cHvDpc5NcmPkXLd5OAOL7vQsuWMS27N52RM9S/XD7fV3elceSyf24JZaPX1/4xFzcYbYdXBPAwvHexpHOjf1yBSujZ9sWTa+I3manvTVfdYpt7W1r7uk3lIMVEfLmf+wu/mgueXYtoVypZyqH29fFm+xPV1LzfQNQ/ay41y3XtqT7hZ7sb+z6Vaf3PuTvvpLHfbqxMHNDQ93zrvVJRcB4DkSKLGtn/fJi++Tgfn6pEd+dSNya6Vp/eN2pzHx24JdNXd+sd7JUvMtfeXCa3GB2tpGevSUj7fJiFbyFiV2T1e9CvCTnuY95uIMiRIrW34get+g16TJBtLq6Wi+acff6qQfuEwpPetovjVgb61OlhM9NEmsmcuc7JSLZOO0r76jL86//nNzMdFyU08p1/d0Nj7Uk817rN6g9JuQD9SNRJXt6fjZZz0SchIL4HkUJLHRIKbOGZRsPLetsSITu2mkx45Na69t3hgFVa1trRmeukG1iU29URjpTQcgu6N4Nkhi3fXc9FFXve3u422t8hjbo4LuqFejz+iBq9F8/TXzcD7pXqBv7V/xSbyju33dZ92rUontbTaXlNZr/WZpvc1mUZsubTd3191qbo3YQb+Mbtf/0bwPG//FRnPbxku9urJ2liNbFuulRScSC+B5FCSx0etvkzMErFQ/bzDtiYZfjqFtpjHbV0dj0Oc3sdpvuurMm4all0wyo4I2fmRuLWQfmkqyXE4rSGzbnl8ssQu0j72nq869aA1t00Nh6W77qnE1wcCyc+Ym7ecNeg13rFCrdGzrYrPnWcpNYgE8j4IkVl5edbeyH2dG1psP+fSrp/6Er6cpOiZonXlJVWPH9Z/16pdj9doqn2j2rXJ2cv7sup53QbQfsoylZdhUPOlZk/NuwDZg15LP2qOiJKeF1zbL/tj4pHcXZxJrt4N0KF6ZjcPdi8ye83lP+pYNpz59LPZA0uwAdOfizwveFmhFEhtttHl39EawO2zjDZhDHnJqV0SiMLHyNGXfkbi7AdLPmt04yfRKk9m97K653WgkFsBzKUhi1Stj/Fns4+0NI9nQytDk8fb6Wz31cpBR36pD+ibp0K1eSZp+bZUP9mr/GPfGDnf6VppZylxamh2rjf8i961A6zX9UaWOxMGuFbd6ak26Foz3qDtaMdLRfK2n3h5LbO/6Wtd6j8TOf9hf8/2OJbd6ltgjk6NVVUo8kLRpJrbtkgxMo7cCeYcjJeI9ybuqH/as+iQd2mxi21vsx7p3upItabftwy3r5bIMUhvsUW9Hti5KLUErrDKJBfAcC5RYZeO5bUvMnkl9etzTFB9Va16dq+902U/glPWmx/YQGHlJ/X5g6WdJmOWDvTiEdn/juHntLn9pKdk9vSlS6OgVv/wdxTmJnfekt+k35nJbx0pzsI+8dSj5QMpRPLF2bXNG28W0r7sUHXCk1mR8W4useZzY+HAn83bhcfeaeAJFDreOdj/IXuLo0LBspDUSC2BOCZdYzRwUagYr6iQf+6373Gav4GReRuUlNRn6GPJiLTsV7f5G+5nidJbmstUx+04LJaNY45kk1k2mu/zSD6QcRRO76TP7TkVtDTuN+dRzSv2dzde3myG1fn/QbCMqgUxONXfUID5rjdkdbd9DtF5PbcwSiV30eTJiJrEAnmNhE2v1dKwaN7sczV5EKc2drU2XulKnIf3Cam91xzGWfbHWH4va/Y3Rp6fTW1rCDq2KfBa72nwWG7fqmSTWXRn3mtIPpBxFE2vX3zReHtpiJ2ZT+M3mZWax8kmqG8g9navu6Gen5lYyBBfDPfogYR11e1iZ7NvX5AP71DFxfBYLYE6ZicQqyS5KedGsvrlZbkor7JCwLVSRNmfi2ae5tIQcUVz7x4LYPIMjistObLEHUo4iif3IRlHWTfa9x6NSD3YN5cFmxqCym6Hg2Kh498M5cwBzaneCXU/382D5iN09ri11pwDwfAmS2GNbll3bvL5fLiVfYmA/PbXf7xPtNzbaWz/fYr/up7BDEdvC3gY9nI0OmVGmubTExpFe+3ex+vPaaEQV/13sIueQoqCJLf1AylGY2Pb1w932z0yTv03q6VxhJlOVXfVRfByZ+Qta+3exI1vdv5eNvyZC3gQU7OaVPy9OPmkW9tDlRQ/1I80Mmu2u4/jjZ/m7WPufJEJiATzHwiTWvv5Gx8Lo8+o0UD9iX8rjrw3S30RYf6vXfOtv0Q7FzCvyQLUqX2owNM2luZLvovper3D87U7z03s+wya25ANJ8zqiOP52p+jh7Fx8fXNqR+5B8+VTcqvzTNmHYx+avT5ZSN9K+9ByPkntsDuf3SO2NHnroOd1h6ea/fYrNYv++kn77U7Zv9MlsQCeY0ESu6dz9fXti6Iv1TPN6E79iWdPR8u17QvtYaiqxM7X25aK4iH5xp/sJ4jTW1pa+qt6B+Y/7F15LrvrOHBiSz2QNL/ERqfqJztqb21Zc8jZ/rH+9jWf97rP1MLxbvn7nEObG2+plYluMgtpiRuZk1j9BJk/jY3fS1l2X7Eanub9ZdTBzY13dpi47qzJ+ztgEgvgORYksQAAgMQCABAEiQUAIAgSCwBAECQWAIAgSCwAAEGQWAAAgiCxAAAEQWIBAAiCxAIAEASJBQAgCBILAEAQJBYAgCBILAAAQZBYAACCILEAAARBYgEACILEAgAQBIkFACAIEgsAQBAkFgCAIEgsAABBBElsPwAAc45EzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOG4kFAMCLRM4biQUAwItEzhuJBQDAi0TOW8Uk9uLNJ/8+YU4PRk/KdQAAVA6JnLfKSKzq69fn5fxPxYV7f/3b3/+Pc5r8s9wSOz/+NJngL/dkC7kzRlempkwWdX3yb0/vXbDnI3r2774yZ7/6Nprl2+vmCpeaVybLoRcSLfnP38X3m7ecZ0yvc/h7AYA8EjlvFZHYE3+6+dMbuTqp02w4k3hcvPcXJ6s6ot/ppOmeJXOdH79nz+vExvPqaaR/hUGKp9RnZPn6vv46flGfNaJgF0usnt5W3FmI9tV4cj6Y5N4BYGZJ5LxVyij24Z8+lvOOE396IHuPH3x5wl518eY3F89/o6+8qRpy4Wv9byy+eOFru895Ihkcp2esAJnEasmgs9hYLZVSR/p6J0LpJDs3pUOlJnMHxOp8zupFnInVerptnhnFNgIABCaR81YZiZWapuPndjc+rz+ydSbT4ZSz6qX3GxNUtaj4yuR8ZsbZl9ewqFh5O3itbDJF0cTqRTkpje80e+8F91g8sW5Wpcf2Qopeh8zeYzPjPbU+6iH8z3Qmk/XX9yszxqvtzpi38gAwMyRy3iolsYYeZUZZ/Xj062jkqkUXs+PdZLJob7OENhJdLDJQnj15nZDSlEyInsbpluUmNpM91af4puR89i78E5se/tpl/i0zltXTRNck05spo2Wmlh/du74yWg1ngtSMWvG3IAAQkETOW0UlVovGnR+PPoh29srJjEFTw1YtKmvcWrs32DnZncwFM862vIb5JNayYYtTJ901p+ye22Tg65QpexdlJbYwb3bMWmThagVM19U6O+vmpDra8+y+UVDU9HGbCxPuZh4AZoREzlvFJVa90I7q4WZmFBspLOXJL79R05/8clSuz4xiI89FYqOW+I3S9BJksiROzpWRKEjOZ6gF967uMb0yeatn5CbWiFuuz0jv5WTuN1tKJ71xSjMz2ulJLIDKIJHzVhGJPXEy2YUbf3qqzuTs2s0ppY7xqHPc04WvJ3Jq+hwk1rmmICq5ktK44z99Pv35qL01vcx0xd36WqUSWyxv0TLVvJmlGQUPynY9qbtaz9xHnZfYIpkHgIBs4/xVxig2+d6J+LNYTVU2vl6ODc4tZcGf1SZHFMcLrPTEmpFfki5969/dvab2j3bkT3csPY2Uxk2sKVC6SXZp6dGtU+KC6ZXM6jnc4H31beYh2It5C8x736CumfxWxrKa84hc2RmLrxsAhCSR81YZif0pkuxFp5xhnw5VMoHtUGofbFKjdGJl4c5Y0yyq4C5UuuyiCnNYKmPOkFffb7I+7vRqbBpfL2tSmFjzcNJNTT1AWWB2RjWN+2ABYIZI5LyRWJRNB7vIvuIZMLv3DuCnTCLnjcRiGors0Z0BeuTNEBbA7JDIeSOxAAB4kch5I7EAAHiRyHkjsQAAeJHIeSOxAAB4kch5I7EAAHiRyHkjsQAAeJHIeSOxAAB4kch5I7EAAHiRyHmrmMQmX1P8wPw4HQAAlUUi560yElvwPf6G/VW7EqacoOIV/47f5AuE7cl8ZWDqi39l+rwvE3a/stgsJ/NNTNFP4ihTf1UyAMCSyHmriMRGP6ueMdcTa+Ln1NF8A3787bvZ777XnDTGPBL717+kfyQgm9js7ACAPBI5b5Uyis3+NKzz83bmR+g+Hn0gF+NftUtNYH+YPZI0++SXD+1kD/J+4H026aB+l22bujIaRz7LxI7fU8Nf56vzSSwATINEzltlJFZ+Gjb5WXXDGaSePH8hGuY6v7juTpCbWP1r7RVW1kheQZUkfs80sRfTRSexADANEjlvlZJY4/w3qZ9kL7IfOKnplIlVPa7Qg6eK/SJbcv0zTqw5E12ZSWzyWWxe9QEAlkTOW0UlVlPD2ZxBqgxzZc9wlOGpExvtYc6Mj2efV2Lj8kUDUJVG50rbS+/EOmVlFAsA0yCR81ZxiXXCmRT0wtfO6LacUWxEjY8rrLJ5g1QliV/eBE4aY2Uk1lyvP+slsQAwDRI5bxWR2BMn3Tomo9hvor/kufB1HEg9Ko1HsfEEqYjqQ5zs/uGPT0ShdZZQIZwjmxKhDneKl6NHyeboJxILAOWSyHmrjFGsc3iwe2ixGryqa+wBw3JgsGrnxWTAmkygxAt58OWF5LNYO1dqsZVCxS9VWX1EUlLQMIm10/89uSMSCwC+JHLeKiOxP1m6hcnHq6nUlZPYeAmykFKJlTt1E5udHQCQRyLnjcQCAOBFIueNxAIA4EUi543EAgDgRSLnjcQCAOBFIueNxAIA4EUi543EAgDgRSLnjcQCAOBFIueNxAIA4EUi543EAgDgRSLnrZISm3xLoj7Zr0Us+EL/spT6vVj3p3vkZL7x2Pk9WgAAEhI5b5WSWB28Bzk5DJfYyKz9bLv+Rn752sLU7wEk12e+vj9nYv21xtH1hd+t6NDfh2wni75Y0XF9suQvxSbzJl+v6KxPdCpcQt6MMbWEUius6NkLfinh/PjT/FUtsimcr6gsXAcAKItEzltlJFaNX5PfzEmZu4n983fx78XqljhfKRyd1+WTaYpM7H4XcQl6MmmVTmPeVxYXT+yFe5PRTc5y0nJ/S6DEjJLDkom1X56cuju9QYqtav6m0HckK1Z05QHAl0TOW0UktkRH9U0X4x3Izg/Sub+9k8x7/hu50u7sTfKpf3Inv+LZxEYro6+/EO1MTv3ajzPaTvY25w3BvSWJSn3Rf342nJ6pCYqmMaGzmvz8u6pOtlvfTRb8VEARqdWLqepPNbszo2Qvf1ExtczJb91VVdPrR1HsvnI3RWoD5r4PAIAySOS8VURiL/ypaJ9Mw6KyXrwZZfL8N0nS4vOqr25uFclnyY9Xiyc2+WFafT5ejeQXbS/eTH4jzz1ftjh7mf7lVsGZxqNthQtJtc0uwWs5Su76+KQrZ5p0YvUEzkX7GDNbw0itqjNX/kNwJsh/vwIAZZDIeav8xLoDXMlhZtQrFy/eLOiojESL91Upnljn+iSrykn7g7WZGbPL8efsvJ06sak9vaor0QeNzjg1I7uQ9IDS3J1nYvXdFVTKZ968GUskNrqpzMTmbwo9jbmevgL4sSRy3iojsV87e4DTiiQ2ezCw6l+mu4YZfRb5lDfimVh34edHbWL10NY9FX0UJehkJq/+UyQ2PbHLhCS/stmFxG1LIuebyYLgmYW4C89RfMa4qSnJykyZ2FzupnCXoM5PtaoAUJJEzltFJLa/+F7WIoktrGmRxKrpk93LuX5EYtMzlq+wi4WJjS+WiKgR7wjVZ9zxXE5i1cXsaDg6byous8dzqVmKhE2tcKnRYfEZiyRWr7wbxWkkNtkU+rG4W0zNW2IDAsBUJHLeKiOxqgPZw5E+PmGSlptYfeRR4eFF+nCkZBx54qRTwVIflE47serKBz/i89ds+Yz0lcnHh7kTp6mJvWJmu2WCHZdYTgU9M/JbaJWMVqkZi9zqBj4+pSbzTKyZhsQCeLYkct4qJbGaGm7+e7zTVQ5cyk+skhxRrE5RWZ0rzUenyfR633L+Qb/TT6yS2mU9xR7ptGKpUNdH40IVIUlCkYkv3huPRpA6mUV75gwNU4PXWIluJZnPUSqiJWdU0vPmrv+Uo9hkrvxN4Txws7Sp3qYAQEkSOW+VlNifFJ3S9HAtGmAlI7l4yFVkYnfMVzR1VryEYl0vldjoTrNLUDHLH/hqpWbUnnVii2wKZzWm2EQAMBWJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mcNxILAIAXiZw3EgsAgBeJnDcSCwCAF4mctyCJBQAAJBYAgCBILAAAQZBYAACCILEAAARBYgEACILEAgAQBIkFACAIEgsAQBAkFgCAIEgsAABBkFgAAIIgsQAABEFiAQAIgsQCABAEiQUAIAgSCwBAECQWAIAgwia2pX9f7eHP5535t6qzk5zCndQWVttZbW3Z7h54avxP09i8AKAETKx6SVKvTQ17j69Z39aCkNQWVttZbW3PDPDUlKXczQsAVsDEqjf+6oVJXqUQntraapvL1i+Jp2Ya/DcvAFgBE6ve9TNImklqa6ttLlu/JJ6aafDfvABgBUxs1dlJeXHCTFHbXLZ+STw10+O5eQHAIrFzCokNisQCKAuJnVNIbFAkFkBZSOycQmKDIrEAykJi5xQSGxSJBVAWEjunkNigSCyAspDYOYXEBkViAZSFxFaW9oFfd/7yd6nT7t/9bP1GddPW3/6316/8731X/++v//X/2YkLkdigSCyAspDYCrLz4//xy39+sOvUjfTpqw1bX7YTbNq+Z+/l/1CVtRcLkdigSCyAssxOYl84O1lz4JRcMJpfv1t1dmLpjs7Vb96t+fCLl1rl+h+jafCRWgc5DU3WfHi7fvfhtXLj9K3ZPTb/xO3lnerscK1a8nvD9vof77U/PJVzedr6frX38n92vPLWa//yv+SqAp4NKPHUaLvHku12drL6w7EVm/WjnTVtQ/VHH1WfMetzZuLFvYNy/YxTKyBbEAA8zE5i605OVp0afUkuKYMNH9hrXm58d6Lq9FjjBrnhxzCJnajdP7Li1ZEVb4wu/ki/Rte8O7xGbs91fNkHj6oPlapm05v3q4bu129RZ591Yv/lL3KuQFv/67+6/J/tL/+jOt/zX/67vbKQZwNKPDWaSezCg3a7jb0wNFl1+sYquc3LS/vvzldPolzy0zG89MOJhW8eloux1qGlp1VZHy15Q6/P8sHbtfsLppkpnpsXAKzZSayJ36O6brnY0nFl0dnJF956xl9Mb+/FtNB6rfG9CTtWlitylFXNGUpsW/8+NX5t3/UPcrm4Z5jY2t1yafU/ZDbj1BrfU+9mykzsli/mn52cP1iQT3P94j2yq3x2kVgAZZmdxNrXzbipZi+xFDf16rx5ZMmHKop69+CCt8+p0efaPXp/cl2vudWEOSrcO/XHs7UrSKzMEu2jfm3V4O0XPtVD23knbzds7bRrpe/OnFRj1vZeqbUroKY5fmPlJj2bs1gnsW3n6qIpq49c1teULzexbTve0OPXXb+xFzdsfdke/ZRL3bts/ZLUZDJDrnRiXzqgHtfdhg51trP51bEFakypHubp+3U7XzO3b129XzZj1aeP6voP15u9BXLSG+dA49t3ZYIzj158/X09kw3qwat1euKxxtSu6ZynrOr4F6vXyRWRgqdPSS92uXz6YCZ3/5ttOlV/9NE8NTofmnzh6JXV5lMJedu3/8b8M0U3jrov2YIA4GGWEttyYNk/TVZ99EWTPm/2Ep8cXW1uSBK7abhWvZofH13ZNbh67+3qs5OLXj9gX3DtWMfkVr2sm32YGy4vLhjr5CQ2iWLn6sH76vX3xb3vN3edq1N5Pn1j1bqX13RcflFNcORyc8fgmnUtTftvL9l7qqlDVsDWNC+x5iF8erdh22DztpElR66a+ypbYWLbB36t+7rzTbnc0rLr1Fedu38nFwp4NqDkU5Ozo7jm7SF19ZrdY2ojLDhwrqnj/YYjE1VDdxtU13bcmKerpq48vHLwbt3uzrVtg8uPqCfx9vKOweZNW9VWqvuvo41qy9jtbDedfTczdL++W03Q0rLu1eb+UV3HA0Nqy69NfRLfufr1uzU6hxML3x5pktDmPX1qrsxiN4y8ODQ57/d65eU5+qerza3v63djp2+rJ6tp5+iCoclqM4F5WnNbnvDcvABgzVZiW5r3q5dI82rrVFOJE6s/8jx7f5ns0zWvj8evNtk2H728tqVTTbnwwOgiu5BXVBXsSCtRMrHDS9SL7zvn5GrTiSWvqHPF9v2awZl5T1Aysa/qw6lap3lwUGFie9+70DawXy4Yu07d6PzlTCQ2Oj1asvsdc4yY2U+gEmUmsc/agjffiRPbvEE96s4WU8eiO4rj8bFpYRQ/ww5AC3cUG2u7huuOmgSevmsGrEWevuxiX9axt5/6mxVeuP+A+a8ysXSnPEerfq/eK5j/b/ppTYa8udQKyBYEAA+zltiWzqsLzUueGYzGKU1enc2Z9CkunHpNbB1a+qnq3Pv1J9TodlDvzPzgirz6R3ISG7+O2+FO+mR2jaYSu7ZrpO7I3fmnJuRw1qKJNfu09RBNhfZ+3SvTPOS1xOFOsRlLrN4a646bAd9Yo95Dbh5s+mSKqHfY1pjtU3P0qh0CphLbOrhq/43FH07UfCJzxYlNBbVkYq21XVcWfzqpn+hiT1/hQnaq+upPFvRe4qHbyzfYpy8zb5zYzBuyLDWxbEEA8DB7iZUdd1/UH3XGRtlR7N1lWwabO6JTm9kP3Dtao0Ybg6M1ZnSiRyHvXVn2Qc6rc/ZFs3Vwhdm9udwEQw2Dqt8ZThZu9gynqml3Mx69+lLXYPOm4yVHsWJtp9lpOXRbLpep4hKrbLq8eEjvNlhjR7EfXG1yt5geuRqtL9t96fbzdTexq9/Sm2vp7vfV9GtfTY1iy02sel+2Qo1K9aCzyNNXuJDWc0s/VWs1rP6zyajXjmJfSWZs7tD7HkgsgGduFhNrDz9Rr5h6GCpXua/OW67qz8mOmY/xOt5vHLxdr3fkKqfqTk1WnYn2B6oenJqocY9PjpgXzfiPdm4sVKOooYklu+1BOuavg4Ye2Y9am/ou1x26Yj4Y1q/dVR/daOwbaXz16oKzKrFXVnccfukN81ls0cQeXnbohl3PhqNqsXMoserx6vc6E7WvvmbPLHpreLXK0rbh+iNf6KfpldEX3zDbcOcNlTdJ7LvqSVRZPbVi95A9X7fzsJplqRno5ye2y27tqy/tHGnskuu0V24sODq6TD2Dr44sf+uuehaq3x1eW+zpy+u03sPx0aP58c7hDcNLTk9WnRxr6DvcrJ7ZvTeWvKanJ7EAnrnZTKw9RkkNVZc7fwXrDoDW9H3x4kn9oqxO1R/eXh69/OmRa/KKaRaS+itbYV40ZfaqTycWvHd1VVs06lJa31lx6L7sAf700aLfDplPHOODayaX7npt5dv37XGnC9+6rA9SLf5Z7Ip3zRGq5ujW+j5b8bJVZmJbWk/pv2M+Pda4ITmIVx/j/d5lXbXuL+QYY3XNoZFme6TS1iuLzW7heb8/p86/qN4SqQlOjS3ff1uWnNNCtbXN83Xm/jI3sd1XF52YsNtWP01vR3eR+/TlDoW7R19Q00TH02nxker6+bpbv0PvHSGxAJ65WU0s0n71h7+2bnLeBOT55T8/aB/4tVwo4NkAnprpIbEAykJiK8jW355RlVVj2aKnPzzd+fGoTJ2HxAZFYgGUhcTOKSQ2KBILoCwkdk4hsUGRWABlIbFzCokNisQCKAuJnVNIbFAkFkBZSOycQmKDIrEAykJi5xQSGxSJBVAWEjunkNigSCyAsgRM7Lwz/7ZmfZu8OCE8tbXVNpetXxJPzTT4b14AsAImtvbw5w175UfXMQPU1lbbXLZ+STw10+C/eQHACpjYlv596l2/emFiwBSa2sJqO6utrba5bP2SeGrKUu7mBQArYGIV9ZKk3vir16Yq85XrnAKd1BZW27msAPDU+J+msXkBQAmbWAAAfrJILAAAQZBYAACCILEAAARBYgEACILEAgAQBIkFACAIEgsAQBAkFgCAIEgsAABBkFgAAIIgsQAABEFiAQAIgsQCABAEiQUAIIipE/v06VM5BwAAvOUGNJXYsbGxffv4MWoAAMqg0qkCKhccqcQODg6qDlNZAAA8qWiqdKqAymVHKrGKmkilWE39AwAAKEnlUkUzt69KNrEAAOCZILEAAARBYgEACILEAgAQBIkFACAIEgsAQBAkFgCAANra/j/ed247eAH4lgAAAABJRU5ErkJggg==" width="630" height="239" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a server monitoring card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverMonitoringParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId  = </span><span class="token string" style="color:rgb(255, 121, 198)">"server-monitoring"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Server        = </span><span class="token string" style="color:rgb(255, 121, 198)">"DCSRV01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Status        = </span><span class="token string" style="color:rgb(255, 121, 198)">"Offline"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    MonitoringUrl = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://monitoring.example.com/servers/DCSRV01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionUrl     = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://monitoring.example.com/restart-server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionTitle   = </span><span class="token string" style="color:rgb(255, 121, 198)">"Restart Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverMonitoringCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMServerMonitoringCard</span><span class="token plain"> @serverMonitoringParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverMonitoringCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Server Alert: DCSRV01 Offline"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amserverpurposesurveycard"><code>New-AMServerPurposeSurveyCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amserverpurposesurveycard" class="hash-link" aria-label="Direct link to new-amserverpurposesurveycard" title="Direct link to new-amserverpurposesurveycard" translate="no">​</a></h3>
<p>The <code>New-AMServerPurposeSurveyCard</code> collects information about a server’s purpose, criticality, and maintenance preferences.</p>
<p><img decoding="async" loading="lazy" alt="New-AMServerPurposeSurveyCard" src="https://mynster-it.dk/assets/images/New-AMServerPurposeSurveyCard-bccb8b84d99df5cc39d10a9f8ef8b413.png" width="633" height="1151" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a server purpose survey card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverSurveyParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId       = </span><span class="token string" style="color:rgb(255, 121, 198)">"server-survey"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ServerName         = </span><span class="token string" style="color:rgb(255, 121, 198)">"SVR-APP-001"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OperatingSystem    = </span><span class="token string" style="color:rgb(255, 121, 198)">"Windows Server 2019"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    DetectedServices   = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"IIS"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SQL Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    PurposeChoices     = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"application"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Application Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"database"</span><span class="token plain">    = </span><span class="token string" style="color:rgb(255, 121, 198)">"Database Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    CriticalityChoices = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"critical"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Mission Critical"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"high"</span><span class="token plain">     = </span><span class="token string" style="color:rgb(255, 121, 198)">"High"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    MaintenanceChoices = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"weekends"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Weekends Only"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"nights"</span><span class="token plain">   = </span><span class="token string" style="color:rgb(255, 121, 198)">"Weeknights"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverSurveyCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMServerPurposeSurveyCard</span><span class="token plain"> @serverSurveyParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serverSurveyCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Server Purpose Survey"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amitresourcerequestcard"><code>New-AMITResourceRequestCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amitresourcerequestcard" class="hash-link" aria-label="Direct link to new-amitresourcerequestcard" title="Direct link to new-amitresourcerequestcard" translate="no">​</a></h3>
<p>The <code>New-AMITResourceRequestCard</code> simplifies IT resource requests with predefined fields for resource type, urgency, and justification.</p>
<p><img decoding="async" loading="lazy" alt="New-AMITResourceRequestCard" src="https://mynster-it.dk/assets/images/New-AMITResourceRequestCard-9d82f959ea3f69641ea453da6b2a04e3.png" width="636" height="1784" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create an IT resource request card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceRequestParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId = </span><span class="token string" style="color:rgb(255, 121, 198)">"it-resource-requests"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    RequestHeader = </span><span class="token string" style="color:rgb(255, 121, 198)">"Request New Hardware"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    RequestDescription = </span><span class="token string" style="color:rgb(255, 121, 198)">"Use this form to request new hardware resources."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    UrgencyChoices = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"critical"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Critical"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"high"</span><span class="token plain">     = </span><span class="token string" style="color:rgb(255, 121, 198)">"High"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"medium"</span><span class="token plain">   = </span><span class="token string" style="color:rgb(255, 121, 198)">"Medium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"low"</span><span class="token plain">      = </span><span class="token string" style="color:rgb(255, 121, 198)">"Low"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceRequestCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMITResourceRequestCard</span><span class="token plain"> @resourceRequestParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$resourceRequestCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"IT Resource Request"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amapprovalcard"><code>New-AMApprovalCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amapprovalcard" class="hash-link" aria-label="Direct link to new-amapprovalcard" title="Direct link to new-amapprovalcard" translate="no">​</a></h3>
<p>The <code>New-AMApprovalCard</code> streamlines approval workflows with customizable actions for approving or rejecting requests.</p>
<p><img decoding="async" loading="lazy" alt="New-AMApprovalCard" src="https://mynster-it.dk/assets/images/New-AMApprovalCard-5d21021cda37a19b663501a3d4b706fd.png" width="641" height="421" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create an approval card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approvalParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId = </span><span class="token string" style="color:rgb(255, 121, 198)">"approval-system"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Title        = </span><span class="token string" style="color:rgb(255, 121, 198)">"Leave Request Approval"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    RequestID    = </span><span class="token string" style="color:rgb(255, 121, 198)">"REQ-2023-002"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Requester    = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane Smith"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ApproveUrl   = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.example.com/approve"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    RejectUrl    = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://api.example.com/reject"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approvalCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMApprovalCard</span><span class="token plain"> @approvalParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approvalCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Approval Request: Leave Request"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"manager@example.com"</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amapplicationusagesurveycard"><code>New-AMApplicationUsageSurveyCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amapplicationusagesurveycard" class="hash-link" aria-label="Direct link to new-amapplicationusagesurveycard" title="Direct link to new-amapplicationusagesurveycard" translate="no">​</a></h3>
<p>The <code>New-AMApplicationUsageSurveyCard</code> gathers feedback on application usage, importance, and improvement suggestions.</p>
<p><img decoding="async" loading="lazy" alt="New-AMApplicationUsageSurveyCard" src="https://mynster-it.dk/assets/images/New-AMApplicationUsageSurveyCard-22f4504c79874115925e0e996984f855.png" width="633" height="1570" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create an application usage survey card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appSurveyParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId      = </span><span class="token string" style="color:rgb(255, 121, 198)">"app-survey"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ApplicationName   = </span><span class="token string" style="color:rgb(255, 121, 198)">"Microsoft Excel"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Version           = </span><span class="token string" style="color:rgb(255, 121, 198)">"2021"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Department        = </span><span class="token string" style="color:rgb(255, 121, 198)">"Finance"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    FrequencyChoices  = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"daily"</span><span class="token plain">   = </span><span class="token string" style="color:rgb(255, 121, 198)">"Daily"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"weekly"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"Weekly"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"monthly"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Monthly"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appSurveyCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMApplicationUsageSurveyCard</span><span class="token plain"> @appSurveyParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$appSurveyCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Application Usage Survey"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"user@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-amdiskspacealertcard"><code>New-AMDiskSpaceAlertCard</code><a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#new-amdiskspacealertcard" class="hash-link" aria-label="Direct link to new-amdiskspacealertcard" title="Direct link to new-amdiskspacealertcard" translate="no">​</a></h3>
<p>The <code>New-AMDiskSpaceAlertCard</code> alerts users about low disk space and provides actionable options like cleanup or acknowledgment.</p>
<p><img decoding="async" loading="lazy" alt="New-AMDiskSpaceAlertCard" src="https://mynster-it.dk/assets/images/New-AMDiskSpaceAlertCard-00889bacb809320b7b76e100869f7190.png" width="633" height="432" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a disk space alert card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$diskAlertParams</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    OriginatorId = </span><span class="token string" style="color:rgb(255, 121, 198)">"disk-monitoring"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Server       = </span><span class="token string" style="color:rgb(255, 121, 198)">"SQLSRV01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Drive        = </span><span class="token string" style="color:rgb(255, 121, 198)">"C:"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    FreeSpace    = </span><span class="token string" style="color:rgb(255, 121, 198)">"5 GB"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    TotalSize    = </span><span class="token string" style="color:rgb(255, 121, 198)">"100 GB"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionUrl    = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com/cleanup"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ActionTitle  = </span><span class="token string" style="color:rgb(255, 121, 198)">"Clean Up Disk"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$diskAlertCard</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMDiskSpaceAlertCard</span><span class="token plain"> @diskAlertParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$diskAlertCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Disk Space Alert: SQLSRV01"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"admin@example.com"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-actionable-messages-and-how-to-send-it">Getting started with Actionable Messages and how to send it<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#getting-started-with-actionable-messages-and-how-to-send-it" class="hash-link" aria-label="Direct link to Getting started with Actionable Messages and how to send it" title="Direct link to Getting started with Actionable Messages and how to send it" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-provider-for-actionable-messages">Setting up your provider for actionable messages<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#setting-up-your-provider-for-actionable-messages" class="hash-link" aria-label="Direct link to Setting up your provider for actionable messages" title="Direct link to Setting up your provider for actionable messages" translate="no">​</a></h3>
<p>First off, before we are able to send an actionable message, we need to set up a Provider in the "Actionable Email Developer Dashboard"</p>
<ul>
<li class="">Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/publish" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/publish</a>
<ul>
<li class=""><em>Note you might have to have outlook on the web open first</em></li>
<li class=""><em>Note that if you are not using "Test Users" either your Exchange Administrator or Global administrator has to approve this provider before you can use it</em></li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Actionable Email Developer Dashboard" src="https://mynster-it.dk/assets/images/Actionable_Email_Developer_Dashboard-917b87b4bb822a1c6f39afeaf02cd5af.png" width="1198" height="224" class="img_ev3q"></p>
<p>Click the "New Provider"</p>
<p>Here you will need to setup the following as a minimum:
<em>None of these settings can be changed later, you will need to create a new provider if you need any changes made.</em></p>
<ul>
<li class="">Friendly Name (Any name you would like to use for the provider, I would recommend calling it something that makes sense to what you are doing)</li>
<li class="">Sender email address from which actionable emails will originate (This is the email that will be used to send your actionable message can be multiple emails)</li>
<li class="">Who are you enabling this for? (If you are just testing then just chose Test Users) and set the emails in the <em>Test user email addresses seperated with ";" The test scenario will be auto-approved but can also only be used for the users that you specify.</em> For production use case use the <code>Organization</code></li>
<li class="">Checkmark in "I accept the terms and conditions of the"</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Provider Setup" src="https://mynster-it.dk/assets/images/Provider_Setup-39d8036edea7c05a8a9dfdc94a7558f5.png" width="1111" height="1271" class="img_ev3q"></p>
<p>After you have filled in minimum requirements press on save <em>If you have selected <code>Organization</code> you will need your exchange administrator or global administrator to approve it and the requst can be seen by them on the below url</em></p>
<p><a href="https://outlook.office.com/connectors/oam/admin" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/admin</a></p>
<p>Once approved copy the <code>Provider Id (originator)</code> as we will need this for when we are sending our actionable messages</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sample-script-to-actually-send-a-card">Sample script to actually send a card<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#sample-script-to-actually-send-a-card" class="hash-link" aria-label="Direct link to Sample script to actually send a card" title="Direct link to Sample script to actually send a card" translate="no">​</a></h3>
<p>If you are unsure of how you can send an adaptive card using powershell you can add the following to a .ps1 file</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Your originator id if you are unsure how to get one please have a look at this part:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">#</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"your-originator-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Tenant ID, Client ID, and Client Secret for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"your tenant id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"a client id for an app with access to send mails on your behalf"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"the secret for the above appp"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userToSendTo</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"your own email address"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    The card you would like to test goes below here please use the variable $card for your card</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    The card you would like to test goes above here please use the variable $card for your card</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"System Notification"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userToSendTo</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CreateGraphParams </span><span class="token operator">-</span><span class="token plain">FallbackText </span><span class="token string" style="color:rgb(255, 121, 198)">"Your email client doesn't support Adaptive Cards"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userToSendTo</span><span class="token string" style="color:rgb(255, 121, 198)">/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/04/27/ActionableMessagesModuleWhatsNew#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>These new prebuilt cards make it easier than ever to create Adaptive Cards for common scenarios. Whether you’re notifying users, gathering feedback, or managing approvals, the ActionableMessages PowerShell module has you covered.</p>
<p>For more details, check out the <a href="https://mynster9361.github.io/modules/actionablemessages/" target="_blank" rel="noopener noreferrer" class="">documentation</a> or the <a href="https://github.com/Mynster9361/ActionableMessages" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>mail</category>
            <category>adaptive cards</category>
            <category>actionable messages</category>
        </item>
        <item>
            <title><![CDATA[ActionableMessages PowerShell Module - Building Interactive Emails Made Easy]]></title>
            <link>https://mynster-it.dk/2025/04/01/ActionableMessagesModule</link>
            <guid>https://mynster-it.dk/2025/04/01/ActionableMessagesModule</guid>
            <pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing the ActionableMessages PowerShell module - a powerful way to create interactive Adaptive Cards for email]]></description>
            <content:encoded><![CDATA[<p>Introducing the ActionableMessages PowerShell module - a powerful way to create interactive Adaptive Cards for email</p>
<p>Creating interactive Adaptive Cards for email using Microsoft's Actionable Messages has never been easier.</p>
<p>In my <a class="" href="https://mynster-it.dk/2025/03/04/ActionableMessages">previous post</a>, we explored the raw JSON approach to creating these cards.</p>
<p>Today, I'm excited to introduce my PowerShell module that simplifies the entire process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="installing-the-module">Installing the Module<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#installing-the-module" class="hash-link" aria-label="Direct link to Installing the Module" title="Direct link to Installing the Module" translate="no">​</a></h2>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Install from PowerShell Gallery</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Install-Module</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Name ActionableMessages </span><span class="token operator">-</span><span class="token plain">Scope CurrentUser</span><br></div></code></pre></div></div>
<h1>Why Use This Module?</h1>
<ul>
<li class="">Simplified Syntax: Create complex cards with intuitive PowerShell commands</li>
<li class="">Reduced Errors: No more struggling with nested JSON and escaping special characters</li>
<li class="">Improved Readability: Clean PowerShell code instead of complex JSON structures</li>
<li class="">Reusable Components: Build and save card components for reuse</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage">Basic Usage<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#basic-usage" class="hash-link" aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate="no">​</a></h2>
<p>Let's start with a simple example:
OVA result:</p>
<p><img decoding="async" loading="lazy" alt="simple example ova" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-Basic-ova-bde5193cefd47e5d81eff4afceaedd1c.png" width="1862" height="320" class="img_ev3q"></p>
<p>Mobile result:</p>
<p><img decoding="async" loading="lazy" alt="simple example mobile" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-Basic-mobile-87c914608d7555dbcc4ecadb8e3e9781.png" width="1080" height="2412" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Import the module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> ActionableMessages</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a new card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OriginatorId </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a title</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$title</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"Hello World"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Large"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Weight </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Color </span><span class="token string" style="color:rgb(255, 121, 198)">"Accent"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$title</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add a button</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$action</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMOpenUrlAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Visit our website"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMActionSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Actions @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Export to HTML for email</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Test Card"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CreateGraphParams </span><span class="token operator">-</span><span class="token plain">FallbackText </span><span class="token string" style="color:rgb(255, 121, 198)">"Your email client doesn't support Adaptive Cards"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Graph parameters created successfully."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/John.Doe@contoso.com/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-examples">Advanced Examples<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#advanced-examples" class="hash-link" aria-label="Direct link to Advanced Examples" title="Direct link to Advanced Examples" translate="no">​</a></h2>
<p>Now let's recreate the examples from my previous post using this module.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="pto-request-card">PTO Request Card<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#pto-request-card" class="hash-link" aria-label="Direct link to PTO Request Card" title="Direct link to PTO Request Card" translate="no">​</a></h4>
<p>OVA result:</p>
<p><img decoding="async" loading="lazy" alt="pto example ova" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-PTO-ova-3d39b403134681cc917b25203cc30c7f.png" width="1892" height="516" class="img_ev3q"></p>
<p>Mobile result:</p>
<p><img decoding="async" loading="lazy" alt="pto example mobile" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-PTO-mobile-5b0148e7ced6c106c5aafd589e226310.png" width="1080" height="2411" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Import the module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> ActionableMessages</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a new card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OriginatorId </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add header</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"PTO Request from John Doe"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Medium"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Weight </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create person info container</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$personContainer</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMContainer</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Id </span><span class="token string" style="color:rgb(255, 121, 198)">"person-container"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$personContainer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create columns for person info</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$imageColumn</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMColumn</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Width </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Items @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMImage</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://amdesigner.azurewebsites.net/samples/assets/Miguel_Garcia.png"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">AltText </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$infoColumn</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMColumn</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Width </span><span class="token string" style="color:rgb(255, 121, 198)">"stretch"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Items @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Weight </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"Requested on: </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function operator" style="color:rgb(80, 250, 123)">-</span><span class="token string function" style="color:rgb(80, 250, 123)">Format </span><span class="token string function string" style="color:rgb(255, 121, 198)">'yyyy-MM-dd'</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">IsSubtle </span><span class="token boolean">$true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"Reason: Family visit"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">IsSubtle </span><span class="token boolean">$true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add columns to a column set</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$columnSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMColumnSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Columns @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$imageColumn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$infoColumn</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">id </span><span class="token string" style="color:rgb(255, 121, 198)">"person-columns"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$columnSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">ContainerId </span><span class="token string" style="color:rgb(255, 121, 198)">"person-container"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add date information</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$facts</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFact</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"From:"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Until:"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFact</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"2023-06-01"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"2023-06-10"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFactSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Facts </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$facts</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add approve/reject actions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approveAction</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMExecuteAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Approve"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verb </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://your-logic-app-url"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token string" style="color:rgb(255, 121, 198)">'{"Action":"Approve","user":"john.doe@contoso.com"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rejectAction</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMExecuteAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Reject"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verb </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://your-logic-app-url"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token string" style="color:rgb(255, 121, 198)">'{"Action":"Reject","user":"john.doe@contoso.com"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMActionSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Actions @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approveAction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rejectAction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or create Microsoft Graph params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"PTO Request"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"john.doe@contoso.com"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CreateGraphParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/john.doe@contoso.com/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="access-request-with-choice-selection">Access Request with Choice Selection<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#access-request-with-choice-selection" class="hash-link" aria-label="Direct link to Access Request with Choice Selection" title="Direct link to Access Request with Choice Selection" translate="no">​</a></h4>
<p>OVA result:</p>
<p><img decoding="async" loading="lazy" alt="access request example ova" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-AccessRequest-ova-f07b4c4a85e9cfb284d84fda472c32f3.png" width="1868" height="477" class="img_ev3q"></p>
<p>Mobile result:</p>
<p><img decoding="async" loading="lazy" alt="access request example mobile" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-AccessRequest-mobile-9f7311120efa96345ea262867b4bc9ab.png" width="1080" height="2412" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Import the module</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Import-Module</span><span class="token plain"> ActionableMessages</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create a new card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OriginatorId </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add header</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMTextBlock</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Text </span><span class="token string" style="color:rgb(255, 121, 198)">"Access Request from John Doe"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Size </span><span class="token string" style="color:rgb(255, 121, 198)">"Medium"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Weight </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create choice set for group selection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choices</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 1"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Group1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 2"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Group2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 3"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Group3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 4"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Group4"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoiceSetInput</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Id </span><span class="token string" style="color:rgb(255, 121, 198)">"groupSelection"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Choices </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choices</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Style </span><span class="token string" style="color:rgb(255, 121, 198)">"expanded"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">IsMultiSelect </span><span class="token boolean">$true</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Placeholder </span><span class="token string" style="color:rgb(255, 121, 198)">"Select groups to approve"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add approve/reject actions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approveAction</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMExecuteAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Approve Selected"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verb </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://your-logic-app-url"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token string" style="color:rgb(255, 121, 198)">'{"Action":"Approve","Approved_groups":"{{groupSelection.value}}","user":"john.doe@contoso.com"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rejectAction</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMExecuteAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Reject All"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verb </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://your-logic-app-url"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token string" style="color:rgb(255, 121, 198)">'{"Action":"Reject","Approved_groups":"","user":"john.doe@contoso.com"}'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMActionSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Actions @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$approveAction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$rejectAction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Export for email</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$emailHtml</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Select New Owner"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FallbackText </span><span class="token string" style="color:rgb(255, 121, 198)">"Please select a new owner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or create Microsoft Graph params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Access Request"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"john.doe@contoso.com"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CreateGraphParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/john.doe@contoso.com/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-owner-selection-card">New Owner Selection Card<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#new-owner-selection-card" class="hash-link" aria-label="Direct link to New Owner Selection Card" title="Direct link to New Owner Selection Card" translate="no">​</a></h4>
<p>OVA result:</p>
<p><img decoding="async" loading="lazy" alt="new owner example ova" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-NewOwner-ova-9d9d715701dea964aab77bb119c5668d.png" width="1886" height="431" class="img_ev3q"></p>
<p>Mobile result:</p>
<p><img decoding="async" loading="lazy" alt="new owner1 example mobile" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-NewOwner1-mobile-a02da8791b7445c8a9620cf1ab4b32c6.png" width="1080" height="2412" class="img_ev3q"></p>
<p>Mobile result selection:</p>
<p><img decoding="async" loading="lazy" alt="new owner2 example mobile" src="https://mynster-it.dk/assets/images/2025-04-01-ActionableMessagesModule-NewOwner2-mobile-b74b2710a5f643ace267e49b29449754.png" width="1080" height="2412" class="img_ev3q"></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Create a new card with header and info (similar to previous examples)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMCard</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OriginatorId </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add facts about resources needing new owner</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$facts</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFact</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Group_Name"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFact</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"service_user"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFact</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># More facts as needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMFactSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Facts </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$facts</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Id </span><span class="token string" style="color:rgb(255, 121, 198)">"facts"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create choice set for new owner selection</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choices</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Bob Bob"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Bob.Bob@contoso.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane Doe"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoice</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Shane Doe"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Value </span><span class="token string" style="color:rgb(255, 121, 198)">"Shane.Doe@contoso.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMChoiceSetInput</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Id </span><span class="token string" style="color:rgb(255, 121, 198)">"choice"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Choices </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choices</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Placeholder </span><span class="token string" style="color:rgb(255, 121, 198)">"Please choose one of your direct reports as the new owner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Transform objects for the payload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objects</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Name = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group_Name"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Name = </span><span class="token string" style="color:rgb(255, 121, 198)">"service_user"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> Name = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># More objects as needed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJson</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objects</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Compress</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Add action</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$selectAction</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMExecuteAction</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Title </span><span class="token string" style="color:rgb(255, 121, 198)">"Select new owner"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Verb </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Url </span><span class="token string" style="color:rgb(255, 121, 198)">"https://your-logic-app-url"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token string" style="color:rgb(255, 121, 198)">"{`"Action`":`"Approve`",`"New_Owner`":`"{{choice.value}}`",`"Old_Owner`":`"john.doe@contoso.com`",`"Objects`":</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJson</span><span class="token string" style="color:rgb(255, 121, 198)">}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">New-AMActionSet</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Actions @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$selectAction</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Add-AMElement</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Element </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$actionSet</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Export for email</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$emailHtml</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Select New Owner"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">FallbackText </span><span class="token string" style="color:rgb(255, 121, 198)">"Please select a new owner"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Or create Microsoft Graph params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Export-AMCardForEmail</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Card </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$card</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Subject </span><span class="token string" style="color:rgb(255, 121, 198)">"Select New Owner"</span><span class="token plain"> `</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token operator">-</span><span class="token plain">ToRecipients </span><span class="token string" style="color:rgb(255, 121, 198)">"john.doe@contoso.com"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">CreateGraphParams</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphParams</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 50</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain">  = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/john.doe@contoso.com/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="converting-back-and-forth">Converting Back and Forth<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#converting-back-and-forth" class="hash-link" aria-label="Direct link to Converting Back and Forth" title="Direct link to Converting Back and Forth" translate="no">​</a></h2>
<p>If you already have JSON or want to create it with the <a href="https://amdesigner.azurewebsites.net/" target="_blank" rel="noopener noreferrer" class="">Microsoft Actionable Message Designer</a> and want to convert it to PowerShell commands:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Convert JSON to PowerShell commands</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$json</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Content</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Path </span><span class="token string" style="color:rgb(255, 121, 198)">"existing-card.json"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Raw</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$psCommands</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-AMScriptFromJson</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Json </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">OutputPath </span><span class="token string" style="color:rgb(255, 121, 198)">"card-script.ps1"</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits-over-raw-json">Benefits Over Raw JSON<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#benefits-over-raw-json" class="hash-link" aria-label="Direct link to Benefits Over Raw JSON" title="Direct link to Benefits Over Raw JSON" translate="no">​</a></h2>
<ol>
<li class="">Simplified Development: No need to manually construct complex JSON</li>
<li class="">IntelliSense Support: Get command completion and parameter help</li>
<li class="">Cleaner Syntax: PowerShell's pipeline and object model leads to cleaner code</li>
<li class="">Reusable Components: Build libraries of card elements</li>
<li class="">Easier Debugging: PowerShell error messages are clearer than JSON parsing errors</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/04/01/ActionableMessagesModule#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The ActionableMessages module transforms the complex JSON structure in your scripts for creating Adaptive Cards into a simple, intuitive PowerShell experience.</p>
<p>For more information and source code, check out the <a href="https://github.com/Mynster9361/ActionableMessages" target="_blank" rel="noopener noreferrer" class="">GitHub repository.</a></p>
<p>And also the <a href="https://mynster9361.github.io/modules/actionablemessages/" target="_blank" rel="noopener noreferrer" class="">documentation.</a></p>
<p>Reference Links</p>
<ul>
<li class=""><a href="https://www.powershellgallery.com/packages/ActionableMessages/" target="_blank" rel="noopener noreferrer" class="">Module on PowerShell Gallery</a></li>
<li class=""><a href="https://amdesigner.azurewebsites.net/" target="_blank" rel="noopener noreferrer" class="">Actionable Message Designer</a></li>
<li class=""><a href="https://learn.microsoft.com/en-us/outlook/actionable-messages/get-started" target="_blank" rel="noopener noreferrer" class="">Microsoft Actionable Messages Documentation</a></li>
<li class=""><a href="https://mynster9361.github.io/modules/actionablemessages/" target="_blank" rel="noopener noreferrer" class="">Actionable Email Developer Dashboard</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>mail</category>
            <category>adaptive cards</category>
            <category>actionable messages</category>
        </item>
        <item>
            <title><![CDATA[Adaptive Cards to Email through MS Graph (Actionable messages) Part 2]]></title>
            <link>https://mynster-it.dk/2025/03/11/ActionableMessagesPart2</link>
            <guid>https://mynster-it.dk/2025/03/11/ActionableMessagesPart2</guid>
            <pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating how to send an approval adaptive card (Actionable messages) through MS Graph]]></description>
            <content:encoded><![CDATA[<p>Demonstrating how to send an approval adaptive card (Actionable messages) through MS Graph</p>
<ul>
<li class="">App registration/service principal with correct permissions</li>
<li class="">Token for MS Graph</li>
<li class="">Permissions on the endpoint you are using</li>
<li class="">Read the previous article <a class="" href="https://mynster-it.dk/2025/03/04/ActionableMessages">https://mynster-it.dk/2025/03/04/ActionableMessages</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-cases--examples">Use Cases / Examples<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#use-cases--examples" class="hash-link" aria-label="Direct link to Use Cases / Examples" title="Direct link to Use Cases / Examples" translate="no">​</a></h2>
<p>This blog post will not go to much into the nitty gritty of how it works but will cover some use cases that you might see or have or you can use it to develop your own use cases / adaptive cards your imagination and ideas are the only things setting the limit for you (Aswell as what is possible with adaptive cards of course :) )</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-pto-request">1. PTO request<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#1-pto-request" class="hash-link" aria-label="Direct link to 1. PTO request" title="Direct link to 1. PTO request" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="PTO Request" src="https://mynster-it.dk/assets/images/2025-03-11-ActionableMessagesPart2PTO-4e8f16393a1c9d3df8662936a77a062e.png" width="648" height="236" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="json">JSON<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#json" class="hash-link" aria-label="Direct link to JSON" title="Direct link to JSON" translate="no">​</a></h4>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AdaptiveCard"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"originator"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($originatorId)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"hideOriginalBody"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"`$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ColumnSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"style"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Person"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userImage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"altText"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"size"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"weight"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requested on the: $date"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Reason: $reason"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stretch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"FactSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"facts"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"From:"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Untill:"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$fromDate"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$toDate"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ActionSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"actions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Action.Http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"iconUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"{\"Action\":\"Approve\",\"user\":\"$($userUPN)\"}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($httpURL)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Action.Http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Reject"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reject"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"{\"Action\":\"Reject\",\"user\":\"$($userUPN)\"}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$httpURL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-script">Powershell script:<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#powershell-script" class="hash-link" aria-label="Direct link to Powershell script:" title="Direct link to Powershell script:" translate="no">​</a></h4>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Originator id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your originator id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Your url for the logic app saved from earlier the same one used for the `HTTP URL`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your logic app url"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Tenant ID, Client ID, and Client Secret for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-tenant-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-client-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-Secret"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Example values for other variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"PTO request from </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"I need to visit family"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">get-date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">format </span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd, HH:mm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$fromDate</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">get-date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">format </span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">date </span><span class="token string" style="color:rgb(255, 121, 198)">"2026-01-01"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$toDate</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">get-date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">format </span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">date </span><span class="token string" style="color:rgb(255, 121, 198)">"2026-01-10"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    message         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        subject      = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        body         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            content     = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;meta http-equiv="</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token string" style="color:rgb(255, 121, 198)">" content="</span><span class="token plain">text/html</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> charset=utf-8</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;script type="</span><span class="token plain">application/adaptivecard+json</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">AdaptiveCard</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">version</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">2</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">originator</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">hideOriginalBody</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$schema</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">http:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token plain">adaptivecards</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">io/schemas/adaptive-card</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">json</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ColumnSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">columns</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Image</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Person</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">altText</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">size</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Small</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">auto</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">weight</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Bolder</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Requested on the: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Reason: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">stretch</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">FactSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">facts</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">From</span><span class="token plain">:</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Untill:</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$fromDate</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$toDate</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ActionSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">actions</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Approve</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">approve</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">iconUrl</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Action\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"Approve\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"user\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Reject</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">reject</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Action\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"Reject\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"user\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/script&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;p&gt;Please find a new owner for the group and fill it in below and press submit. Thank you ín advance! &lt;/p&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        toRecipients = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    saveToSentItems = </span><span class="token string" style="color:rgb(255, 121, 198)">"false"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/{user-id or UPN to send the mail from}/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$request</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-access-request">2. Access request<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#2-access-request" class="hash-link" aria-label="Direct link to 2. Access request" title="Direct link to 2. Access request" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Access Request" src="https://mynster-it.dk/assets/images/2025-03-11-ActionableMessagesPart2AccessRequest-796f66bcd39b8fa9ae463aaf4d091328.png" width="649" height="294" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-1">JSON<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#json-1" class="hash-link" aria-label="Direct link to JSON" title="Direct link to JSON" translate="no">​</a></h4>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AdaptiveCard"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"originator"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($originatorId)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"hideOriginalBody"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"`$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ColumnSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"style"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Person"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userImage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"altText"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"size"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"weight"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requested on the: $date"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Reason: $reason"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stretch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Input.ChoiceSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"choices"</span><span class="token operator">:</span><span class="token plain"> $($choiceSet | convertto-json)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"placeholder"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Placeholder text"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"style"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"expanded"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"isMultiSelect"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"groupSelection"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ActionSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"actions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Action.Http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Approve selected"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"iconUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"{\"Action\":\"Approve\",\"Approved_groups\":\"{{groupSelection.value}}\",\"user\":\"$($userUPN)\"}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($httpURL)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Action.Http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Reject All"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"reject"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"{\"Action\":\"Reject\",\"Approved_groups\":\"{{groupSelection.value}}\",\"user\":\"$($userUPN)\"}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$httpURL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-script-1">Powershell script:<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#powershell-script-1" class="hash-link" aria-label="Direct link to Powershell script:" title="Direct link to Powershell script:" translate="no">​</a></h4>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Originator id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your originator id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Your url for the logic app saved from earlier the same one used for the `HTTP URL`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your logic app url"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Tenant ID, Client ID, and Client Secret for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-tenant-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-client-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-Secret"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Example values for other variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Access request from </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"I am new in the company and need more permissions"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">get-date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">format </span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd, HH:mm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group Name 4"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group4"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    message         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        subject      = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        body         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            content     = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;meta http-equiv="</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token string" style="color:rgb(255, 121, 198)">" content="</span><span class="token plain">text/html</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> charset=utf-8</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;script type="</span><span class="token plain">application/adaptivecard+json</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">AdaptiveCard</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">version</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">2</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">originator</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">hideOriginalBody</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$schema</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">http:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token plain">adaptivecards</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">io/schemas/adaptive-card</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">json</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ColumnSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">columns</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Image</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Person</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">altText</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">size</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Small</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">auto</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">weight</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Bolder</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Requested on the: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Reason: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">stretch</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ChoiceSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">choices</span><span class="token string" style="color:rgb(255, 121, 198)">": </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function" style="color:rgb(80, 250, 123)">convertto-json</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">placeholder</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Placeholder text</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">expanded</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Small</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">isMultiSelect</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">groupSelection</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ActionSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">actions</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Approve selected</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">approve</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">iconUrl</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Action\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"Approve\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Approved_groups\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"{{groupSelection.value}}\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"user\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Reject All</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">reject</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Action\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"Reject\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Approved_groups\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"{{groupSelection.value}}\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"user\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/script&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;p&gt;Please find a new owner for the group and fill it in below and press submit. Thank you ín advance! &lt;/p&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        toRecipients = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    saveToSentItems = </span><span class="token string" style="color:rgb(255, 121, 198)">"false"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/{user-id or UPN to send the mail from}/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$request</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<p>And our body will look like this in our logic app returning only the groups selected which we can continue to work off</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Action"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"Approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Approved_groups"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"Group2,Group4"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"user"</span><span class="token operator">:</span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-who-should-be-the-new-ownerapprover">3. Who should be the new owner/approver?<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#3-who-should-be-the-new-ownerapprover" class="hash-link" aria-label="Direct link to 3. Who should be the new owner/approver?" title="Direct link to 3. Who should be the new owner/approver?" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="New Owner" src="https://mynster-it.dk/assets/images/2025-03-11-ActionableMessagesPart2NewOwner-4da061a035afd866c22b9d8865b5ac7b.png" width="655" height="472" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="New Owner2" src="https://mynster-it.dk/assets/images/2025-03-11-ActionableMessagesPart2NewOwner2-61bcde90ca9dbfe156acbd73be24ae25.png" width="639" height="391" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-2">JSON<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#json-2" class="hash-link" aria-label="Direct link to JSON" title="Direct link to JSON" translate="no">​</a></h4>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AdaptiveCard"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"originator"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($originatorId)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"hideOriginalBody"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"`$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Container"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ColumnSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"style"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Person"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userImage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"altText"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"size"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"weight"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Bolder"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$userName"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Requested on the: $date"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Reason: $reason"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"isSubtle"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                    </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stretch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"FactSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"facts"</span><span class="token operator">:</span><span class="token plain"> $($factSet | convertto-json)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"facts"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Input.ChoiceSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"choices"</span><span class="token operator">:</span><span class="token plain"> $($choiceSet | convertto-json)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"placeholder"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Please choose one of your direct reports as the new owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"choice"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ActionSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"actions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Action.Http"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Sellect new owner"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"iconUrl"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"{\"Action\":\"Approve\",\"New_Owner\":\"{{choice.value}}\",\"Old_Owner\":\"$($userUPN)\",\"Objects\":$($objectsJoinedEscaped)}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($httpURL)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"text/plain"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="powershell-script-2">Powershell script:<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#powershell-script-2" class="hash-link" aria-label="Direct link to Powershell script:" title="Direct link to Powershell script:" translate="no">​</a></h4>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Originator id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your originator id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Your url for the logic app saved from earlier the same one used for the `HTTP URL`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your logic app url"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Tenant ID, Client ID, and Client Secret for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-tenant-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-client-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-Secret"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Example values for other variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"We need a new owner to replace </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://pbs.twimg.com/profile_images/3647943215/d7f12830b3c17a5a9e4afcc370e3a37e_400x400.jpeg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"We can see the employee is set to leave the company on </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token string" style="color:rgb(255, 121, 198)"> and request that you as the manager choose a new person to be responsible for the things the previous employee was set as owner of."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">get-date</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">format </span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-dd, HH:mm"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bob Bob"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bob.Bob@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Shane Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Shane.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group_Name"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Group"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"service_user"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Transform the factSet to create a new array with Type and Name properties</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$transformedFactSet</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ForEach-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token namespace">[PSCustomObject]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">value</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        Name = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">title</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Convert the transformed array to a JSON string needs to be oneline which is why we use -Compress</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJoined</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$transformedFactSet</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Compress</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Manually escape the quotes in the JSON string needed for adaptive cards</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJoinedEscaped</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJoined</span><span class="token plain"> </span><span class="token operator">-replace</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'"'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'\"'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    message         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        subject      = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        body         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            content     = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;meta http-equiv="</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token string" style="color:rgb(255, 121, 198)">" content="</span><span class="token plain">text/html</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> charset=utf-8</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;script type="</span><span class="token plain">application/adaptivecard+json</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">AdaptiveCard</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">version</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">2</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">originator</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">hideOriginalBody</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$schema</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">http:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token plain">adaptivecards</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">io/schemas/adaptive-card</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">json</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$header</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Container</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ColumnSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">columns</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Image</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Person</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userImage</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">altText</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">size</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Small</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">auto</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">weight</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Bolder</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userName</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Requested on the: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$date</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Reason: </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$reason</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">isSubtle</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                    "</span><span class="token plain">wrap</span><span class="token string" style="color:rgb(255, 121, 198)">": true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">stretch</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">FactSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">facts</span><span class="token string" style="color:rgb(255, 121, 198)">": </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$factSet</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function" style="color:rgb(80, 250, 123)">convertto-json</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">facts</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Input</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ChoiceSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">choices</span><span class="token string" style="color:rgb(255, 121, 198)">": </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$choiceSet</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function" style="color:rgb(80, 250, 123)">convertto-json</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">placeholder</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Please choose one of your direct reports as the new owner</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">choice</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ActionSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">actions</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Sellect new owner</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">approve</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">iconUrl</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Action\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"Approve\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"New_Owner\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"{{choice.value}}\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Old_Owner\"</span><span class="token plain">:\</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$userUPN</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">\"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">\</span><span class="token string" style="color:rgb(255, 121, 198)">"Objects\"</span><span class="token plain">:$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$objectsJoinedEscaped</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/script&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;p&gt;Please find a new owner for the group and fill it in below and press submit. Thank you ín advance! &lt;/p&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        toRecipients = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    saveToSentItems = </span><span class="token string" style="color:rgb(255, 121, 198)">"false"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Grant_Type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"client_credentials"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    Client_Secret = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientSecret</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Request a Token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users/{user-id or UPN to send the mail from}/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$request</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><br></div></code></pre></div></div>
<p>And your body in the logic app will look a bit like this</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Action"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Approve"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"New_Owner"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane.Doe@contoso.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Old_Owner"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"John.Doe@contoso.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Objects"</span><span class="token operator">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Group_Name"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"service_user"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name1"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name2"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"Name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Server_Name3"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Combine these use cases together with my last blog post:
<a class="" href="https://mynster-it.dk/2025/03/04/ActionableMessages">https://mynster-it.dk/2025/03/04/ActionableMessages</a></p>
<p>And you will be well on your way to improve some automation process that you launch to the end users in order to gather infomation and take action on the information gathered straight away instead of going through the collection process your self.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="referencedocumentation-links">Reference/Documentation links<a href="https://mynster-it.dk/2025/03/11/ActionableMessagesPart2#referencedocumentation-links" class="hash-link" aria-label="Direct link to Reference/Documentation links" title="Direct link to Reference/Documentation links" translate="no">​</a></h2>
<ul>
<li class="">Actionable Message Designer <a href="https://amdesigner.azurewebsites.net/" target="_blank" rel="noopener noreferrer" class="">https://amdesigner.azurewebsites.net/</a></li>
<li class="">Actionable messages in outlook <a href="https://learn.microsoft.com/en-us/outlook/actionable-messages/" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/outlook/actionable-messages/</a></li>
<li class="">Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/publish" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/publish</a> <em>Note you might have to have outlook on the web open first</em></li>
<li class="">Admin dashboard for the Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/admin" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/admin</a></li>
<li class="">Microsoft Graph API: <a href="https://learn.microsoft.com/en-us/graph/api/overview" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/api/overview</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>mail</category>
            <category>adaptive cards</category>
        </item>
        <item>
            <title><![CDATA[Adaptive Cards to Email through MS Graph (Actionable messages)]]></title>
            <link>https://mynster-it.dk/2025/03/04/ActionableMessages</link>
            <guid>https://mynster-it.dk/2025/03/04/ActionableMessages</guid>
            <pubDate>Mon, 03 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating how to send an approval adaptive card (Actionable messages) through MS Graph]]></description>
            <content:encoded><![CDATA[<p>Demonstrating how to send an approval adaptive card (Actionable messages) through MS Graph</p>
<ul>
<li class="">App registration/service principal with correct permissions</li>
<li class="">Token for MS Graph</li>
<li class="">Permissions on the endpoint you are using</li>
</ul>
<p>For all the below examples, the variable <code>$baseUrl</code> will always be "<a href="https://graph.microsoft.com/v1.0" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0</a>"</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-adaptive-cards">Introduction to Adaptive Cards<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#introduction-to-adaptive-cards" class="hash-link" aria-label="Direct link to Introduction to Adaptive Cards" title="Direct link to Introduction to Adaptive Cards" translate="no">​</a></h2>
<p>Adaptive Cards are a way to present and collect information in a consistent way across different platforms. Adaptive Cards can be used in various scenarios, such as sending approval requests, collecting feedback, or displaying information.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-application-permissions">Setting up Your Application Permissions<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#setting-up-your-application-permissions" class="hash-link" aria-label="Direct link to Setting up Your Application Permissions" title="Direct link to Setting up Your Application Permissions" translate="no">​</a></h2>
<p>To send adaptive cards through MS Graph, you need to set up your application with the correct permissions. Ensure that your app registration/service principal has the following permissions:</p>
<ul>
<li class=""><code>Mail.Send</code></li>
<li class=""><code>User.Read.All</code></li>
</ul>
<p>You can set these permissions in the Azure portal under your app registration's API permissions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="for-this-example-we-will-use-a-logic-app-to-receive-our-responses-from-adaptive-cards-so-go-ahead-and-create-this-first---part-1">For this example we will use a logic app to receive our responses from adaptive cards so go ahead and create this first - Part 1<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#for-this-example-we-will-use-a-logic-app-to-receive-our-responses-from-adaptive-cards-so-go-ahead-and-create-this-first---part-1" class="hash-link" aria-label="Direct link to For this example we will use a logic app to receive our responses from adaptive cards so go ahead and create this first - Part 1" title="Direct link to For this example we will use a logic app to receive our responses from adaptive cards so go ahead and create this first - Part 1" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Logic App Create.png" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOQAAAFeCAIAAAAaEyR9AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAB30SURBVHhe7Z1/bF1neceZ+LlpA8EYax1COiaQIOlK28SN27BNbZJ2AyFtVYJU6jKaaaajEChDwSgkoaRYmrJ0w8oyeQE6J0vw6q1ZsyYYrZbdpm1QZXlEV/cPW95UOSFgW5HcyJLjf7LneX+f95xjX/865z721/rIOvc97/u8vz7nPef6nHv9ljUNNwMgAsgKxABZgRggKxADZAVigKxADJAViAGyAjFAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEY5iHrJ7fc8+XHv/T1rz8BwLJCmpFskX7EPGSlELduWB8lArDkkGYkW5RI1Cprw803k/JRIgDLBMlGykWJtct6E2QFhaFkvSlKrElWchyygiLRskaLK2QF9chiZKVikBUUh5U1cSUAWUE9AlmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQQz3KuuGuzXfd/6k8aG+UH6wS6k7WTdse+NrJ5w9dHM2D9lKeqBRYDdSdrPd97i+efOnisfEbedBeyhOVAquBupN16yO7vnu+EgkaQnspT1QKrAbqb2V9ZNf+85Wj4zfyoL2UJyoFVgN1J+sfP7Lrmy9XDo/dyIP2Up6oFFgN1J2sW5p37X6p8t1f3ciD9lKeqBRYDdSdrE3Nu1peqnzzVzfyoL2UJyoFVgN1J2tj867P91e+8ssbedBeyhOVAquBupP1juZdO/srf3nlRh60l/JEpcBqoO5k/YPPPvKZ//6fh35xIw/aS3miUmA1UHey/v6mps0H//7erp9q/ui/fr6l9xL9dim0l/JEpcBqoO5k/eCH1n74rrs/uu1PNR969OAHvv0T+u1SaC/liUqB1UDdyRrSsGbte7btfttf99Bv2o72gtVG/crasPaW99++/V2f++df+8Yg/aZtSonygFVFXcjasO7D72v67Lvv//q7/2SP4zc/ve9dzT96e8uZt//Vf9Jv2qaUMAPlp1JUNooGVip1Ievv3HbfO79w8m1ffOEdj3a94wunHL/+0D+9Z/vu9zXtpN+0He6inJSfSlHZKBpYqdSFrO/95Off9qWf/tanvvXbmz7z/o2fdnxg/d164aTftB3uopyUn0pR2TAUWMGUJuud93zo7u3r7lHc+eiOj33vh5uaP61fErc1rr3l9xqiIpRC6S4P5adSVFa/pGgUMyoCVhLlyPqxDR98ov3jT3Xf+r1/Z777k3v3v9J88IU/1C+JR7/9UfIyKkUplO7yUH4qRWX1S4pGMSlyVAqsGMqRdcv9t/zLxTvPTDTmQfLRYhmVohRKj3KGUEyKHJUCK4ZyZL3n/lt++PM7T4815nEwR1ZKj3KGUEyKHJUCK4ZyZL17+y0dg3d0/7Ixj+88eytdg6ZKraP0KGcIxaTIUSmwYihH1qbt6/5x4I5Tv9iUx76uDU3bYlkphdKjnCEUkyJHpcCKoRxZN29b9/3X7zg+uimPb53asHlrrB2lUHqUM4RiUuSoFFgxlCPrXdvWPf2z23/0xqY89pzccFdKVkqh9ChnCMWkyFEpsGIoTda/vXB7x/9tzONv/nV9Y0pWSqH0KGcIxYSsK5hyZCXtvvfq7Uf+d2MeXzu+ftN9sXaUQulRzhCKmVYcrBjKkfXOe9c9ef72fxjemMdXOtdvTMlKKZQe5QyhmBQ5KgVWDOXIun7j2if+7db9/Z/Y/1I2Xzj8sdu2pO5gbVlL6VFOT/8nKCZFjkqBFUM5shIf37j2jnvX3XlfNh9ZvybKr6H0KKeDolHMKD9YSZQmKwDzBbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYgBsgIxQFYgBsgKxABZgRggKxADZAVigKxADJAViKEwWff1jU/PjPceiNPnSXNndXys+uzuOD2ftvOTM9enZ6qdm1O7gCykybq3d+L69MSL++L0XA5duDp9+dLozPXh7p3RLiAMabLOk80dAzPXR3v2nh65Pj3y3IPRXiCLkmXd/I2uwTfG+DRNjA/3tT9kdjXt6b5o0idePzfoyuqVtV+vrFtbT1Um3lRlpyYvtPuwlsZjg9Mzl8491tDSc0lvmF3Hq1Sq0t12buSqKn6l0v2NRko/0E+VjvUd7Ri8otKvBk0CZVOqrHQBSqqNV3o6nmp9+nSVMpAoe2lX45FButCcvHy+s6310BltbUrWAy9y+sTFc8cO7jn8fKXvB0Fkzc4uWlAv9/AF7mNn6UpgtGe32aVknb72xkD3008dPjVAMXV8JSttD/d1PNXW0TtCzZuqHMf1Q31QpqytbNvkhTabsvvcZRLowqE1DZ1VMmaoa4fJydedKVnbB6emZ944/bDJk8GOZ4et/Sa4XZK1rN7dwxfo2BjrazWyDnbwKkvseI4iTFefMdlAuZQp6/GLZEzluE9RjlY717SG53oiKOtkjfOkUad+Chhy9bU2tVdfBriqzdl/r98wQU5UqFT1hH0JSqXuVlb2r4lP3/6PTU0dvIjGK2u0+qbQ63T1XPepLk1PlS8tLhzivUrW4TPm/K4ubWmhfVzLavIQT/TQxcP04FHzEpRLsbJerfRYdbqf3q19stesXeo9jT41P9g9RNuTIy92tB3s6BtSfyiNZdXXtbnXrMqz4EggVNmZwXbaNtesI73HWrkspyvv7TVrpftgS9szr12ma1a7GIPSKVZW8sBBp/uGm7e3dlWvKBdJHXpL3rrV5G9u7xtR6VNj1VMdXPZKbyule1lpxW05dn50ghZdyvbmWF/oZcNTfJkbe6baMDVwrMmsrD3PVa6p4tdGzrU9wHn0ZcDg869d1mGvDBz7orl+BaVTmKyLoPk0L8AXWe6lIrpmdcTXrKCeqFNZD/RUqj2dh1tb2jrOqT9p0XXkUq5wkFUidSrrY+6v/XSOHh/uO9qytHf2IatE6lRWANJAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYgBsgIxQFYgBsgKxABZgRggKxADZAVigKxADJAViAGyAjFAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMRQmq/rnE+qfXoTwN1DrRP7PFhlfRb2EqG+7nv1fZ4G6pkhZxybGkzqSoJSYMnhZ4Lrsf+E6UUkfNqD+KVTWanUsXNgO9I9V+3shK6iRQmXtOxEYw/8isHLceRPJpP71hf5HbXT6ZqftGVyfzd3edP6MPHyNoVPG+n5mM+MfXUijWFn3KvP0v0I9UWH50rKyWImrBTYvtNAuivyfVXjbRNaJOXmwsq4EipbVihK99DKRXtF7IO83lwo9VmuzWUddenYeyLoCKFxWvUHXA1qXlKyBmoY5ZbXbegGGrCuW4mXV/xjNXwxEsnKKV5AJ9eVF1HrmT/EGU0V2HsgqnxJk5dUu7U0gk7aZUSnJtZbi6LdH7kLWp9jrh3SepKx6GcYbLGkUJisAiwWyAjFAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYgBsgIxQFYgBsgKxABZLU17jjzz1MNRIqgnipW17bVr16dnBtvj9MXT1HLs9bFrU/pDraM9rakMc9I+cO366JnHU+mgbihU1rbzk9cujV6bGjiS2rVIHnt+lB09+ND21C6wYihS1kMXrk4PHm0fnJoe7GhUKfrz+4bqM/x5f/MVAXvtN17xxmj14qT65ovGA2eH9fI58XpHeMpufXFsZqpy7AGfsqbhIVprOfLU5MjZfZvV9w9MDFUuT01P9Hf1XJq+duGQysatGnn2Qf4GA/3FAs3tfSNUnWrSDzLiBFWAQilQ1qMDM2pNPTJIVwIdwaw/eJxcHDn9sPpyiixZp0dOtXB+uooYf62NjGzinINHXQQyrLP6Jvk0Vn3+0GNNnLLj2eFrQ1283dw1MjXa87j6phZdnFbis6NGzUN0ZTLcvVN93QanPNg9ND1zpffwn+vDKSOOTgfFU5isjcfI0WonObe5Y4CXSaUUseOZCulyppm282Q13ybE39QyNXntqmHk7B4dwdDUcqSnMkHr7qXeA01KzTd95sEfqJXVfeXb4+cuq29k0d8vxEeCkZUX+5FTxlQiHcftAgVTlKxNHXT21+dWDZ95KX0nr4iXz+5W2WqQ9eJc31HVfPoyX1EoNV9M2JyQtaGFrgQun21XNSo1A1mDbyvKiAPKoiBZN5MKfjVVq+xQ1w59AXDpHDVBpT94ZmT62uvt2xu2tvHXXcWy8pI8NXymdauOmcXWh59+jS4b6ArhiR460Q8c+WJijQy/THPHc8Mz42MTUwPHdKuMrLtJYromabWXv+k4oCwKkpUvBPXZVqGuBIbP/McA/yXLQuvZ5gO99AZo5vrkyOBwemWl9zpHztO7fpX/zYFjNhrRStegOn1qbKS/nd97Ne05UzXvk2beONeaknXNztMjtMtdPRtZaW3uGLyiQ6mTfiqOjwCKpSBZAVg8kBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYgBsgIxQFYgBsgKxABZgRggKxADZAViKEzW4D9h107iyet89McQosRFcKC/ov9h9vHqUoZdBPv6xuukJZpy2lPfstYGfwRgfCzxKYDFAVnnYtXJ6r80wH5Az6aMV6pmLDqrVfMJQf60oNqbklJFpjXYxaftaicZrPLzR1gp8Xh1rO8ErdMq0ca0uJaYzGlZXe3moy8nKqYZfu038+dyBp86pF0mcrCd6v6JiivCrTX5CSqSyBk3JoRPMmqX6WNcC0fuN3lcvRP9vSabGxkbx412MP4vRO0pjLJk5QkwXbXz7T8j5Q2wsroPSKUx3gRCcHE/E7ogu2siBFVHKMtpI5Y1qN00knKqFDWFql5d1qabgI5Qbq4io/uUx7UqKStB+fWAZDXG5AlCGbIH2Rjpmspe6lJ2DE0juaBpSTz+QXsKpCRZ3Ugp1IjQGuD678bCyEpDnK2XG03lTVIIncGEDaff57REa1Uka6J2E9y0kDNoEf0xk165CdN9qohDZXS/VlmzGmNexv3KqiWIvK+vqva6A8l23I+GXT5T4w9ZFyArxQmG1Rz9iSmsQVZaNkx+p9ScsnKQ6gndPP6d0IvXqrjBKoPtV5ZGdSVrIk5UKbOqZOXe2v7TmLJP6RTanuMyIBpWM6a+OGfQItIum5P0Tajgg9ha5r4MUIn2XR21fGxCT7wjMMCnVAntVlZn3THDKbmyZjdGE3RckVFLLbJyFYk4iUoVQXsKpEBZ/RKo+snDp1/a4XMpWW+waGJ08WB62JLEpOr5pjjViqnOz+tYtWrObmb+PLZtVCpT1qD24BTvpXeHRNCp9FwmD5J095VbnDLe2xevrKoK2/KsxiSy+V2pWmqSNYxjOxKNf9iewihM1vlAQ5w4jucJyxrPYjBJJbHIToG6ktUvGBnL0nyoO1n1kln20SKfulxZAcgCsgIxQFYgBsgKxABZgRggKxADZAViEChr+k7m3AQ3HgvhuL0RekA/uUKJ8R3LXNxts7pgIaO9XKwSWUvDy1ozkDWPgmQNbuK7G/r+aQG39rh5NTec+F5UL9/+CdckHr5Ocxvd3Ouyt7kJd/uKn8bgPHqs3SMpNTxobBumK433hti7+frulAte7XSPL+myXNfe3qqJkCiVyKPCpmR1A2XGkAcnepBc9dreAjTZcloeR8scE9eqanX1yapGRPXZyBSclylFO5cpqxtTB8+BSeQx1dFiWWlKElPuZPV+5zxoTFMerIVxnBB3rjf44NQw/0SI66aWNS5lcTeEc1dW21SW0hy9dhh5oPwxr/bO1nLGdTxzTGzZvNaWQlGy0tip8TWTR8MRLJZmnrJXVmOSx3lPmDgZK2swo0ywspqy8eKnFxJqQHAwqILJdd2TsiEVXG1EsqYdopSgdtfUAN9I1RKntd7FlSYGylSR1/IoWuaY+BEOR7tsCpNVDzEdu2omll9Ws51xGZA/MR5esfxM+zgqnWeaoi2JrHYxC3LGstLBY3pkDvgaZeXtYAQMqWhzjMnqlJW7Pd+njxNzYKFsViN7kvJTzstJWMRGyJOVo0XOGShmkJ7VElu7TalJ1qiUE8sPSCSrV8d2PIhAxe1A2V5Q/swR0KSjZY9JPMKmeLkUKKsbWf2Sx1evUi6RJ0yfnszTx1mK8OCS9Lqs28vOcUq1XxehuhLBc2XVs2sycx7WXb1UOeM4SZJ7s4KbblKT/BusRClbOz8bnr2yuvz22XBaWeMHyXmgoufN81oeR8tsthuEVfkGi6ABtccrWAzhZYAh86hecRQkq1oyMxcnMG8ga5i4TJcBACwKyArEAFmBGCArEANkBWKArEAMkBWIQYCsy3XHz95UPBDcEZ3rr5V8j205GpPxp9O58XdoZ4M6tVL+wo2VdT6yUobxMXcXfglZkKw1wQ8DjCefFhBLYbLa+/7h8xb67rO5IW6+kfkXl/wjP1ojf5/d3+/WQexLcxc3rkJBiealX6H13XB1s941Q9++N896+5gJdHsojpdbl2WolswnFU2/VJHMFjIpWV1P/dpp79dnPUVgH41ISam7T9FsTtUwF0pXyrXHXwue29QSKUhWPr7Ds6d/eMLIxMOnh4lXLycf77Ky8vC5mXN7XbS4Cot1S02/E4gC2idLtIKcmeVz8xfWpbE1khlJJ2yEnMdqbWZvpN3rSMoa9JSbZCsNjkm918jq8qQJmhEEtNs2JjcyGTxvMMulqJU1HCM9Ovo4ZniewtlyMumBNrLSy3C1UwF9EMqZrMLj19FOZZt1LlNW51DwcK3B7w0WKiI88DJXVtMvv1gyYV8S2VTZYK/eFR48rsFa1lnE8l1zB1jYR9uRsHYTjbJlDmapFCWrQjmqRyceiMRsmZXSnP1zZU3Ot8ZVESTyU8bHVRAORec7O23zkjV5gLn2h1+SPKesUcM8yyNr8vDQtYd9nEVWtZ01mGVSqKyEHhcakdmWFjagUrUTn3MZwDMR+aRJhiKoIL3JUINOh8G4V3M+siZVsz4l6+KK9Eue5lhWbn/eEpiKY7tGFal6ecRM2/zeOS4DkpcrxsIgs4tJrbUNo24mRi81mGVSkKw8Lvr4tsPnF6qMWQ+Hj8qaJVYNtC7lJskEoclLV+EIZjqYDCuriUMZaMOVjWSNr1OVlz+zb2sYFZayqZf2GfCoX3yA6QyRtX409BHou+aKs6M6Jf0GK7PvFDPRBYpJQ819nPtrwaOA9DIRqiSKXlnBolHHiT8A5kl4QFrmXD7rZH2FrEKwa7Zb/BbIQmQNrsVLBbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAx1JWt4n32R7AufyYpu7Qoh6IJF31ia6N/n7l0tF27Qwsd0Uu2pjQUXjFkFskol3QU/Pssuq2NVyupui5ubJcFw6zmIMlAP9Ut7G51vvZgno6vuSQA7ecl72b4s3+yxzwDwfRr1HLRJVwXtTXl/w11DAd3te7ud0STzdIG/e84T08eN8feE3P0hbqS+e+RuI/n7UmY0XCOrJ9wc88hM9L8QdirjqYBoIaQqTEwTx+UMuumq4HEwBXUE3TXXPA7uukYprneUqDLkjonPEA7vwih8ZbXzlJI13AjGjqdKDQ2Pvh4jPXm8N35WQ0825/HT4IaPvXSu2Km1uvOYJkO5xphQmU3KktVlM9AulaKmTcU0mb1PyiQzLO5hFF0v/XZmpFbW4ArHNM92jQO6caOArstJ7ACqlcI0INm1xMpqu0b12tbavbOPiZ2LxVGcrGr41EGmRm1WWannvnt+ahOzqPb6Z6PUcPsjOMjjZXWzbm5226li7Mh63LSperObVNPEuAj8eRKOqX9TETvThOl7opH8ZGN4CMWyhu23tZgGcAbtmbGN0t1hEODX0ewn05Oyuq5xXxY1JguiKFntsRjMStDzxcpKKWaOMwZoobLqebLpi5kYlaibyr9NN6mI9YBwwxLLms5D2/my6pZYmezhYfKo07ovwnDMWZ5M14OgcoZdW9Gy+omxZy430LTLnsvCycg4v+TL6kaNdumwQZ58WblqHzOaRYLaUyF0nOwmuZanV/QAqnpCH05cZMxMJ23byXYtScpKe8OGxbK6wVQp/hzNH8HlbSo7Rhf6OoPBy6dReXSbVUFTV02yLmpMFkBRK6tqOp+m3Rcu81RxCv9fm2DE7cW7ze9WAsqfK6uabM7s3yfpFN7Ol1WF0rXEb7A0wWQQqSaZBhP8zkMl5kyMt4prdMVts/07xZSsekOfwVOy+gaEp3jrTXg02tFOf0zF5wkKukEzveZ6w64ZWc1eRf6YBHNhii+QwmStc2gmnCWzJ4LSWN2yqmu4aGHQ6MUgecYEJYOVFYgBsgIxQFYgBsgKxABZgRggKxADZAViqCdZ3W2exC2+JbjzkUtwu7IWgucZssn5Wq7FwKGCR/Lmi7/ptQKoy5U1vn9dL9Qs69Kx2KGArIp5yepueSfuVtMG/1aPVNOY6vvR7q6SGmX3xAY/QqDTzV1pc5OJSP/nZrcruGMe7+KVL3xsoIbnsp2siSCJ4EZWk9P1jjJ7aez99LRG/o6aLR6+tLjaTa+jUoQr6J7EyG+zIAqSlUZKjaw6qanhoxSti//3DBlP+nhZ7UzY+/Vc0MxN8nGTBMFzIQoqFSriZbVauwz+CsGf04MjR1dHu6wfigxZbe+oChUkKBKtmkGPWCzdnvTK6humyCjlG+wz57dZEAXJymPK4+ifsDQamXSTZxZZXYoWwtqvCqZnNOtpIAVPpF9uw5XVOD3bo666MXbF1SQOhqyV1dalHxBjt4Libq+qJeiFPX2nuhY2jMgoRVV4m02cWdosiKJk1Qd06gHk5ZGV6jLz4TxLoM6bWp2FyZoRU1GTrN6kBMsta16bBVGYrDReOQ8gL0hWFs5OCc1EckZpWVWl1DqaPUk6YL6sJIFd9nwQ3Rje5W1IMLes3LacJlHmpbkMoCpsd2zmVJv98SyI4mQNRjlwKFNWNaM6c66sylF9Xst/g5V6pJqnVpcyMuXJqhsZBTGNCapOGhC2zcRPyRq2IbbWNjsIm5Y1qF3vyixlUoI3WMk2Q9aSoGmIZn1JETmvKxKxsgbrU3rtWQLc4pR31gaFsxJWVrBKgKxADJAViAGyAjFAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYgBsgIxQFYgBsgKxABZgRggKxADZAVigKxADJAViAGyAjFAViAGyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYhh2WUdw88q+IkmfZmArPhZgp9o0peJZZcVgKUCsgIxQFYgBsgKxABZgRggKxADZAVigKxADJAViAGyAjFAVrC8vP8T2957z+fevf2rN33ktjCRUgjacIlzAlnBMvIbf3bwrS2ntZd6g5R958MdUWJUKg/ICpYLspC8DFO0u1EivazRV8gKlguyMH2WT3tJeSJ984CsYLmgRTRKyeMtT7wapWRSuqwnh264n6GT8d55cHL4xuQr34kSQYmQrOGbqjwoT41alyrrj1nUoR/bl/tfHlqEbQuTdfNdjVEKWCr0NeucvmZeLWRSoqy0pk6e3x8lEir9FfZYy/fkK5Nq3b1xY/ikybP/ZZukXf/OeffaLs8ZpbJ49dVX/u7QoSjR8bWvfrWr68dRIqgd8pWYxVcyld51RYl5lCcrLauTLz8ZJTLqwsAZFmRza+eTrwwZy3ltNnYmVtasUpnQyprnK5lKu6JEMF9m8XVephKlypq95oUrLi+Z/johowhlTss6Z6kEmb7C1CUk09f5mkrU58qakDXxY4qo1df8ZMua+Jl82QbPJvIVpi45ka8LMJUoT9aElCGRrOk8YQbazpQ1M/JsOF9h6jLhfF2YqUSJsur3QIFV5q8BCYk5T7QA87srIygvz1nXrBmlakD7ClOXD5L1rS2nF2YqUaasDNtmf/wpPrEukoXuR1+JBu/0h9zKav9E4N11P/76dS7I1ygFLC3zenIlomxZAagZyArEAFmBGCArEANkBWKArEAMkBWIAbICMUBWIAbICsQAWYEYICsQA2QFYoCsQAyQFYhhMbKyr19+/Eu3blgf7QJgySHNSDYlayJ9HrJuueduCkHKA7CskGYk2wJlJVTJm26+ifhdAJYZlo1ISNhw8/8Dar9zpPpQbEMAAAAASUVORK5CYII=" width="228" height="350" class="img_ev3q"></p>
<p>Depending on your use case and cost, choose the hosting option that best suits your scenario. For this example we are using <code>Consumption</code> - <code>Multi-tenant. Fully managed and easy to get started.</code></p>
<p>Once created go to the resource and go into the <code>Logic app designer</code> press <code>Add a trigger</code> and choose <code>Request</code> and <code>When a HTTP request is received</code></p>
<p>If you want to use 1 app to handle all responses leave the Method as is (This is what we will use in this example) <em>Note that this is also easier than having to create multiple providers</em></p>
<p>Press on <code>Save</code> and copy the url from the <code>HTTP URL</code> we will need this for the next section on setting up your provider</p>
<p><img decoding="async" loading="lazy" alt="Logic App HTTP" src="https://mynster-it.dk/assets/images/Logic_App_HTTP-8d75294ac8a8dfe76d802227c5c6db7d.png" width="2336" height="740" class="img_ev3q"></p>
<p>That is it for now we will get back to the logic app later on</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="setting-up-your-provider-for-actionable-messages">Setting up your provider for actionable messages<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#setting-up-your-provider-for-actionable-messages" class="hash-link" aria-label="Direct link to Setting up your provider for actionable messages" title="Direct link to Setting up your provider for actionable messages" translate="no">​</a></h2>
<p>First off, before we are able to send an actionable message, we need to set up a Provider in the "Actionable Email Developer Dashboard"</p>
<ul>
<li class="">Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/publish" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/publish</a>
<ul>
<li class=""><em>Note you might have to have outlook on the web open first</em></li>
<li class=""><em>Note that either your Exchange Administrator or Global administrator has to approve this provider before you can use it</em></li>
</ul>
</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Actionable Email Developer Dashboard" src="https://mynster-it.dk/assets/images/Actionable_Email_Developer_Dashboard-917b87b4bb822a1c6f39afeaf02cd5af.png" width="1198" height="224" class="img_ev3q"></p>
<p>Click the "New Provider"</p>
<p><img decoding="async" loading="lazy" alt="Provider Setup" src="https://mynster-it.dk/assets/images/Provider_Setup-39d8036edea7c05a8a9dfdc94a7558f5.png" width="1111" height="1271" class="img_ev3q"></p>
<p>Here you will need to setup the following as a minimum:
<em>None of these settings can be changed later, you will need to create a new provider if you need any changes made.</em></p>
<ul>
<li class="">Friendly Name (Any name you would like to use for the provider, I would recommend calling it something that makes sense to what you are doing)</li>
<li class="">Sender email address from which actionable emails will originate (This is the email that will be used to send your actionable message can be multiple emails)</li>
<li class="">Who are you enabling this for? (If you are just testing then just chose Test Users) and set the emails in the <em>Test user email addresses seperated with ";" The test scenario will be auto-approved but can also only be used for the users that you specify.</em> For production use case use the <code>Organization</code></li>
<li class="">Checkmark in "I accept the terms and conditions of the"</li>
</ul>
<p>After you have filled in minimum requirements press on save <em>If you have selected <code>Organization</code> you will need your exchange administrator or global administrator to approve it and the requst can be seen by them on the below url</em></p>
<p><a href="https://outlook.office.com/connectors/oam/admin" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/admin</a></p>
<p>Once approved copy the <code>Provider Id (originator)</code> as we will need this for when we are sending our actionable messages</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="designing-your-actionable-messages">Designing Your Actionable Messages<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#designing-your-actionable-messages" class="hash-link" aria-label="Direct link to Designing Your Actionable Messages" title="Direct link to Designing Your Actionable Messages" translate="no">​</a></h2>
<p>Adaptive Cards are designed using JSON.
The easiest way to design an actionable message is by doing it on the below link, where you also will be able to send a test to your own email:</p>
<ul>
<li class="">Now the official link for designing actionable messages is:</li>
<li class=""><a href="https://amdesigner.azurewebsites.net/" target="_blank" rel="noopener noreferrer" class="">https://amdesigner.azurewebsites.net/</a></li>
</ul>
<p>But I have found that more often than not, that the actionable message created from this does not work like it should.
Instead I would recommend going with</p>
<p><a href="https://adaptivecards.io/designer/" target="_blank" rel="noopener noreferrer" class="">https://adaptivecards.io/designer/</a></p>
<p>And set the <code>Select host app:</code> to <code>Outlook Actionable Messages</code> and the <code>Target version</code> to <code>1.2</code></p>
<p>Here is an example of an adaptive card:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AdaptiveCard"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"originator"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$($originatorId)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"hideOriginalBody"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ColumnSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"bleed"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"auto"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Image"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(photo)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"altText"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Profile picture"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"size"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Small"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"style"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Person"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Column"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"width"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stretch"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Hi $(name)!"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"size"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Medium"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Here's a bit about your org..."</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            </span><span class="token property">"spacing"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"None"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Your manager is: **$(manager.name)**"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Your peers are:"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"FactSet"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"facts"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"$data"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(peers)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(name)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"$(title)"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>Example of the email test:</p>
<p><img decoding="async" loading="lazy" alt="Email test" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArUAAAEDCAIAAACkuWvjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAB63SURBVHhe7d19kN3Vfd9xSGyTFMcYwlBTJU6QLSxWqwe0Wj2snqKHXSU82mAURbYDeKzCyLY8SiQiJBtEKBqvJCy8AgSK1rVkDAZL5iEjcLTppCUzrVpL0wyyJ3KmqtvudChT2klr9/9+tJ+fvhyfe+8+3N292v3d92t2ds45v/M759wLs9/PvbvaveQGAACAX0Y+AAAAOfIBAADIkQ8AAECunnwwbdq0KVOmXA0AABpCZVfFtyjDDTHifKDz6aBTp06dPn16MQQAAMaNCq7KropvIyPCiPOBIoxOWXQAAEBDqPiqBBed8TfifKD8wjsHAAA0mIqvSnDRGX/15IOiBQAAGoh8AAAAcuQDAACQIx8AAIAc+QAAAOTIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkmjcfzF5228LP7122/fXZKz6t7vKd/3pN7887D7yz/OG/8YQ5nevdAACg2TRdPpi5qHP2ijvVmHvrfe3rdsxactMNM2b60nktre7OWtS5Ytep1T0/0xxfAQCgeTRRPmiZOWfxpsNdz77b9skvF0NDaZkzX0FBjbk3b5jRttiDAACUXhPlg9YFK278/XtuaJlR9EdCN3YeeKd97baiDwBAqTVFPli86fDcW+8rOvVqbetY+IV9RQcAgFIrfz5Ytv31ji8eKjpjof0zO4vWOOvu7n7rrbe2bt1a9CscOXJEc4oOAABjp+T5YEZbR/sfjvEPGC7d/oYyR9EZBVX3N998s6urq+gPUL2PwUHygSZo2t9fkKaE9evXnzp1qnLlxqjcXSMnT54cJOUAACagMueDuTdvKFpjreOLh+Z/7tGiU68h80EtDge6XTRfpXfnzvfe0njjjTcuVjgwRwSdLbrkAwCYdEqbD9rXblux61TRmZBUQevLB6q1qriqu84HxegFygdRmy+KiC/ukg8AYDIqZz6YceOCzgPvzJjTXvTHx4J7ukfzjx6HzAdq64W46qsvBdVajevzkPlAbXf9bYhsNV3yuMQ63vTgwYMe92FihezAMS6xAvkAAEqgpPlg7kL/EqRx1b5ux+JNh4vOyKmC1pcPXIDfeuutvr6+qMrBgSDaqtzu+i6N+JIKtkKA21okftBBbd3iadpaB8i6sXh6ft2rFXwYbxTTyAcAMBmVMB/MuHFB0RpvLTO6nn135oKVRXeEVEHPv+6uMGQ+MN+eTXAJj9Cguh6rSa0F07uyOdol63pBjWRVX3s5Rrgd+1bOBABMfCXMB4vuPzD835A4SqPJIlFri/4Aledh5gPRCiq9SglqqKuZUeYtrdmSLegX/QOZ5DzfmM3JDhnd7F5L94qZ0tfXRz4AgMmlhPlgdc/PWubMLzrjr3X+8qI1QlnpNZXnEeUDzdHnmJZFhEHygcbjewrpXdmm2SGjqxsVTWJapupDAwBMImXLB60LViz+yneKTkOs2HWqvr/0WLWIqjyPNB9kpVqFX+PRFrclFpQIBJJ2s02zQ0Y3WyGTngEAMBmV8P2DBmtft2Ph5/cWnZHISq+p4g6ZDxQI/KOFWkFzVIzTddLafD4dVMsHmqxb0ml/P8LvL6itu9KZOpLfjcgW12D86CIAYLIoWz6Ys+ZzLTNvLDoNMXPBykUbeorOSGSl11RHYzAr1cEF2N/ylzQBiLpp4U+vpgu6bHsFlXaNu4Rnmw6SD0SLewWJjXw88gEATGplywer9v6kkT98cHGpBlfWXdXpqM0XRZYPAACTUdnyQeeBd+r7C86jMe/OPylajVU1H2gwfYnfeOsH/dEEAMCkULZ80H7XA0Wrgdb0/rxoTQB++X6xIoLDQfpNDQDAZFS2fHBRTKh8AADA6JUtHyz76l/d0NJadBqjZcbF+v4CAADjpGz54PzPJ85q6L9fAACgfEr3/sH212ctuanoNERrW0f7Z3YWHQAASqFs+aDuv5ZUt7ZPfrm+348EAMCEVbZ80Hh1/37lyl9UoO7of/K/e+A3KhadUdA6Vf8RxNatW0+dOuVflTgi6/lDjgAweZQwH5z/+0wN/BGEuv8+0yTNB6kRHXgM88GYPFEAgEGUMB8suv9A+7odRWcCIx/UjXwAAOOthPlg5qLOlXt+3IjfotjSqo1mtHUU3REaPB/41xxlf9pAE/r6+jQef5pZI56T/tGEoBt9tbLSp+tXvdf5oKenx3NihSjzsbhosu+yqov7Rs3UiMbjIWTz0/H0KRpyXy8SI+76dg0WNyRPppbSgvHA48nXZN2o51mT0/UtnnCJs1XeEtO0psRMAJgsSpgPGqZ93Y7Fmw4XnZFT2XAJSWlQl9LalpY9jaTlU11d0gS3fW9w0fLVnTt3uhG0iP8IZLpXSrfHeUQNt6NOq125qVVdXDcqGURc0Ppue06sE+NqazAONpx903HNdPnXgvGkpeeJCQPT37vXD1yfPZ7SnDibPqvtadktmhbPvC95RwCYREqbDxbc091a7yv7YdIWM9oWF52RS4ufRYnKSpdqjMdjgrjURU3SZHXjFtGlKGaDS5cNuj2KnMSRZMg6nYo56Y0S588ebPq4dKNu9/hw9q06J11E4nFl+8b87IGH9GBW9ZbKadkBAGBSKG0+aF+7bdmOKiVk4qgsG2m90YvOlMtPTBAVNpX/4vKA9K0F8zqV46alfKPEsiGteaLt1NVnGbJOS+Xi6Y2mce2SbSQa9zMTDRn+vrqq1fr6+jS5slpr0LEgGh6PNSvPY5Xnj5npLVUfZjwKAJgsSpsPZPGmw/PH5wcVF9y7Z+7NG4pOvSrLRpQoVReVt8oSFRNEV10C3R2E5ihJZDPT3dNlQ1YmdburaVr/qt4oVRfPCqdWduWOlT0umq9xN2Kd4ewrPvbOnTvjCUwXEa3gS9m+sWb2wEMcuOgPzKy8RQvG9x3Ed6UHAIBJocz5YJws3f7Gsu2vF51RyOqWRImqVVRigqlbtZLZwYMHXU2zwixpqXM7XdZ0VS/90zk+z5B1utbiLpwxPw6fzhHdGN8WSR+gJsQbIVX3NU1W+U8rtBpVf/4gLeS6qjleUyOxaUY3xtnS27NbtE50dUlPo3fUuLeIhq7GggAwoZQ/H7R/ZmfHFw8VnVFrbeto+9RXis7oqEK4bIS07Ln8DLw9f57rUDrB1C1mVHyPwJXJfHsqrqouqqBm94omqMjpkqelB4t8EIfM1q+6uG986aWXfCmtiy7bg48r7gy5r6VV3OI8kj7nMa5ddDCfU4NR3Svpdt8isXt2S3psrSne1O20oRuzowLABNEU7x8s3nR42Y43WlpnF/26zJjTvvAL+4oOJrDKFHUROStEkgCAyaIp8oHMvfkLRauuv/7cvm5H54F32tduK/qYqLbW++ufx0nlmxkAMCk0Sz6weZ/e0vXsu22f/PINM2YWQ4NqmXXjjBsXqKEbR/NPGdEA8a7+RX+xnn4PgnAAYJJqrnwgMxd1Lrr/wJxVf6j27BV3zlywsmXOfF86r2WG/3bDrEWdK3adWt3zs0nxq5oBABhbTZcPUgs/v3fZ9tdX7f1J64IVMxeuWtP7884D7yz5kxd1Sbmhvr/KCABACTR1PgAAAFWRDwAAQI58AAAAcuQDAACQIx8AAIAc+QAAAOTIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkyAcAACBHPgAAADnyAQAAyJEPAABAjnwAAABy5AMAAJAjHwAAgBz5AAAA5MgHAAAgRz4AAAA58gEAAMiRDwAAQI58AAAAcuQDAACQIx8AAIAc+QAAAOTIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkA1TR29t78uTJogMAaD5lyweqallhU/f48eNFp8ns3r373Llz+lz0h2H9+vVnzpx5+4L0ydTTmI2gFj+N/f39I3ryAWDiKFs+2LRp09mzZ+OLshqnT5/WF2t3MbgsHIi6fvb0TKraEQ6GT/8rKpzFEwgAk0vZ8oHoZa7LmKtdb2+vxzGkCAH+/oKewL6+Ppc3jSguNO07MXXw/36KCAoKxRAATB4lzAfxFoJKWrx6c3mzeBGsOZoZX74jWHgFlcZ0snmO6JK/9Ptdd4na6cLgwSgPPozXlFi26mSJA/uumK8JmuZLsaMap0+f1szsDW0/EI+49vtGLe59YwXz4pqW7mg+T8z3M6DuIE9F+tBEbf+38El0i9b0kXyp1vy4xYPZf5fYVLRgTNb6b775ZgxKPDqNqKFLPrYu+dEF31I5X5vGITXuJ1bSk8eaHowuAEwuJcwHoprheukv9PocX839VdsFTCO18oG+rEcFSrkaeVmXRi/lEuKltOyxY8fUSPfShJjsAuZFak1OV9Pk9GC+Ue2o/borLVch5njxuLG7uzvdLuUHZekz4PN7BUmnmQ6mM0Rbu4gaHjEv6EdUDF2glUc035eyY/hJyObHmSvXFz8D+lz0B3idqvN/+tOfFq0LZ6icpidWT68uaYIuacL57QFgUilnPnDxS79Mp4VQBcOXVANq5YMovZmYI1onvvrXuiXmx6Yez45kMTm7WmsRjXtaTMjEqfyEePKQNK0odBdKnfZVO71d22nEm3q+nwrtpeLq+uqZ5hXiaY85Pli2uKTzvb7bMV9bazttGnt5mj57fbW1iFczz4/x9CGEWF9z0vnpvpqWHik9qqfFkdyN/0kAYBIpZz4QfR13yfHX6LRU6Gu3Y0E0PK75/uqvkeHkA02IH37MbtEc1QzzfB3AJSQm+HhuF1MHJlceODZVo5h3QYy7kUlP5WXjlsH5tGk19dZxKi2irh+CBtX2o9OOUbPd1qXgObqkCVE1vZQ+15qf7iU+iQa9zsDE9+hqtn5Iz6au1/EWbqf0oLL5tR5y5b3pLdEGgMml/Pkga4u+XruuqzEe+SDdLuaroriceDzmVE7WHM2MQdGgqKFF3MjELpmqD2RgsSqTRfN1SQfwRlpW1c4ncUWMU+lqdsmPTitETfXtuqo5bnuOLmlC1G8vFdtVzvcEt0UNz/c63ku3hGz9kJ5N3dji8ccf17jX9xwfI5tf6yGnRz2/zQU+auUxAGBSaIp8oK/m8VXeX7V9yQXABclFRXd5vO584PW9ptuer5G0hPh4tSbrUtSV7GBx4FR6qlScSo0TJ0540JO9ndoeNK+vahfiedOm6sZ8rRBdX/Kj8wq+S1fPL5HwHD+ieIBeSp9rzff6GT9e3xsq1/fD1CUtkp5N93o7XXU+GFjgPZXzB3/IAzcVPMdb+xjqAsDk0hT5QNIaU3VcX8rjh/b1Bb3ufKB2rKnSogmer0GXk/N3JserOtkTPJ4eTLSFZvpSWupiQipOFWVSfAyPpE+FacTTJNYX7xvzfbz0IXhZF0vf6LYvffe73405XioKp5fS51rzNSdOpWkx//w5kidKKtf3w9QlHTI9W6zpW2J97VtrvjeqfMjqxsnNc7y1j6EuAEwupc0HZaLK5JLTMKp/UYDNRTcbbDwfI2rwRObQEBkCACYX8sFEp1IdL2EvLr/IbnxEyF6dy8R/Ue43DybIfzgAqAP5YCLy29dGjcnywUV/DwMAmgH5AAAA5MgHAAAgRz4AAAA58gEAAMiRDwAAQI58AAAAcuQDAACQIx8AAIAc+QAAAOTIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkyAcAACBHPgAAADnyAQAAyJEPAABAjnwAAAByZcsHJwcUnQHqHj9+vOgAAIBhKFs+2LRp09mzZ3fv3u2uGqdPn16/fr27AABgOMqWD+T48eN+C0Gx4MyZM729vR4HAADDVMJ8EG8hKBkoH/jNA7XfviC+AaE5mqn57kaw8Ap9fX3pZPMcfc6Wktiiv78/3sBwRvF4TNbtp0+f1rhnxmrnzp2Lw4S4Ks46XlPH0+1+gLpL93qO5scctwEAGKkS5gOJAuyCqs9Rs9PCOUg+ULnNkoFpTtUarC2iuqvtsp1OcNvn0UicJz1Dd3d3HMZ0l3KAPqutu9Jl3da4T+uV1XY28hxvDQDASJUzH2QV1K/4fUmifg+SD1xlPZ6KORZLpVuoq3Si27P1Ndn3potojqq7Prs7iFjNj86BQOIM7mrxOAkAAPUpZz6QKNhZNZUotFn91nyX7eHnA81RFHj44Ye1hd/eD9pRis4FLuSVi/T39+tqesiQLuK3KLJHpNWKyxekiwMAUIfy54OsLS7qqrKjzwcq0i75Gqys7rFR0b8gW8S0aXybIMT6asdps3ygRuVqAACMRlPkA1XQqj9/kJZkXdUcF9rB80Esld6uz35xPzCrkO6VSvOBbvQKWdW3dKbaVd8/SI8Ram0NAMBwNEU+EJXP4s33Cz9daDGuatrX1zecfOCffPRd6VJqe1A0QRVagy7exeiF7yBoZlR95xJfTVez9HbtW/X9A0kXcXwhHwAARqO0+WCcpKUdAICyIh+MDPkAANAMyAcjQz4AADQD8gEAAMiRDwAAQI58AAAAcuQDAACQIx8AAIAc+QAAAOTIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkyAcAACBHPgAAADnyAQAAyJEPAABAjnwAAABy5AMAAJArbT7YuHHjI488UnQmoU2bNp04caLoAADQWCXMB/Pnz9+zZ8/LL7/82muv6fOWLVs83tHR8eSTT37/+99fv369Rxqgp6fn29/+9u233170h2f37t39/f1vDzh+/LgHdewzZ86cO3dO0cEjpq4Ge3t7i/4Fnl85Hk6ePFm5GgAAUrZ8MGvWrH379h09enT//v2qslu3bt28ebMvbdy48dixY/fee29LS4tHGmDZsmXKB0oJw99Ux3a9P3HihGq8Mo3HNRLlXHPOnj1bWdrT8SHzgSdE/gAAIJQtH6xevfp73/uewkHl9xfU1SVNKPqNon2/9a1vLVy4sOgPRRVdZftrX/ta9v0Fj6uoqz0m+UBOnjxJPgAAVCpbPujo6Dh8+PB3vvOdHTt2DJIP1D527NiWLVuee+65V199VS/xu7q6NH7LLbccPHjwlVdeee21155//vl169Zp0Jnj6aef7u7u1iXdeP+Al156Sfc+9dRT2lTTZs+e/fDDDx89elSDWtb3ykjzgWu89qqVD9Twtx5EBT5yQK3xuN2X+vv7tYUHyQcAgKrKlg9ElVslXAW+p6fHlVtaW1v37dun6OAR1WxV8SNHjnz2s5/VK3VV/ccff1zjGzZseOyxx2666aaNGzeq0ruuOx+8/PLLyhya8MILL/zgBz9QudW9TzzxhNbZvHlzS0uL1tQ6Dz744B133KHAoYiwcuVK7zWifCCq2a7xRX+ABmOk1vsEtcb1Ob43obZzhtrpmgAAhBLmA1EIUOVWRPBrfY2oSKvGr1271hNcy++77z61VblVzitL+P79+/1+g/PBoUOH5s2bp3G/i3DPPfeorQW1hVZTFFBu+MY3vuGfM1CM0BxvrfTw/PPP33bbbWoPn2q5Knq81ldRTwv5SPNB+j6Bxk+fPu1lhYgAAKhUznwgGzduVAlUdXzxxRdvueWW2bNn9/T0RI1XRVdd92toxQKFA+eDNWvW7NmzR+Xc70Ck+UBxYWDhX7rXlzSirm9J6QyaM3/+/H379mnrgbuHSzX+xIkTOn+87q/7/QM3/M2F4PmEAwBAVWXOByrbaS1X2/Xe7cp8oHBw+PDhI0eOrF27dvny5U8++eTw80G8f+D51tbWpjkPPvigAkdnZ+fA3cPlfKDPqvd+ra+KrjLvfUeUD9RWCHAjk76vAABAKFs+ULHfu3fv1q1bv/rVrz7zzDPPPfdc+jMHg+eD22+/XTVe8++4447NmzcfPXp0+PnA/65S49u2bevq6rr33nt37dqllT1fi7s9HCrk4nygRtWfGxhpPkjXSZEPAABVlS0f6CW7aqTq9GsDvxzp6aefXrNmjS899NBDg+eDRYsWbd++XeOvvvrqN7/5zWeffXb4+UDt9PcyKVs8+uijCg2eP6J8oCquWu7vAqRFPc0HotKuCfqc5oBBxpUDBpY8L9YhHwAAqipbPgiVv//A/67h7rvvLvoNMW/evAMDnBWGT7Eg+/eN6XsDY8IBgnwAAKhU2nxQafbs2d3d3Q3+/cr79++P36Mwenq5X/XbBPXRaukbEgAAhCbKBwAAYJjIBwAAIEc+AAAAOfIBAADIkQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkyAcAACBHPgAAADnyAQAAyJEPAABAjnwAAABy5AMAAJAjHwAAgBz5AAAA5MgHAAAgRz4AAAA58gEAAMiVLR/Mu+uBVfv713zr//Ex3h96nvVsF887AKBcypYPVLSuuK7tEow/Pc96tovnHQBQLmXLB3pdW5QvjD8928XzDgAol6bLB35vPKa1P/BDd6/6xFJ1P3b7dnfVUFeD7mrawPT89ian56F43gEA5dKM+aBojQL5wMgHAFBW5IN6kA+MfAAAZdV0+QBjiHwAAGVFPkD9yAcAUFZNlw/iJw1HY0wWKQHyAQCUVdPlgzF5g2FMFikB8gEAlBX5oB61FrnuDzav6f3F4kd/9P4PXlUMDcMHPnTNgu3/asbdT15y6aXFUF1+e8UGHUyfi/4ll1z+kY+v+OZ/veGz+4r+WCMfAEBZNV0+8O85GKWqi/zK+y5b8OBfL+v+8aqn3r5m7q3FaA0fXXX/st0/ubp1tdqXX/uJ5Y//w9yvHNUKvlqfIfNBumlltw7kAwAoq6bLB+PnqulLV+7/77+7ZtPSr5+ZuaG3GK1BNXv1M//z6pldRX8sDJkPsk1HfwbyAQCUVdPlA/9ixFGqusj1dz22fO9Pf/03PzrnSy+4UVy49NJ/tmjd8j1n1/T+ousv/vFjt26bt+W4zumPxY/+6IqpbariGvT0D39s/sKH/lYzNV93fWT+XRp0pZ+/7a9m3P2kLq1+5t3rP/3n2fcjBs8H2abtf3Yi7foM7Q+8oUehxbXFnC8+//7Lr/Q6teje4nkHAJRL0+WDIScMR+UiH/jQNUt2/d2NX37xfBroWN958H9PWfrHvvTRlf9c5VYl/5/Ove13Vm/83d//ymVXfGTmFw6pDE9Z8rlf+83fvvzaaZEPfuO3Wn/vG/9p2e6f6PaPtN+pxqqn/8fVratd6bVsy+ee0Cv+Jbv+46qn3r5yWoe3MOeDyg/ng2zTyz58beUZ1J1137+8embnnI3PKZ3EGw+1nF8cAFBG5IN6VC5yzdxbVVwVBdT+J9dMXf74P8z7079UVvjVyz6oZLCs+8eqwZ5p6Xv7rv3OB9P/aHfns/8rfnzhqulLlQ9mbuj1nEU7/+37fv03NK6coTOkbxWI84EK/O90fskfH//UQ7o9yny6adbN1ld6WPr1Mx2P/PuBiTVpu+J5BwCUS9Plg3H6/sKcL72grdOPFT3/7UMfna2s8Hv7/nN87yDUygdtm19RWyMDs967lM6Rym8lSOWg7xp+Poj13//BqxY/+iN9uFuLtiuedwBAuTRdPhgPfsOg48//Q7xw1yv+Nb2/mHrzlvdf/mG9Cl+y6+8+8KFritkDatXmqu8faHJj8sGCB//a/4bCj2jhQ387MLEm8gEAlFXT5YPx+PeNU5b+cddf/ON1f7C56KvcXnv9iif+i+rrr172wWl3PtJ16P8u/Nq/iZ8/0ATlgK5D/2f6uq//1tK7r7hubtT+K69fsuqpt/3zB5pf/JzB9Utq5QO90O/Y+e/0ocaQ+SDdVMGl8gz++YYrp3W0bX5ZZ04fUVXkAwAoq6bLB0NOGI5skfY/+6G/m1D05dJL5/3pX+ql/1XTl176K+/7+KceWtnTr7s04nxw+bWfUO3XiHJDmg/kyusXL/4Xp7t6f64PNdQ9P38s8kG6qfJB5RkW7Pibts2vaN/Vz7x7/V2P6eS+sRbdWzzvAIByIR/UY0wWmVCy/DFM5AMAKKumywf8faaqyAcAgFTT5QNURT4AAKTIB6gf+QAAyqrp8sGYBAhSiJEPAKCsyAf1IB8Y+QAAyqoZ84E/3G1/4Ifu+lcafOz27e76NyRq0N34gUR39eFuk9PzUDzvAIByabp8gDFEPgCAsiIfoH7kAwAoq7Llg1X7+6+4rq0oXxhPep71bBfPOwCgXMqWD+bd9YCKll7X8jHeH3qe9WwXzzsAoFzKlg8AAMDokQ8AAECOfAAAAHLkAwAAkCMfAACAHPkAAADkyAcAACBHPgAAADnyAQAAyJEPAABAjnwAAABy5AMAAJAjHwAAgBz5AAAA5CZ6Ppg+fXrRAQAADaHiO6HzwZQpU6ZOnVp0AABAQ6j4qgQXnfE34nwwbdo05RedkncRAABoABVclV0VX5XgYmj8jTgfiM6nCKODAgCABlDZbWQ4kHryAQAAKDfyAQAAyJEPAABAjnwAAABy5AMAAJAjHwAAgBz5AAAA5MgHAAAgRz4AAAA58gEAAMiRDwAAQI58AAAAftkNN/x/C90Jb7LfpQMAAAAASUVORK5CYII=" width="693" height="259" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-your-adaptive-cards-through-ms-graph">Sending Your Adaptive Cards through MS Graph<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#sending-your-adaptive-cards-through-ms-graph" class="hash-link" aria-label="Direct link to Sending Your Adaptive Cards through MS Graph" title="Direct link to Sending Your Adaptive Cards through MS Graph" translate="no">​</a></h2>
<p>To send an adaptive card through MS Graph, you need to include the card JSON in the body of an email message. Here is an example of how to do this using PowerShell:
*Personally for these kinds of things I like to include it just as a JSON string copy pasted from the amdesigner as it makes it easy to view the example on the site by pasting it in there, but you could also build it using powershell. For this post we will just do it with JSON copy paste *</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Originator id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"123546879"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Your url for the logic app saved from earlier the same one used for the `HTTP URL` for mine it looks something like this</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://prod-71.westeurope.logic.azure.com:443/workflows/{workflowid}/triggers/When_a_HTTP_request_is_received/paths/invoke?api-version=2016-10-01&amp;sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&amp;sv=1.0&amp;sig={sig}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Example values for other variables</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$photo</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://example.com/photo.jpg"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$name</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manager</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    name = </span><span class="token string" style="color:rgb(255, 121, 198)">"Jane Smith"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$peers</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Alice Johnson"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Software Engineer"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        title = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bob Brown"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        value = </span><span class="token string" style="color:rgb(255, 121, 198)">"Product Manager"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    message         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        subject      = </span><span class="token string" style="color:rgb(255, 121, 198)">"Some org information"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        body         = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            content     = @</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;meta http-equiv="</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">Type</span><span class="token string" style="color:rgb(255, 121, 198)">" content="</span><span class="token plain">text/html</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> charset=utf-8</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            &lt;script type="</span><span class="token plain">application/adaptivecard+json</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">{</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">AdaptiveCard</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">version</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">2</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">originator</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$originatorId</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">hideOriginalBody</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ColumnSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">accent</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">bleed</span><span class="token string" style="color:rgb(255, 121, 198)">": true,</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">columns</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">auto</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Image</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$photo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">altText</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Profile picture</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">size</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Small</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">style</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Person</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Column</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">width</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">stretch</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">items</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Hi $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">!</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">size</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Medium</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Here's a bit about your org</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">spacing</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">None</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Your manager is: </span><span class="token operator">*</span><span class="token operator">*</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$manager</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token operator">*</span><span class="token operator">*</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">TextBlock</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">text</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Your peers are:</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">FactSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">facts</span><span class="token string" style="color:rgb(255, 121, 198)">": </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$peers</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token string function" style="color:rgb(80, 250, 123)"> </span><span class="token string function" style="color:rgb(80, 250, 123)">convertto-json</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">ActionSet</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            "</span><span class="token plain">actions</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">title</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Http</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">id</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">1</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">iconUrl</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">method</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">POST</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">body</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain">reason:12134</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">url</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$httpURL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    "</span><span class="token plain">headers</span><span class="token string" style="color:rgb(255, 121, 198)">": [</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Authorization</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        },</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        {</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">name</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">Content-</span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token string" style="color:rgb(255, 121, 198)">",</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                            "</span><span class="token plain">value</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">text/plain</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                    ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">                }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">            ]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    ],</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">    "</span><span class="token plain">`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$schema</span><span class="token string" style="color:rgb(255, 121, 198)">": "</span><span class="token plain">http:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token plain">adaptivecards</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">io/schemas/adaptive-card</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">json</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">}</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/script&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/head&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;p&gt;Some org information&lt;/p&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">        &lt;/html&gt;</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain">@</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        toRecipients = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"bob@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    saveToSentItems = </span><span class="token string" style="color:rgb(255, 121, 198)">"false"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users/{id | userPrincipalName}/sendMail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the email with the adaptive card</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-response-of-adaptive-cards">Handling Response of Adaptive Cards<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#handling-response-of-adaptive-cards" class="hash-link" aria-label="Direct link to Handling Response of Adaptive Cards" title="Direct link to Handling Response of Adaptive Cards" translate="no">​</a></h2>
<p>When a user interacts with an adaptive card, the response is sent back to your service. You need to set up an endpoint to handle these responses. In our example we are using logic apps. The response will contain the data specified in the <code>ActionSet</code>.</p>
<p>Here is an example of handling the response in a logic app:</p>
<p><img decoding="async" loading="lazy" alt="Response" src="https://mynster-it.dk/assets/images/response-54f1b2b5391872de5a0a9ffac4d1ca0b.png" width="2533" height="603" class="img_ev3q"></p>
<p>By default the Headers section includes a lot of information about the adaptive card sent to the user along with a bearer token from the user, which we could unpack in order to see who it came from.
And our body is by default set to send whatever we supplied in the body of our action.http in our action set.</p>
<p>To handle these situations we need to go back to our logic app and go into the logic app designer.
For this example our final result will look something like this:</p>
<p><img decoding="async" loading="lazy" alt="Example Logic App Flow" src="https://mynster-it.dk/assets/images/Example_Logic_App_Flow-b4dbb654f9214263f2aaf496642e428d.png" width="1049" height="1207" class="img_ev3q"></p>
<p>And to go over each setting, first we are receiving a HTTP request with all the data, after that we first need to add an action called <code>Compose</code> and our input for this one will be <code>Headers</code>. <em>This is needed before we can go through the JSON data</em>.
Next we are going to Parse the JSON in our headers with an action called <code>ParseJson</code>, and for this one our <code>Content</code> input will be the output from our <code>Compose Headers</code> and our schema can be auto generated by using a sample payload like shown here:</p>
<p>First make a run of your adaptive card and send it to the email and make an actual submit on this one.
Once that is done you should see some data in your logic app</p>
<p><img decoding="async" loading="lazy" alt="response_logic_app" src="https://mynster-it.dk/assets/images/response_logic_app-88208caae95886bc0d08b14b2d5a9528.png" width="1982" height="595" class="img_ev3q"></p>
<p>Click and open the job and open/click on the <code>When a HTTP request is received</code></p>
<p><img decoding="async" loading="lazy" alt="HTTP_request_received" src="https://mynster-it.dk/assets/images/HTTP_request_received-4c55196c62c7de525aafa293aaffdb28.png" width="628" height="533" class="img_ev3q"></p>
<p>Here you have your Headers and Body seperated, copy them both to a notepad.
Go back into the logic app designer and go to the Parse JSON Headers, and here you are able to click on <code>Use sample payload to generate schema</code>. Paste in the data from your Headers and the Schema is created for you.
Now since in my case I would like to use the Token from the headers, specifically the property <code>Action-Authorization</code> in the headers, we need to do what is called <code>InitializeVariable</code>. For this one we give it a name, in my example I will use the name <code>Token</code> set the type to a <code>String</code>, and then I will click inside the value field and select the small lightning, which references to an earlier defined resource, click on see more on the one called <code>Parse JSON</code> and you should be able to select <code>Body Action-Authorization</code>.</p>
<p><img decoding="async" loading="lazy" alt="lightning" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmUAAAB3CAIAAADNbKDJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAABjbSURBVHhe7Z0LkBXVmcdvwvpCTNZ5MoDCDMM8MLImG5XVICPDQAgpElMhootCoKSWra2UVVEx1mZ1EdAYzKqrG0ypOEEUQQEnPlYFXETFiI/JIIpYWhpwBB+AgEFw5O53+jt9+uvTfe/c6Ttz7+3h/69f3Tp9+rzP6fOf03MZEgMHVADQVQZUMP0jU9GfKE9Pf6KcKLMoLyNKibLSklKipLi+vj6RSNBnNM2ZM+fAgQM7d+6cPn26jqqv3+hIX0AQdNQLfgmi0Mv8EoIgqFPBL0EU4JcQBB1tgl+CKBSaX9bV1ZFf0icEFY70Lgv1Ftl+6e6DWW2FoNfjuF3nhpeGUCO0KBfWKCkrVU6pzLKkuIQoLqK9CX4JxUh6A4ZiJZ9fVlYOHlY9FAAAQI8ydGglXDN28vySDg3WjAIAAOgh5l//nzcumPebG+YbbrpxAShktF/ySzZrOgEAAPQQQ6sqq4dWWZGgkPH8sqI//BIAAHIE+yUsM0Yov+Rv91T0L7fuAQAA6CGqKrVfwjLjAvslf+MRfgkAADmiqnII/DJewC8BACAPwC9jR8L8U0v4JQAA5AzyS/wKM17ALwEAIA/AL2MH/BIAAPIA/DJ2wC8BACAPwC9jB/mlMkv4JQAA5BLpl7DMWAC/BACAPAC/jB3wSwAAyAPwy9gBvwQAgDwAv4wd8EsAAMgD8MvYAb8EAIA8AL+MHfBLAADIA/DL2BHBL69b98Fn+/dp2u6z7nYf165p/2DNXCsyU6iRO9Zda0V2nftaVTejN6OnmLt2x/62ZiuycFjS9ln72uvkZQ+uk65A4yYb1k2ELrbOViAtrWxnsLltX+sSO7J7oSq64znq+hqgmfKn5842t3X2MPbMFPcI8MvYEc0vM3mEojmWyNVzfpnpVhWtC3GnO3rtm7vO97icEQ+/zHTld90vu8Gku4KoLku/dCcuf37ZA0MHv4wd8Ms0ROtC3OmeXpv9saB+3odfxtMvaTC5p/BLkE+6xS+d55bWk/eGltK472x5kdEWwJfuE66en7UqUixufy5n11iydocT49VIGTlNyFPhtmF/2xrTSHp+dCRXbdI4Zdp3PbzGUEXOQ7imjS65O/5CVIxsrXqkaUycBIFnzNk43Lvuw2+Nhr+PlNjXfRphuSmYxL7S3L3GhL2e2k1yG6NqCUyc6aku3DfXIVNgoDR6HLwZ9xflpDGNkWGDv/bgZDm9c9ufJrs7gN64+UummJDmeZghEl02JYjFFh7pYYZ3x7q1bn+tRnpPCk9cWNWa4Fyo8s3Uq+GSYyIqeuN1cUvVSOMZLI3uOpEm4N71VaHT09Phf4L8/QqfqcC2EA4lC06uwV+IM8XNepzlStNp5EowT7TbsND5pUIC2c1q0empDR+sWaci03bED/wydmT5+0tePc5q4wVNC0uvUUqm1xYvJm/hOinVggvZmPy53OVonnznqQukZFR6N0atb/9d/YQ4i9ttg8S76+FVoRpgngRVuBtWlTph0VrnWeIENDJ2M8RdFfayuKMR7KNom7NtidaqjG5fVCPtUTJhnZEjJYGOi4EVA+UmE3Md1juBKqetLV07fRMRnBQztgF83U891B5u4W5Ge/GENy8EdxhDF1tnK1DUQg3watSYEaByQh6N4AyGzYU3jHYfFd5dr7S0M2uSibtUCDdP9dErxHsoDF51YTMluylSBqG8Zj0HME3VOC3hGDXIdka3ovAGm/4G156/L9YT6qRP08hw4Jexo/vOl3ZYJFPPFT0tLs5DkuIZELnk46TD6gGQRflKuK+V91AH2UhqkpvFPPDewxm46+EV4u4pOizr1R0RrRWJZTM0vo67ufxPoNseB1/hbh/dKiixfKr14Msq3LBTrBlPiTM7XpP8vZYtccZHzrVvWEJQJZvFENJO30T4JkURVrg9WWE9lYjBdPpuyqTEYrtM0TyBGApncEIXW8oVaGJEsV5/7Ub6Vn6wajc+xVy4kf5CNGKQxcLgYtOW5rurw2YwZaR76RBSnQjTXd0v0fcQ0r6DTbtsRNgeZH/j1aXbEjUa1l1F6Hw5qL6EjnZnwC9jR6780r+mibDdjRC55BLU4WDVHv4lblJSewLN8NoTdtfDq04WTmHZct0R0VqROKTBvo67uURkaB85MtgeipGblB58WYVdHT3hgbkgKJn4qdyqxUvmn+vQBAJvTMLb6RvzwPj7Wq4ImayUPVVQpW6M2xJ/g6lA3j1TNM+Fcrlt04PjLyddpHtJ+IvVXQhppBi3kKp1doWvQFM7BahA/nRTushBploozJ8qJrQ0Eynv6rB/wH3ZNaK6kJkKzHgopl+hBO/KGDccMshWMmuQA2tJtjY4Eb4pyxz4ZezIiV/SYjI7nUvIilT4c5kl6IYpV8pnTNXiNoMWN9coIr28ZumH3vXwGuN7LFXhbkWmBLeF/sQhj5asiMKckgJyNwnpI51d2ggdb6qQic1jL55/mg5rnMP2NQe3TNFm2VONLJDCnDKkmwoxJqHt7GT8rdrDElNAjlugp970hZ4qTMvDm+dCd3Uu1QanTNEYp52pI/nSwStH1cs1hjRSlSPGza7aiXcInQsnpfrtqRg6A7XK6xq1oXWdZ6uhpVGAyzEBEabSxJoPLBVfdXJ2dDikR0FUI0M6YggUIqfYDZvueIMsk4UMspo+f73+vlgrRGV0h8I/yOmAX8aOLH9/yess7FnSj5C7sNT6k1l8z4/EyyWXoBeWtdsPks6rsnvftlCL24lsazPrmBpJMSpB2F0D1eU9Zubp4kvO5e2JorUisVeCQXWc6uLsbo3+0Qjto2qzSeOvwk1shkt3UGVv0yWbGHvYvb6I9qtLp22ip6YcVaaIIUK6qZAzGN7O9ONvty2YWI6bfwwVJrv6UcMpgWKccfMak3YYXagj+lZrm1gSOn3ol8vCv+9jZsH7vk+wkaYxqjthVYvSgnNBqOxyuQq4AaK1XmdDS1ORzgo0AV/YzEjI930UXnXhMxXYFmyo+4FVYeMVohrgTrG6ZcLBQZbJOplfPUReX3yrhXstlzr8svcSwS9BVgS39Vgh901QmNBubjlrOD7PyHJmpWF0H0vaMupITIFfxg74Za6BX4Kehc43GVkXTaV0o6xmllZ1+AERpAZ+GTvgl7kGfgl6DH5P2PkE8ctG/zrs+sya15hEZm8ggQR+GTvglwAAkAf+49+vmTf3ugXz5t4w//obF8z7zQ3ziZtuXAAKFvglAADkg2HDamtr61zVQwUv+CUAAOQD+GXcBL8EAIB8AL+Mm+CXAACQD+CXcRP8EgAA8gH8Mm6CXwIAQD6AX8ZN8EsAAMgH8Mu4CX4JAAD5AH4ZN5FfVsAvAQAg1wi/1PsxVNiCXwIAQD6AX8ZN8EsAAMgH8Mu4CX4JAAB5oKamBn4ZLyUGDvD8csiQU60ZBQAA0O1UVQ2BX8ZO0i9J5f3Ly8rLSg1lAIRSypREprSEKA5SwhQTRcXFRUUnnzxk8CnWXtMl1P+bVFlZBUEFoKGOqqur8eXYOIr90jtiEo5rKuMEIBXlZYz3o1VX6dRuS8lRHeMkzxwyOOKbD/VzfFUVbU+WNmzYsGjRIn1RXT158uQXX3xx/vz5+toVxVA83dXXEJSFyCNZdLKUh0uS3o+hwpbyS3PEdF1TGycAqXB+osrqh6r0duscYZVlOqZZVBzJMsks6Wd5vUW5mxRr8eLFmzZt0hc1NTfddFNra+uUKVP0tatU8RAUWWSTLG2VMMv4yPilzzINjncCYOPKeRsRjYDdBh2UXJNf2zqWWdQlyzRmqXcpV7xVXX755du2baNPvnzaEYelbr755i1btlx88cX6GoK6SdoqYZaxkvbLNJYJQBDXOO1zZ+akP56yd7q/KHUs03kze+rQb1m+GEpl7RnGLPX+FNDmzZuXLl1KgalTp27duvWWW26hywOO9uzZQ5d0iz7pFiUwiUlWmLOsW7eOYyAojbRJCumdGIqDPL+Ea4LM6Wm/ZIxfsmUe991fJUb9YeDwBssdLQae1phoXNZv1A3kl7xJkfTmJPTAAw/Q2ZECt95669tvv33JJZdwPCl4iy4pku+asAlQAkpGiZ37EJSR9B4MxUe2Xxoc45TYOyY4msmNX5YryyTTVGZ5zPcWJkYvJr9MnHPbwOHnWx5pUGY5+p7E+UvJMk8Ys4jOl3pzCuiKK67Yvn07fT7riGIuvfRSijnkiAJ0edttt73zzjsUePPNN5ctW8YZOSwTs0wCCOpUegOGYqWUfglAGrL/KSqN3Uq/5Bezx42clxizLHH+ksToexPn3ZU4579DLXPgaWOVp465P9G4PDF2RaJp9Unn/y70cMl66623Wlpa6PPKK68k/9uxY8eDDz5I8bfffvu7775LMSZAafgW56IwRdItSsCREBSU3mWh3iL4JYhCj/qlgf3ypPqfJMa10HlRGSEdHBv+qE6Q5/7PwOFjAmZ5b2LMA8opxz6UaHo40bQqMeF/K86cnmrnWrFixb59+zZv3kzhq6666pNPPrnjjjso/Pzzz7e3t0+bNo0u33vvPQpQzLZt2zgZZaGMFKYYjoQg6GgQ/BJEITd+2Z/OmKWlfcbRYfEh5YKNDyo7VK55nzpHfm+RscyBpzUlGpqVpyqzJKdcmRi3KjFudWLcI8dMeCSVX86ZM2f//v1sfqQXXnjhiKP3HU2fPp38kgOckm7R54cffshZKJ7CnIXiKQ2XA0FQrxT8EkQhZ375zbqfJL7fovyPXFBZ5nJlinzWbGgetOi1KRf+7KIpF9JxcO/evZ9//vmLy59Qx0rHKdWpdHxLYsJjA86chpdjEARlKfgliEJu/LK8vOzYhj845rdKWWYTWSYfNMk16ay54f5tHz15z3L1e83G5UOW7/ziw+0/t8xS8ae+TffCLyEIylLwSxCFnPnl1yc85pgfWyZBlqldc/CyD/Zvf/dS/dWel1Z/+MWfH3oyaJZEn4lP1NbW6iUPQRAUSfBLEIXc+GVZeUViAllgi4PjmsoynYNm00ur2v+2cfnjTnjlkIc+Orxrx89dszz27HknVf6gX/UFx/zTb5VlTniKvyWrVz0EQVDXBb8EUciVX/bXx0RpmeqLPKvIIA/t3KHevqoXsK+0fPTlyyufNidLMsv16zc+/vgaskw+YsIvIQjKUvBLEIUc+CX/+0vH7dyXq9oyiVfJIDc9/JRjn6srV37a8XH7DPZUJ2VRaV1HR8ehQ4fLB5yWaFoNv4QgKHvBL0EUcuuXlmW2VK7a7Rgke+drj37yFYn/XQcpmTxcVFKTdEQBLsH4ZWJWEgAAomDtgwBkQs79Urpm66OfHnl51Rr2Ts9Kx7d8+96P9nQcfmHFn9P65RH7GQAAgEyw9kEAMiFPfknQ4XLPkU93zhQ2yXy7+WM2S0om/bJfzZQTa/956NDa6uq66mF17JfOyxUIgqAuCH4JopA/v/zLY7vZCh3t3jXTiZdmSUi/XL6iZen9Dw8YWNvQeMF5DT86fvSiPhe+QcapnwAIgqDMBL8EUcifXxqUcb66ei2FLbMkpF+awMGDB7dvb//7UxvINYlTB+NfZEIQ1AXBL0EU8u6Xlav38uEyaJZE0C8HV/0jByjmwIHP29t3lpTV6IcAgiAoA8EvQRTy7Zf6cBlqlkQav5TGqR8CCIKgDAS/BFHIr1/y4fKXKcySMDZZPuA0Dpw5cjwH4JcQBEUT/BJEIa9+qQ6Xb7yyO8QsnT9NQBi/bG/fyYHPPtvHgXXPPMcB+CUEQV0S/BJEIY9+qQ6XSj6zPPasBSdV/ZBOk32/9S/kmsYv0wh+CUFQlwS/BFHI6/kyBDJLOjjSIfLqa+aVlNfDLyEI6nbBL0EUCs0vv1E5YcNzL7ERrl+/8TtnjuVwGsEvIQjqkuCXIAqF5pfHnnX98NNH7dr1MXuhCaSR5ZeTJ0+eLTR16tTTTz9d3+sZUY0zZsw444wz9HWYJk6cOGvWrJEjR+proU6zjx49utPy04tGgMaB2qCvIejoFvwSRKHQ/JI4YcQvJky86NChw9oP04qSFZfaftklYyA3yoGnSnW1RvglBHWv4JcgCgXol0Tf4TN/ecW12hLTavv29tJy39/3gV8GBb+EICn4JYhCYfolcWLd1D8uWa5dMbWWr2gZMLBzv2TLoc9Zs2bNnj3b2A8l5te2JAqbxDpq9mwKUwz7zaRJk+gz+FqVqmP/M7ZkijUtMZ4XrNFk52T6XlhevmRZkRTgDnIbuASTwDSMwrI6EmWRl6Z5wRohqNcIfgmikDu/nLzFcsT0/N2o31cMGrF169vaGFNo3Pd/NrTa9yfXacc3TmPEPsTGQKIAexXfsvzDWAX54syZM+mTs6T6BaRxIE5GFVEhFE+fJoss1qpRGhhZslU1hWVeI7qkSK6IZMqkLOPHj+dI6iN3kxvWqV+a9CQrGQT1JsEvQRRy55fW/z+XAcc3Ljmv4UfmDxQEddc9SwedYv+xddrxnQOSFpsEuYJ0O2kSMkyfFKYYJ5USlUYlcLzxEkvGWqxkfMml0WcmfmmUKq8UVWTqogD3VMpUxKVxAqs6k4YGZ9q0aaYWCtClGTEI6k2CX4IoFLJfEn3PXXjGd8a0tr6uHdJVR0fHghtvLSmvHxb4tySpnENajrw0hkFhiqF47bSuqEDpN0EZB7KSyctUNZJMdgpzFl2xOKeG+qWJJ0lvo3id33+k5pbI6jgxX8pcRhTJySCoNwl+CaJQ4H5JHDduRcWgEVdfM2/jiy9veeOt9es33n7H3Q2NF/Q9e+7Xpn+ql79Q9n4ZNAnpN0EZB7KSyctUNZJMdjI8OgRzes7LLZF5pSiGbVIWSN0PVsSlccmmOlWESJOqFgjqfYJfgigUvl8SX5t58PjG5m/UXvTNqh+WV9QMOqV22LD6xKwjdEsvf6Fs/FL6ilSqeJZxICuZvExVI8lkpwA1niM5L6WksMxriTtLn5yS0lgHTS6ZSzMtCa2dcpnfmEJQ7xb8EkQhFn4pqa2tratTX/DpRr+0bsnfdI4fP57C0m+CMpZjJZOXaWo02WU8RZrXoVZ6KWobGSSJ78oaKYZyBRtGWaiDXDKHOQ1d0tCZMH1OmjSJwxDUywS/BFHolX7Jv3tjsdNYliMv2UsoJWXku+xVLI7kNOw3QVE824yVTF6mqdFkp7BpPP/bFXY1q/FSXJRpOYktkEqgLGT2XDInMw2jANdCkY2NjZyG4jkZ3yJx7RDU+wS/BFHofX4JQRCUXvBLEAX4JQRBR5vglyAKBeKXg+Ykl21K/nV3ct/B5FUP23cl8EsIgrIU/BJEoRD88qRfJJ9+I/mnvyRnNCef3Za85B47gQR+CUFQloJfgigUgl9evTL5yYFOjpUG+CUEQVkKfgmiUAh++Uhrsn1vsum/7HhixFx1+pQx8EsIgrIU/BJEIb9+OfnO5I49yS+/Uuw7mHx7V3LXvuTBw8mFTyWHX5v8v7eSXx1J3vmsLwv8EoKgLAW/BFHI+/mSjpV0uKQjJl/W/Dq5dWfylfeTi59Prnot+fv1yYaFXmICfglBUJaCX4Io5N0v/+2B5N6/qQOliVm2KXngi+TKV+03sQz8EoKgLAW/BFHIu1/e/ozyyxnNXsyvViV3f64+TYzE8ksAAOgy1j4IQCbk3S+f3JLcvjs56rf6ks6UdLLc/0Xy7ue8NBL4JQAgW6x9EIBMyK9f1vxafcfnlfdVePyt6qs9ZJZ3PadiXv9AfeVHJmaMX0IQBEUT/BJEIXd+eVmH5XzE5DuTnx5Qv7CkMJnlV0fUcZOOmDc8kfziS/WNWfM9IM1lHfBLCIKyFPwSRCFnfvn1S3f6nM9h7qPqLxX86/12fCr6TNsFv4QgKEvBL0EUcuaXx/z4GWN7U+9ONm9Ur1vXb1MHShPfKSf8dAP8EoKgLAW/BFHIgV8S5JcnnjvP2N4ta9QfKPjr7uTDr6q/tG7iO6V47M3wSwiCshT8EkQhZ35ZXDnSMr8IDPmHcfBLCIKyFPwSRCFnfllWWnrchIcs/+sS/SY9UlNTA7OEIChLwS9BFHLml+SYRZVnh35LNiMu6xg8ogmHSwiCshf8EkQhN37ZnyyzTB0x+333ctsIM6N01DV8uIRfQhCUpeCXIAq59MvystKy0hL5xZ8MKWpcSGaJwyUEQd0i+CWIQs780nkpW8qWqU6ZGb6YvayDT5ZslvBLCIKyF/wSRCGXfqn+IaZrmUVDzjpuwgrbHf30m/TI4BFNMEsIgrpX8EsQhRz7pbBM5ZonDz6r7znXH/PjZ9Rf/6ET52UdfabtSkx8qqhx4amnjx02bBjMEoKgbhf8EkQh935pLJMoLSkpLSkmSoqLiomik6urqxOJhHFKmCUEQd0u+CWIQl780rgmnzIJZZmOa5JBkl/CKSEI6jnBL0EU8uiXBP8jE+mXZJDkl3BKCIJ6TvBLEIW8+yW/mFWW6bimWsqJBK9pCIKgnhD8EkQBfglB0NEm+CWIAvwSgqCjTfBLEAX4JQRBR5fq6/8fKfmHMLAmp1cAAAAASUVORK5CYII=" width="613" height="119" class="img_ev3q"></p>
<p>Next up is the body and you can follow the same step as above in regards to the compose and parse of JSON.</p>
<p>Next since we do not want to receive multiple responses on the same adaptive card, we will need to make an update of the adaptive card in the users outlook.
This can be done by making a new compose and include the inputs of a new adaptive card example:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AdaptiveCard"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"$schema"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"http://adaptivecards.io/schemas/adaptive-card.json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"version"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1.2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"hideOriginalBody"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"originator"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"originator id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TextBlock"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"text"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Thank you for the response!"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"wrap"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="thanks_for_the_response" src="https://mynster-it.dk/assets/images/thanks_for_the_response-0c5e48b5a502d4ecd82b91fbd1c0f31d.png" width="632" height="474" class="img_ev3q"></p>
<p>Next action is to send this update to the adaptive card. For this we need to make a <code>Response</code> action with the <code>Status Code</code> set to 200, the <code>Headers</code> set to <code>"CARD-UPDATE-IN-BODY":true</code>, and set our <code>Body</code> to the outputs value from our compose like shown here:</p>
<p><img decoding="async" loading="lazy" alt="update_adaptive_card" src="https://mynster-it.dk/assets/images/update_adaptive_card-d86f767ef8e548fdf1b769952d466739.png" width="632" height="459" class="img_ev3q"></p>
<p>Which changes the adaptive card in outlook to look like this:</p>
<p><img decoding="async" loading="lazy" alt="Update Response Card" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqMAAABKCAIAAAAAKcpcAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAAVLSURBVHhe7doxchNJFAbgPcRmzlzlKnMlDsEViE1MSkjokARfgMQRCQSKCPYa++++4VXvSEJGAi1qvi9Q9fS87jctqvglwR/PAIB5SXoAmNnhpL+5ubm6uvoTADiLxG7Cd4nhkx1I+nRKy+vr69vb22UKAPhpEriJ3YTvjwr7A0mfjxXpt1wAAGeR8E0ELxenOZD0+Uzh2zwAnFnCNxG8XJzmcNIvIwDgjCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzCQ9AMxM0gPAzH7dpP/w4cNf/7XZbF68ePHu3bvcWoqO9UM2+S7Pnz//+PFjTpHWy9Sx8iZ8+vTp1atXy/WM8qfz5s2b5QKAE/zq3+krIMe/9C806U/sOC6X9AA8naQ/k7RL0+Xi+0l6AI5zqUkf9ZN+x2fyb7PZ1GSWZGEmszDjh4eHms+qKu7grP27vuTWmMr/NPu3eGxR/5RQk2PuVsdxt2pRq758+VKV2b9monvV2sfHx0yOR073qozMV8f7+/vslpl+khifcDxCqSfJu5GF9ZA76/OEtXOkXa16+/Ztn2J8tm8cZPtt39mudxgPkiVjFwCOdpFJn1Sombx2dmZckxUnNc5riitUKsBqPjPJktq8c6ilJvO5m3F2qyCvbcd8qpouqPlx7ShdxrWdattPW+OVeuAa15LqEn2EcavVU5UqroW53FlfNT15d3dXM/0+5zWravztg9R5U9lve78J2fP169cZ5LKfZzxjBrUEgBNd6nf6Gm/fLZ0oudVBMs7XJqVujcZte4fVVh2NPaj5VVlLo2o9bl76RPvWRtfEvo6r5VkSNS6r1jvrq2ZcuFoVdZbt+UzuPEifPYMqKKsdcq5c5jXjlI07A3C0eZK+xvkqWSpa9kVOXlMz3lrpLh05Y9/o1t+b9Kv66CX71sbYfV/HOtRofODoZ67LffVVtrrsVZGF8fSD9NlrnJ3rbnbYfP0xv/QvBykbOwJwtEmSflXW0bIvcmqTGO+OkjeJsbu7uxQkkDKz2iqDx8fHlO3L3bps3Tq3UtCPGhnnbg32Pc946n0de599Vq0P1udubD9wJvM8Tz9I1de45DIFL1++rPdwmQXgJ5gk6cfwq2+KFS37Iqc3yetYMMqtz58/V32M20YGtTAyqPmq2blht44MUpbijGtJHXD1tKMsqQeOLNmZ9ONWO9WjdsHO+ky+f/++xtW0VlWLTKa+H/6JB6mz5/Lh4aE3qYLMj5Ull5nMreUagBNMkvQ1X78AJ286J3ZGTga9Se3QPxqPsnY1X2FWXcZtU5PKan1/fz/eat269NNGn271tKNunZqM9/2K0E8S24eqw3a72K6vmpqpbWum/sd+ly3rn3aQPnsGVZmz1OeDcTLGP5Tx7QLgaL960v+PVnH126rcHT8fAHBBJP1u42/RvzlJD3DRJP0O9XuyX4+LpAe4aJIeAGYm6QFgZpIeAGYm6QFgZpIeAGYm6QFgZpIeAGYm6QFgZpIeAGYm6QFgZpIeAGYm6QFgZpIeAGYm6QFgZpIeAGZ2vqS/vb1dLgCAs0j4ninpr66urq+vlwsA4CwSvong5eI0B5L+5uYmnynSzzd7ADiDBG5iN+GbCF6mTnMg6SOd8rEiLQGAM0js/qiYj8NJDwBcLkkPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwM0kPADOT9AAwr2fP/gYABV++d8KG1AAAAABJRU5ErkJggg==" width="675" height="74" class="img_ev3q"></p>
<p>Now if we want to take our response from the user and make use of it, in example an azure automation runbook, we need to make another action called <code>InitializeVariable</code>. The name could be params, the type set to <code>Object</code>, and in the <code>Value</code> we can set it up in JSON to include our previous values from our logic app flow like this:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@{body('Parse_JSON_Body')?['reason']}"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"Token"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@{variables('Token')}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="variables" src="https://mynster-it.dk/assets/images/variables-282fb44bdc5bf7e2c158a155e578d351.png" width="651" height="419" class="img_ev3q"></p>
<p>Lastly we can Create an Azure Automation Job with the action <code>Create job</code>.
We can either choose a specific runbook already created and shown in our azure automation, and if it has parameters it will be shown as well. These could be filled in or you can specify a custom one, so in theory you could include the runbook name in the adaptive card body to be sent to the logic app in the first place and just use that. For this example we will just use a test runbook with no parameters.
Now even though the runbook does not have any parameters we can still include the parameters we added by choosing <code>Runbook Paramters</code> in the <code>Advanmced parameters</code> dropdown example below:</p>
<p><img decoding="async" loading="lazy" alt="runbook" src="https://mynster-it.dk/assets/images/runbook-8b73f908c341aa0caa75bfa9719e836d.png" width="629" height="700" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Adaptive Cards sent with Microsoft Graph is a powerful way to present and collect information in a consistent way across different platforms. By using adaptive cards, you can improve the user experience and streamline approval processes for access requests, PTO requests, travel, bookings and so on.
In general it can be a pain to get your adaptive card to work just right, along with the logic app and the runbook, but once it is running you do not have to touch it anymore and can spend time elsewhere, so I would definently say that the time invested will be paid back in full, and then some.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="referencedocumentation-links">Reference/Documentation links<a href="https://mynster-it.dk/2025/03/04/ActionableMessages#referencedocumentation-links" class="hash-link" aria-label="Direct link to Reference/Documentation links" title="Direct link to Reference/Documentation links" translate="no">​</a></h2>
<ul>
<li class="">Actionable Message Designer <a href="https://amdesigner.azurewebsites.net/" target="_blank" rel="noopener noreferrer" class="">https://amdesigner.azurewebsites.net/</a></li>
<li class="">Actionable messages in outlook <a href="https://learn.microsoft.com/en-us/outlook/actionable-messages/" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/outlook/actionable-messages/</a></li>
<li class="">Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/publish" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/publish</a> <em>Note you might have to have outlook on the web open first</em></li>
<li class="">Admin dashboard for the Actionable Email Developer Dashboard <a href="https://outlook.office.com/connectors/oam/admin" target="_blank" rel="noopener noreferrer" class="">https://outlook.office.com/connectors/oam/admin</a></li>
<li class="">Microsoft Graph API: <a href="https://learn.microsoft.com/en-us/graph/api/overview" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/api/overview</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>mail</category>
            <category>adaptive cards</category>
        </item>
        <item>
            <title><![CDATA[Batch Requests in MS GRAPH]]></title>
            <link>https://mynster-it.dk/2025/02/25/BatchRequest</link>
            <guid>https://mynster-it.dk/2025/02/25/BatchRequest</guid>
            <pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating how to use batch requests in MS Graph]]></description>
            <content:encoded><![CDATA[<p>Demonstrating how to use batch requests in MS Graph</p>
<ul>
<li class="">Token for msgraph</li>
<li class="">Permissions on the endpoint you are using</li>
</ul>
<p>For all the below examples the variable $baseUrl will always be "<a href="https://graph.microsoft.com/v1.0" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0</a>"</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-batch-requests">Introduction to Batch Requests<a href="https://mynster-it.dk/2025/02/25/BatchRequest#introduction-to-batch-requests" class="hash-link" aria-label="Direct link to Introduction to Batch Requests" title="Direct link to Introduction to Batch Requests" translate="no">​</a></h2>
<p>Batch requests in Microsoft Graph allow you to combine multiple requests into a single HTTP request. This can be useful for reducing the number of network calls and improving the performance of your application. Each individual request in a batch can be a different type of request (GET, POST, PATCH, DELETE, etc.) and can target different endpoints.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-batch-request">Creating a Batch Request<a href="https://mynster-it.dk/2025/02/25/BatchRequest#creating-a-batch-request" class="hash-link" aria-label="Direct link to Creating a Batch Request" title="Direct link to Creating a Batch Request" translate="no">​</a></h2>
<p>To create a batch request, you need to construct a JSON payload that contains an array of individual requests. Each request must have an <code>id</code>, a <code>method</code>, a <code>url</code>, and optionally, a <code>body</code> and <code>headers</code> and/or <code>dependsOn</code>.</p>
<p>Here is an example of a batch request payload:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"requests"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/users"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sending-a-batch-request">Sending a Batch Request<a href="https://mynster-it.dk/2025/02/25/BatchRequest#sending-a-batch-request" class="hash-link" aria-label="Direct link to Sending a Batch Request" title="Direct link to Sending a Batch Request" translate="no">​</a></h2>
<p>To send a batch request, you need to make a POST request to the /batch endpoint with the batch request payload. (<a href="https://graph.microsoft.com/v1.0/batch" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0/batch</a>)</p>
<p>Here is an example of how to send a batch request using PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Batch request payload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    requests = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/batch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the batch request</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="handling-batch-responses">Handling Batch Responses<a href="https://mynster-it.dk/2025/02/25/BatchRequest#handling-batch-responses" class="hash-link" aria-label="Direct link to Handling Batch Responses" title="Direct link to Handling Batch Responses" translate="no">​</a></h2>
<p>The response from a batch request contains an array of individual responses, each with an id that matches the corresponding request. You can use the id to match each response with its request.</p>
<p>Here is an example of how to handle the batch response in PowerShell:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the batch request (as shown above)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Handling the batch response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">responses</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Response for request 1 (GET /users):"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">body </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Format-Table</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Response for request 2 (GET /groups):"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$result</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">body </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Format-Table</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-batch-requests">Advanced Batch Requests<a href="https://mynster-it.dk/2025/02/25/BatchRequest#advanced-batch-requests" class="hash-link" aria-label="Direct link to Advanced Batch Requests" title="Direct link to Advanced Batch Requests" translate="no">​</a></h2>
<p>You can also include more complex requests in a batch, such as POST, PATCH, and DELETE requests, even requests with advanced filters and you can include request-specific headers and bodies.</p>
<p>Here is an example of a more advanced batch request payload:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"requests"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/users"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Content-Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"New Group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"mailNickname"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"newgroup"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"mailEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"securityEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/users?$filter=country eq 'Denmark' and accountEnabled eq true and startswith(jobTitle, 'TECH') and onPremisesSyncEnabled eq true&amp;$select=id,displayName,userPrincipalName&amp;$expand=memberOf&amp;$count=true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Content-Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ConsistencyLevel"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eventual"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sequencing-your-requests-123">Sequencing your requests 1.2.3<a href="https://mynster-it.dk/2025/02/25/BatchRequest#sequencing-your-requests-123" class="hash-link" aria-label="Direct link to Sequencing your requests 1.2.3" title="Direct link to Sequencing your requests 1.2.3" translate="no">​</a></h2>
<p>With batch requests, we are also able to make one call dependent on an earlier call by adding the <code>dependsOn</code> attribute, as shown below. This enables you to execute a call only if the specified <code>dependsOn</code> ID is successfully completed. Otherwise, all subsequent requests that depend on that call will fail with a status code <code>424</code>. Additionally, it allows you to control the order of operations, ensuring that your call with, for example, <code>id = 3</code> is executed before the call with <code>id = 2</code>.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"requests"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/users"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"dependsOn"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Content-Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"body"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"New Group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"mailNickname"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"newgroup"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"mailEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"securityEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"dependsOn"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"method"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GET"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"url"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/users?`$filter=country eq 'Denmark' and accountEnabled eq true and startswith(jobTitle, 'TECH') and onPremisesSyncEnabled eq true&amp;`$select=id,displayName,userPrincipalName&amp;`$expand=memberOf&amp;`$count=true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"headers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"Content-Type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"ConsistencyLevel"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"eventual"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="some-great-usecases-for-batch-requests">Some great usecases for batch requests<a href="https://mynster-it.dk/2025/02/25/BatchRequest#some-great-usecases-for-batch-requests" class="hash-link" aria-label="Direct link to Some great usecases for batch requests" title="Direct link to Some great usecases for batch requests" translate="no">​</a></h2>
<p>Below we will have 3 diffrent use cases just as examples for what you could use batching for.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="onboarding---create-a-user---assign-license---assign-groups---create-calendar-events---set-calendar-permissions">Onboarding - Create a user - Assign license - Assign groups - Create Calendar events - Set Calendar permissions<a href="https://mynster-it.dk/2025/02/25/BatchRequest#onboarding---create-a-user---assign-license---assign-groups---create-calendar-events---set-calendar-permissions" class="hash-link" aria-label="Direct link to Onboarding - Create a user - Assign license - Assign groups - Create Calendar events - Set Calendar permissions" title="Direct link to Onboarding - Create a user - Assign license - Assign groups - Create Calendar events - Set Calendar permissions" translate="no">​</a></h4>
<p>This one will first create a user with a normal <code>POST</code> request like you might be used to and the following <code>POST</code> request wil be batched assigning a license, assigning group membership, creating a welcome event in the new users calendar and finally setting some calendar permissions for the user.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Create the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$createUserPayload</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    accountEnabled = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    displayName = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    mailNickname = </span><span class="token string" style="color:rgb(255, 121, 198)">"johndoe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    userPrincipalName = </span><span class="token string" style="color:rgb(255, 121, 198)">"johndoe@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    passwordProfile = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        forceChangePasswordNextSignIn = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        password = </span><span class="token string" style="color:rgb(255, 121, 198)">"P@ssw0rd!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the request to create the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$createUserPayload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Extract the user ID from the response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">id</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Second Batch Request: Assign License, Add to Groups, Create Calendar Events, Set Calendar Permissions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$configureUser</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    requests = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token string" style="color:rgb(255, 121, 198)">/assignLicense"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                addLicenses = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        skuId = </span><span class="token string" style="color:rgb(255, 121, 198)">"05e9a617-0261-4cee-bb44-138d3ef5d965"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Microsoft 365 E3</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                removeLicenses = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            dependsOn = </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups/{group-id}/members/`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ref</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"@odata.id"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/users/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            dependsOn = </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token string" style="color:rgb(255, 121, 198)">/events"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                subject = </span><span class="token string" style="color:rgb(255, 121, 198)">"Welcome Meeting"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    contentType = </span><span class="token string" style="color:rgb(255, 121, 198)">"HTML"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    content = </span><span class="token string" style="color:rgb(255, 121, 198)">"Welcome to the company!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token function" style="color:rgb(80, 250, 123)">start</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    dateTime = </span><span class="token string" style="color:rgb(255, 121, 198)">"2025-02-26T09:00:00"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    timeZone = </span><span class="token string" style="color:rgb(255, 121, 198)">"Pacific Standard Time"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">end</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    dateTime = </span><span class="token string" style="color:rgb(255, 121, 198)">"2025-02-26T10:00:00"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    timeZone = </span><span class="token string" style="color:rgb(255, 121, 198)">"Pacific Standard Time"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                attendees = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            address = </span><span class="token string" style="color:rgb(255, 121, 198)">"johndoe@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                            name = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token function" style="color:rgb(80, 250, 123)">type</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"required"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"4"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            dependsOn = </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userId</span><span class="token string" style="color:rgb(255, 121, 198)">/calendar/calendarPermissions"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              isRemovable = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">              isInsideOrganization = </span><span class="token boolean">$true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                role = </span><span class="token string" style="color:rgb(255, 121, 198)">"limitedRead"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                emailAddress = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    address = </span><span class="token string" style="color:rgb(255, 121, 198)">"johndoe@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    name = </span><span class="token string" style="color:rgb(255, 121, 198)">"John Doe"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the second batch request</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$configureUser</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-1-user-to-multiple-groups-in-1-go">Add 1 user to multiple groups in 1 go<a href="https://mynster-it.dk/2025/02/25/BatchRequest#add-1-user-to-multiple-groups-in-1-go" class="hash-link" aria-label="Direct link to Add 1 user to multiple groups in 1 go" title="Direct link to Add 1 user to multiple groups in 1 go" translate="no">​</a></h4>
<p>Currently with msgraph we are able to add multiple users to a single group but unfortunately we can not add 1 user to multiple groups at once. One way to handle this limitation is to do it with batch requests like shown here:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Batch request payload to add one user to multiple groups</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    requests = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups/{group-id-1}/members/`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ref</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"@odata.id"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/users/{user-id}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups/{group-id-2}/members/`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ref</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"@odata.id"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/users/{user-id}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"POST"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/groups/{group-id-3}/members/`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$ref</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"@odata.id"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/users/{user-id}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/batch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the batch request</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="bulk-update-users">Bulk update users<a href="https://mynster-it.dk/2025/02/25/BatchRequest#bulk-update-users" class="hash-link" aria-label="Direct link to Bulk update users" title="Direct link to Bulk update users" translate="no">​</a></h4>
<p>Right the last usecase i have listed here would be to bulk update users so updating one or more attributes on users at once.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Batch request payload to bulk update users</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    requests = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"PATCH"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/{user-id-1}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                jobTitle = </span><span class="token string" style="color:rgb(255, 121, 198)">"Senior Developer"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                department = </span><span class="token string" style="color:rgb(255, 121, 198)">"Engineering"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"PATCH"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/{user-id-2}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                jobTitle = </span><span class="token string" style="color:rgb(255, 121, 198)">"Project Manager"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                department = </span><span class="token string" style="color:rgb(255, 121, 198)">"Project Management"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            id = </span><span class="token string" style="color:rgb(255, 121, 198)">"3"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            method = </span><span class="token string" style="color:rgb(255, 121, 198)">"PATCH"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            url = </span><span class="token string" style="color:rgb(255, 121, 198)">"/users/{user-id-3}"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            headers = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-Type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            body = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                jobTitle = </span><span class="token string" style="color:rgb(255, 121, 198)">"HR Specialist"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                department = </span><span class="token string" style="color:rgb(255, 121, 198)">"Human Resources"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">ConvertTo-Json</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Depth 10</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/batch"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Sending the batch request</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Post </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$batchPayload</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the response</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://mynster-it.dk/2025/02/25/BatchRequest#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Batch requests in Microsoft Graph are a powerful way to optimize your application by reducing the number of network calls. By combining multiple requests into a single batch request, you can improve performance and simplify your code.</p>
<p>Reference/Documentation links</p>
<ul>
<li class="">Batch Requests: <a href="https://learn.microsoft.com/en-us/graph/json-batching" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/json-batching</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>speaker</category>
        </item>
        <item>
            <title><![CDATA[Advanced Filtering in MS GRAPH]]></title>
            <link>https://mynster-it.dk/2025/02/18/AdvancedFiltering</link>
            <guid>https://mynster-it.dk/2025/02/18/AdvancedFiltering</guid>
            <pubDate>Mon, 17 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating how to use advanced filters in MS Graph]]></description>
            <content:encoded><![CDATA[<p>Demonstrating how to use advanced filters in MS Graph</p>
<ul>
<li class="">Token for msgraph</li>
<li class="">Permissions on the endpoint you are using</li>
<li class="">If you have not already seen the post and have trouble with filtering look at my previous post <a class="" href="https://mynster-it.dk/2025/02/09/Filtering">https://mynster-it.dk/2025/02/09/Filtering</a></li>
</ul>
<p>For all the below examples the variable $baseUrl will always be "<a href="https://graph.microsoft.com/v1.0" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0</a>"</p>
<p>Further than that for all advanced queries you will need to include the following in your headers
ConsistencyLevel = eventual
And also end your query with $count=true except for when using search</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nice-to-know">Nice to know<a href="https://mynster-it.dk/2025/02/18/AdvancedFiltering#nice-to-know" class="hash-link" aria-label="Direct link to Nice to know" title="Direct link to Nice to know" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-consistencylevel--eventual">What is ConsistencyLevel = eventual<a href="https://mynster-it.dk/2025/02/18/AdvancedFiltering#what-is-consistencylevel--eventual" class="hash-link" aria-label="Direct link to What is ConsistencyLevel = eventual" title="Direct link to What is ConsistencyLevel = eventual" translate="no">​</a></h4>
<p>Right to give a very simpel explanation of the combination of the ConsistencyLevel = eventual and the $count in your queries is that Microsoft host loads of data across multiple countrys, regions, continents for that matter now all of the servers spread out arround the world will need to have the data between them replicated which will include some latency from one location to the next.</p>
<p>So lets say you are a global company you have locations both in Europe, America, Asia and so on. If somebody changes some data in Europe at 07:00:00 and you request data from the same source that the person just changed something lets say you request it at 07:00:03 then you might not get the latest version of the data if you are not using ConsistencyLevel = eventual as the ConsistencyLevel header makes sure that the data is accurate and up to date.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-can-i-filter-on">What can i filter on?<a href="https://mynster-it.dk/2025/02/18/AdvancedFiltering#what-can-i-filter-on" class="hash-link" aria-label="Direct link to What can i filter on?" title="Direct link to What can i filter on?" translate="no">​</a></h3>
<p>To find out what you can filter on you can go to the root section of the given object you would like to look at for an easy example lets look at the /Users endpoint.</p>
<p>All the properties we have available is listed in the root section so for Users see the below link:
<a href="https://learn.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0#properties" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0#properties</a></p>
<p>As shown in the table we have quite a lot of properties that we are able to filter on.
And each property has its own supported filtering option so if we try and look on a simple property like "country" in most cases you would imagine since it is a simple string that we would be able to use $orderby on that property but if we try it we get the following response:
<code>        "message": "An unsupported property was specified.",</code></p>
<p>And if we look in the properties section under country we can see that it only supports the following:
"Returned only on $select. Supports $filter (eq, ne, not, ge, le, in, startsWith, and eq on null values)."</p>
<p>So what we can get out of that small piece of information is that this property can be filtered but it can only be filtered with the operations (eq, ne, not, ge, le, in, startsWith, and eq on null values) <code>For more information about filtering please see my last blog post linked in the prerequisites section</code></p>
<p>Right so now that we know which properties we can get but also what kind of operator we can use on each property we are ready to make an example of an advanced filter query.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-code-with-advanced-filter">Example code with advanced filter<a href="https://mynster-it.dk/2025/02/18/AdvancedFiltering#example-code-with-advanced-filter" class="hash-link" aria-label="Direct link to Example code with advanced filter" title="Direct link to Example code with advanced filter" translate="no">​</a></h3>
<p>Right for our advanced filter lets setup some criteria first in order to know what we actually want to do.</p>
<ul>
<li class="">Lets say we want all users that has the value "Denmark" in the property country.</li>
<li class="">We are only looking for active users</li>
<li class="">Their job title has to start with TECH</li>
<li class="">And we are only looking at users that comes from our onprem environment</li>
<li class="">And we only need the properties: id, displayname, userprincipalname, and the groups they are a member of</li>
</ul>
<p>Right just to split it up a bit we will take the query bit by bit.</p>
<ol>
<li class="">$filter=country eq 'Denmark'</li>
<li class="">$filter=accountEnabled eq true</li>
<li class="">$filter=startswith(jobTitle, 'TECH')</li>
<li class="">$filter=onPremisesSyncEnabled eq true</li>
<li class="">$select=id,displayname,userprincipalname</li>
<li class="">$expand=memberOf</li>
</ol>
<p>Now that we have our filtration laid out we will need to put them together so we can get our final list of users we actually want to work with</p>
<p>So our complete URL would look something like this:
<code>https://graph.microsoft.com/v1.0/users?$filter=country eq 'Denmark' and accountEnabled eq true and startswith(jobTitle, 'TECH') and onPremisesSyncEnabled eq true&amp;$select=id,displayName,userPrincipalName&amp;$expand=memberOf&amp;$count=true</code></p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"ConsistencyLevel"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"eventual"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># This header is needed when using advanced filters in Microsoft Graph</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=country eq 'Denmark' and accountEnabled eq true and startswith(jobTitle, 'TECH') and onPremisesSyncEnabled eq true&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$select</span><span class="token string" style="color:rgb(255, 121, 198)">=id,displayName,userPrincipalName&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$expand</span><span class="token string" style="color:rgb(255, 121, 198)">=memberOf&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token string" style="color:rgb(255, 121, 198)">=true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$request</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And your result would look something like this:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"@odata.context"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/$metadata#users(id,displayName,userPrincipalName,memberOf())"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"132"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user number 1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"userPrincipalName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"usernumber1@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"memberOf"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"@odata.type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#microsoft.graph.group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4321"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"deletedDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"classification"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"createdDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"creationOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"description"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Group that contains all"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"expirationDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"groupTypes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"isAssignableToRole"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mail"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mailEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mailNickname"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"membershipRule"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"membershipRuleProcessingState"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesDomainName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"example.net"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesLastSyncDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2025-02-14T05:16:13Z"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesNetBiosName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EXAMPLE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSamAccountName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSecurityIdentifier"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSyncEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"preferredDataLocation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"preferredLanguage"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"proxyAddresses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"smtp:1@example.onmicrosoft.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"smtp:2@example.mail.onmicrosoft.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"SMTP:3@example.com"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"renewedDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"resourceBehaviorOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"resourceProvisioningOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"securityEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"securityIdentifier"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4321"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"theme"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"uniqueName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"visibility"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesProvisioningErrors"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"serviceProvisioningErrors"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"@odata.type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"#microsoft.graph.group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">""</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"deletedDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"classification"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"createdDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2019-12-12T11:18:53Z"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"creationOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"description"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Access-For-Something"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"expirationDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"groupTypes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"isAssignableToRole"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mail"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mailEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"mailNickname"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"membershipRule"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"membershipRuleProcessingState"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesDomainName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesLastSyncDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesNetBiosName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSamAccountName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSecurityIdentifier"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesSyncEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"preferredDataLocation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"preferredLanguage"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"proxyAddresses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"renewedDateTime"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"2019-12-12T11:18:53Z"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"resourceBehaviorOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"resourceProvisioningOptions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"securityEnabled"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"securityIdentifier"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1234"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"theme"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"uniqueName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"visibility"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"onPremisesProvisioningErrors"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"serviceProvisioningErrors"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>Right now that we have tried that lets try and filter on a collection instead.
Lets try with the same thing except for this one we will not be using $expand=memberOf since we cannot use the expand together with a any operation.
So our criteria will look like this:</p>
<ul>
<li class="">All users that has the value "Denmark" in the property country.</li>
<li class="">We are only looking for active users</li>
<li class="">Their job title has to start with TECH</li>
<li class="">And we are only looking at users that comes from our onprem environment</li>
<li class="">And the user needs to have a license let's say it needs to be <code>Microsoft 365 E3</code> (in order to filter on a specific license we need to do it on the SKU ID you can look at the below link for reference to the SKUID so in our instance the SKU ID would be: <code>05e9a617-0261-4cee-bb44-138d3ef5d965</code>)
<a href="https://learn.microsoft.com/en-us/entra/identity/users/licensing-service-plan-reference" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/entra/identity/users/licensing-service-plan-reference</a></li>
<li class="">And we only need the properties: id, displayname, userprincipalname, assignedLicenses</li>
</ul>
<p>Right just to split it up a bit we will take the query bit by bit.</p>
<ol>
<li class="">$filter=country eq 'Denmark'</li>
<li class="">$filter=accountEnabled eq true</li>
<li class="">$filter=startswith(jobTitle, 'TECH')</li>
<li class="">$filter=onPremisesSyncEnabled eq true</li>
<li class="">$filter=assignedLicenses/any(u:u/skuid eq 05e9a617-0261-4cee-bb44-138d3ef5d965)</li>
<li class="">$select=id,displayName,userPrincipalName,assignedLicenses</li>
</ol>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Setting up the authorization headers</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Authorization"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Bearer </span><span class="token string function" style="color:rgb(80, 250, 123)">$</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string function variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string function" style="color:rgb(80, 250, 123)">access_token</span><span class="token string function punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"Content-type"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"application/json"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token string" style="color:rgb(255, 121, 198)">"ConsistencyLevel"</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"eventual"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># This header is needed when using advanced filters in Microsoft Graph</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Graph API BASE URI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$graphApiUri</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=country eq 'Denmark' and accountEnabled eq true and startswith(jobTitle, 'TECH') and onPremisesSyncEnabled eq true and assignedLicenses/any(u:u/skuid eq 05e9a617-0261-4cee-bb44-138d3ef5d965)&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$select</span><span class="token string" style="color:rgb(255, 121, 198)">=id,displayName,userPrincipalName,assignedLicenses&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token string" style="color:rgb(255, 121, 198)">=true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$request</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And your result would look something like this:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"@odata.context"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/v1.0/$metadata#users(id,displayName,userPrincipalName)"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"@odata.count"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"value"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3a2f1b4c-8d5e-4f6b-9e2d-1a2b3c4d5e6f"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User One"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"userPrincipalName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user.one@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"assignedLicenses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3dd6cf57-d688-4eed-ba52-9e40b5468c3e"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"639dec6b-bb19-468b-871c-c5c441c4b0cb"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"05e9a617-0261-4cee-bb44-138d3ef5d965"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"f30db892-07e9-47e9-837c-80727f46fd3d"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"4b3c2d5e-7f8a-4b6c-9d1e-2a3b4c5d6e7f"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User Two"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"userPrincipalName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user.two@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"assignedLicenses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3dd6cf57-d688-4eed-ba52-9e40b5468c3e"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a403ebcc-fae0-4ca2-8c8c-7a907fd6c235"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"e43b5b99-8dfb-405f-9987-dc307f34bcbd"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"0feaeb32-d00e-4d66-bd5a-43b5b83db82c"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"05e9a617-0261-4cee-bb44-138d3ef5d965"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"f30db892-07e9-47e9-837c-80727f46fd3d"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"5c4d3e6f-9a8b-4c7d-1e2f-3a4b5c6d7e8f"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User Three"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"userPrincipalName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user.three@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"assignedLicenses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3dd6cf57-d688-4eed-ba52-9e40b5468c3e"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a403ebcc-fae0-4ca2-8c8c-7a907fd6c235"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"f30db892-07e9-47e9-837c-80727f46fd3d"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"0feaeb32-d00e-4d66-bd5a-43b5b83db82c"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"05e9a617-0261-4cee-bb44-138d3ef5d965"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"6d5e4f7g-0h1i-2j3k-4l5m-6n7o8p9q0r1s"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"displayName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User Four"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"userPrincipalName"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"user.four@example.com"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"assignedLicenses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"3dd6cf57-d688-4eed-ba52-9e40b5468c3e"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"disabledPlans"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                        </span><span class="token string" style="color:rgb(255, 121, 198)">"0feaeb32-d00e-4d66-bd5a-43b5b83db82c"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                    </span><span class="token property">"skuId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"05e9a617-0261-4cee-bb44-138d3ef5d965"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<p>As you can see in this query it does not matter how many licenses a given user has with the <code>any</code> property it will query over each one and return true if just one of the values is true.
If you needed the ones where they only had one licenses you could use the <code>all</code> instead of <code>any</code> as that evaluates on all properties and only returns true if all of them is true</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="referencedocumentation-links">Reference/Documentation links<a href="https://mynster-it.dk/2025/02/18/AdvancedFiltering#referencedocumentation-links" class="hash-link" aria-label="Direct link to Reference/Documentation links" title="Direct link to Reference/Documentation links" translate="no">​</a></h2>
<ul>
<li class="">Filtering: <a href="https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http</a></li>
<li class="">Advanced Filtering: <a href="https://learn.microsoft.com/en-us/graph/aad-advanced-queries?tabs=http" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/aad-advanced-queries?tabs=http</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>speaker</category>
        </item>
        <item>
            <title><![CDATA[Filtering / Advanced Filtering in MS GRAPH]]></title>
            <link>https://mynster-it.dk/2025/02/09/Filtering</link>
            <guid>https://mynster-it.dk/2025/02/09/Filtering</guid>
            <pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating how to use $filter and advanced filters]]></description>
            <content:encoded><![CDATA[<p>Demonstrating how to use $filter and advanced filters</p>
<ul>
<li class="">Token for msgraph</li>
<li class="">Permissions on the endpoint you are using</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="understanding-the-options-for-filtering">Understanding the options for filtering<a href="https://mynster-it.dk/2025/02/09/Filtering#understanding-the-options-for-filtering" class="hash-link" aria-label="Direct link to Understanding the options for filtering" title="Direct link to Understanding the options for filtering" translate="no">​</a></h2>
<ul>
<li class="">Reference: <br>
<a href="https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http#operators-and-functions-supported-in-filter-expressions" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http#operators-and-functions-supported-in-filter-expressions</a></li>
</ul>
<table aria-label="Table 1" class="table-wrapper">
  <thead>
    <tr>
      <th>Operator type</th>
      <th>Operator</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Equality operators</td>
      <td>
        <ul>
          <li class="">Equals (eq)</li>
          <li class="">Not equals (ne)</li>
          <li class="">Logical negation (not)</li>
          <li class="">In (in)</li>
          <li class="">Has (has)</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>Relational operators</td>
      <td>
        <ul>
          <li class="">Less than (lt)</li>
          <li class="">Greater than (gt)</li>
          <li class="">Less than or equal to (le)</li>
          <li class="">Greater than or equal to (ge)</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>Lambda operators</td>
      <td>
        <ul>
          <li class="">Any (any)</li>
          <li class="">All (all)</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>Conditional operators</td>
      <td>
        <ul>
          <li class="">And (and)</li>
          <li class="">Or (or)</li>
        </ul>
      </td>
    </tr>
    <tr>
      <td>Functions</td>
      <td>
        <ul>
          <li class="">Starts with (startswith)</li>
          <li class="">Ends with (endswith)</li>
          <li class="">Contains (contains)</li>
        </ul>
      </td>
    </tr>
  </tbody></table>
<p>Right as shown in the table we have quite a few operators available for us and just to give an example of each endpoint that could be hit you can use the below to have a look with an explanation for each one:</p>
<p>For all the below examples the variable $baseUrl will always be "<a href="https://graph.microsoft.com/v1.0" target="_blank" rel="noopener noreferrer" class="">https://graph.microsoft.com/v1.0</a>"</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="equality-operators">Equality operators<a href="https://mynster-it.dk/2025/02/09/Filtering#equality-operators" class="hash-link" aria-label="Direct link to Equality operators" title="Direct link to Equality operators" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="equals-eq">Equals (eq)<a href="https://mynster-it.dk/2025/02/09/Filtering#equals-eq" class="hash-link" aria-label="Direct link to Equals (eq)" title="Direct link to Equals (eq)" translate="no">​</a></h4>
<p>The Equals operator or "eq" will always evaluate to a boolean value so True/False in the below example we are hitting the /users endpoint and have set our $filter to look at the property accountEnabled and asks it to only return the users where the accountEnabled property is equals to true.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=accountEnabled eq true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>Now just because the equals operator will always evaluate to a boolean value does not mean that we can not use text for our filter the result of your query just needs to evaluate to a boolean value of True/False so in the below example:
We are looking at the same endpoint /Users but this time we are looking at the property "country" and evaluating to the value "Denmark" and that will return all users where that criteria is equals to True</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=country eq </span><span class="token string" style="color:rgb(255, 121, 198)">'Denmark'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And just to provide an example of how it would look in normal powershell if you were working with something like services.
In the below example we are getting all services and then we are filtering the result by saying that we only want the services where the property "Name" is equal to "gpsvc"</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">where-object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-equals-ne">Not equals (ne)<a href="https://mynster-it.dk/2025/02/09/Filtering#not-equals-ne" class="hash-link" aria-label="Direct link to Not equals (ne)" title="Direct link to Not equals (ne)" translate="no">​</a></h4>
<p>The NOT Equals operator or "ne" will always evaluate to a boolean value so True/False in the below example we are hitting the /users endpoint and have set our $filter to look at the property accountEnabled and asks it to only return the users where the accountEnabled property is NOT equals to true.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=accountEnabled ne true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>Now just because the not equals operator will always evaluate to a boolean value does not mean that we can not use text for our filter the result of your query just needs to evaluate to a boolean value of True/False so in the below example:
We are looking at the same endpoint /Users but this time we are looking at the property "country" and evaluating to the values that is not "Denmark" and that will return all users where that criteria is equals to True</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=country ne </span><span class="token string" style="color:rgb(255, 121, 198)">'Denmark'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And just to provide an example of how it would look in normal powershell if you were working with something like services.
In the below example we are getting all services and then we are filtering the result by saying that we only want the services where the property "Name" is not equal to "gpsvc"</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">where-object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-ne</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="logical-negation-not">Logical negation (not)<a href="https://mynster-it.dk/2025/02/09/Filtering#logical-negation-not" class="hash-link" aria-label="Direct link to Logical negation (not)" title="Direct link to Logical negation (not)" translate="no">​</a></h4>
<p>Now for logical negation (not) in most cases you would use this with a combination of the other filters like startswith(), endswith() or even $count.</p>
<p>To provide an example of a use case for the NOT operator we could take a look at the below sample:
For this we are looking at the "users" endpoint and we are looking at the property "assignedLicenses" we are also using the any operator and the reason for this is that the property "assignedLicenses" is a object that can contain multiple entries the any operator basicly runs a foreach loop on the property.</p>
<p>So what we are actualy doing is we are requesting a list of all users, we are going through their licenses with a foreach and we are only returning the users that do not have a license with the skuID that is equal to "05e9a617-0261-4cee-bb44-138d3ef5d965" aka "SPE_E3" license</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Your headers for this query will need to contain the header below and also contain the count = true in your query</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ConsistencyLevel = eventual</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># More information about this header and count in future blog post on advanced filtering</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=NOT assignedLicenses/any</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">x:x/skuId eq 05e9a617-0261-4cee-bb44-138d3ef5d965</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To provide an example that is more like powershell we can take a look at the below sample using services:
First we are requesting the data. (/Users endpoint)
Then we are building our new ArrayList. (This is something we have to do in powershell this is handled automatically from Graph)
Then we are going over each service in services. (The any operator)
And if the Name of the Service is not equal to "gpsvc" then we are adding it to our ArrayList (The combination of the NOT and the property assinedLicenses)</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$notServices</span><span class="token plain"> = </span><span class="token namespace">[System.Collections.ArrayList]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-ne</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$notServices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<ul>
<li class="">Now as a side note for this particular one we could also just not included the "NOT" operator and just changed our "eq" to "ne" but on some endpoints the "ne" is not supported which is where the "NOT" operator could come in handy</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="in-in">In (in)<a href="https://mynster-it.dk/2025/02/09/Filtering#in-in" class="hash-link" aria-label="Direct link to In (in)" title="Direct link to In (in)" translate="no">​</a></h4>
<p>For the "in" Equality operator it checks for pottential values that are in a property to show an example of this we could do something like shown below:
For this query we are filtering on the property "country" and we are only looking for the users that are either in Denmark, India, Germany or Sweden This will return a list of the users where their country is one of the supplied values</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">users?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=country in </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'Denmark'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'India'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Germany'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Sweden'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To give an example of how the above query could look in a method you are properly more used too with get-service.
We are first defining the service names we want to look for, then we get all the services before we finaly filter our services to only show the ones we want.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Define the names you want to filter</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serviceNames</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">'AppVClient'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'gpsvc'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'edgeupdate'</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services based on their names</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$serviceNames</span><span class="token plain"> </span><span class="token operator">-contains</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="has-has">Has (has)<a href="https://mynster-it.dk/2025/02/09/Filtering#has-has" class="hash-link" aria-label="Direct link to Has (has)" title="Direct link to Has (has)" translate="no">​</a></h4>
<p>To be honest with you i have not been able to find an actual use case for Has further than that i have not been able to find any example except for the 1 example that Microsoft has in their own documentation and also i have not been able to find any documentationon exactly what the has operator actually does so i will not add anything for this part as of now at least.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="relational-operators">Relational operators<a href="https://mynster-it.dk/2025/02/09/Filtering#relational-operators" class="hash-link" aria-label="Direct link to Relational operators" title="Direct link to Relational operators" translate="no">​</a></h3>
<p>These relational operators will in most cases only be needed/used when you either need to evaluate a date or if you need to sort on a count property other than that i am not sure i personally see a usecase.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="less-than-lt">Less than (lt)<a href="https://mynster-it.dk/2025/02/09/Filtering#less-than-lt" class="hash-link" aria-label="Direct link to Less than (lt)" title="Direct link to Less than (lt)" translate="no">​</a></h4>
<p>Please note that using the Relational operators will in almost all cases cause your query to become advanced filters where you in most cases will need to add the header
ConsistencyLevel:eventual and also include the $count=true property in your query format has to be 'yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)?' An easy way for you to do this would be something like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>And some example code:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime lt 2025-02-02T08:14:23Z&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the anove time filter could also look like this:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime lt $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And to provide something similar in powershell that does not look at an api</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get the current date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a date and time to compare against (e.g., processes started before 7 days ago)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter processes that were started before the comparison date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StartTime </span><span class="token operator">-lt</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> StartTime</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="greater-than-gt">Greater than (gt)<a href="https://mynster-it.dk/2025/02/09/Filtering#greater-than-gt" class="hash-link" aria-label="Direct link to Greater than (gt)" title="Direct link to Greater than (gt)" translate="no">​</a></h4>
<p>Please note that using the Relational operators will in almost all cases cause your query to become advanced filters where you in most cases will need to add the header
ConsistencyLevel:eventual and also include the $count=true property in your query format has to be 'yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)?' An easy way for you to do this would be something like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>And some example code:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime gt 2025-02-02T08:14:23Z&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the anove time filter could also look like this:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime gt $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And to provide something similar in powershell that does not look at an api</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get the current date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a date and time to compare against (e.g., processes started before 7 days ago)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter processes that were started before the comparison date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StartTime </span><span class="token operator">-gt</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> StartTime</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="less-than-or-equal-to-le">Less than or equal to (le)<a href="https://mynster-it.dk/2025/02/09/Filtering#less-than-or-equal-to-le" class="hash-link" aria-label="Direct link to Less than or equal to (le)" title="Direct link to Less than or equal to (le)" translate="no">​</a></h4>
<p>Please note that using the Relational operators will in almost all cases cause your query to become advanced filters where you in most cases will need to add the header
ConsistencyLevel:eventual and also include the $count=true property in your query format has to be 'yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)?' An easy way for you to do this would be something like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>And some example code:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime le 2025-02-02T08:14:23Z&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the anove time filter could also look like this:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime le $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And to provide something similar in powershell that does not look at an api</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get the current date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a date and time to compare against (e.g., processes started before 7 days ago)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter processes that were started before the comparison date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StartTime </span><span class="token operator">-le</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> StartTime</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="greater-than-or-equal-to-ge">Greater than or equal to (ge)<a href="https://mynster-it.dk/2025/02/09/Filtering#greater-than-or-equal-to-ge" class="hash-link" aria-label="Direct link to Greater than or equal to (ge)" title="Direct link to Greater than or equal to (ge)" translate="no">​</a></h4>
<p>Please note that using the Relational operators will in almost all cases cause your query to become advanced filters where you in most cases will need to add the header
ConsistencyLevel:eventual and also include the $count=true property in your query format has to be 'yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)?' An easy way for you to do this would be something like this:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>And some example code:</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime ge 2025-02-02T08:14:23Z&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># the anove time filter could also look like this:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token operator">/</span><span class="token plain">groups/?`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token plain">=createdDateTime ge $</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">ToString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"yyyy-MM-ddTHH:mm:ssZ"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">&amp;`</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token plain">=true</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>And to provide something similar in powershell that does not look at an api</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get the current date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Date</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Define a date and time to compare against (e.g., processes started before 7 days ago)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$currentDateTime</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">AddDays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">-</span><span class="token plain">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Get all processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Process</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter processes that were started before the comparison date and time</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$allProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">StartTime </span><span class="token operator">-ge</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$comparisonDateTime</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered processes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredProcesses</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> StartTime</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lambda-operators">Lambda operators<a href="https://mynster-it.dk/2025/02/09/Filtering#lambda-operators" class="hash-link" aria-label="Direct link to Lambda operators" title="Direct link to Lambda operators" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="any-any">Any (any)<a href="https://mynster-it.dk/2025/02/09/Filtering#any-any" class="hash-link" aria-label="Direct link to Any (any)" title="Direct link to Any (any)" translate="no">​</a></h4>
<p>The Any operator basicly makes a foreach on the give property that you are searching in this is usefull for when you need to look for users where a property could pottentially contain multiple values like f.eks. the proxyaddress.
In the below query we are looking for any users whose proxyAddress contains an email of "<a href="mailto:admin@contoso.com" target="_blank" rel="noopener noreferrer" class="">admin@contoso.com</a>"
So lets say we have a user that has the following 3 proxyaddresses
<a href="mailto:admin@contoso.com" target="_blank" rel="noopener noreferrer" class="">admin@contoso.com</a>
<a href="mailto:morten@contoso.com" target="_blank" rel="noopener noreferrer" class="">morten@contoso.com</a>
<a href="mailto:mynster@contoso.com" target="_blank" rel="noopener noreferrer" class="">mynster@contoso.com</a></p>
<p>The user will be returned</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=proxyAddresses/any(x:x eq 'admin@contoso.com')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>To provide an example that is more like powershell we can take a look at the below sample using services:
First we are requesting the data. (/Users endpoint)
Then we are building our new ArrayList. (This is something we have to do in powershell this is handled automatically from Graph)
Then we are going over each service in services. (The any operator)
And if the Name of the Service is equal to "gpsvc" then we are adding it to our ArrayList.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$trueServices</span><span class="token plain"> = </span><span class="token namespace">[System.Collections.ArrayList]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">foreach</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token plain"> in </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$trueServices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-all">All (all)<a href="https://mynster-it.dk/2025/02/09/Filtering#all-all" class="hash-link" aria-label="Direct link to All (all)" title="Direct link to All (all)" translate="no">​</a></h4>
<p>The All operator is very similar to the Any operator the diffrence here lies in where the Any operator returns true if just 1 value in a collection of lets say 3 contains the value we are looking for.
Whereas the All operator only returns true is if all values in our collection is true.
In the below query we are looking for any users whose proxyAddress is equal to an email of "<a href="mailto:admin@contoso.com" target="_blank" rel="noopener noreferrer" class="">admin@contoso.com</a>"</p>
<p>lets say a user has 2 values in proxyAddresses which is
<a href="mailto:admin@contoso.com" target="_blank" rel="noopener noreferrer" class="">admin@contoso.com</a>
<a href="mailto:morten@contoso.com" target="_blank" rel="noopener noreferrer" class="">morten@contoso.com</a>
Then our query will not return the user but if a user has 1 value in proxyAddresses which is
<a href="mailto:admin@contoso.com" target="_blank" rel="noopener noreferrer" class="">admin@contoso.com</a>
The user would be returned</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=proxyAddresses/all(x:x eq 'admin@contoso.com')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To provide an example that is more like powershell we can take a look at the below sample using services:
First we are requesting the data. (/Users endpoint)
Then we are building our new ArrayList. (This is something we have to do in powershell this is handled automatically from Graph)
Then we evaluating if our $services.Name is equal to "gpsvc" and adding it to our ArrayList.
For this case since $services is a collection of multiple values in Name we will not add anything to our ArrayList eventhough we have 1 service that is named "gpsvc" because the all operator evaluates on all values at once.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$trueServices</span><span class="token plain"> = </span><span class="token namespace">[System.Collections.ArrayList]</span><span class="token plain">@</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$trueServices</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$service</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conditional-operators">Conditional operators<a href="https://mynster-it.dk/2025/02/09/Filtering#conditional-operators" class="hash-link" aria-label="Direct link to Conditional operators" title="Direct link to Conditional operators" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="and-and">And (and)<a href="https://mynster-it.dk/2025/02/09/Filtering#and-and" class="hash-link" aria-label="Direct link to And (and)" title="Direct link to And (and)" translate="no">​</a></h4>
<p>The And operator lets you evaluate on 2 or more conditions that needs to return true so lets say you need to find all users that is in a given company and has a specific job title you can use the AND operator to say that the company needs to be contoso and their jobtitle needs to be specialist (This is not case sensitive)</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=companyName eq 'contoso a/s' and jobTitle eq 'specialist'&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token string" style="color:rgb(255, 121, 198)">=true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To provide an example that is more like powershell we can take a look at the below sample using services:
The service name should be "gpsvc" and the service status should be "Running"</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services based on the conditions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token plain"> </span><span class="token operator">-and</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Status </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="or-or">Or (or)<a href="https://mynster-it.dk/2025/02/09/Filtering#or-or" class="hash-link" aria-label="Direct link to Or (or)" title="Direct link to Or (or)" translate="no">​</a></h4>
<p>The or operator lets you evaluate on at least 1 of your properties needs to return true so lets say you need to find all users that is in a given company or has a specific job title you can use the OR operator to say that the company needs to be contoso OR their jobtitle needs to be specialist (This is not case sensitive)</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=companyName eq 'bestseller A/S' or jobTitle eq 'specialist'&amp;`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$count</span><span class="token string" style="color:rgb(255, 121, 198)">=true"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To provide an example that is more like powershell we can take a look at the below sample using services:
The service name should be "gpsvc" or the service status should be "Running"</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services based on the conditions</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"gpsvc"</span><span class="token plain"> </span><span class="token operator">-or</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Status </span><span class="token operator">-eq</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Running"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="functions">Functions<a href="https://mynster-it.dk/2025/02/09/Filtering#functions" class="hash-link" aria-label="Direct link to Functions" title="Direct link to Functions" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="starts-with-startswith">Starts with (startswith)<a href="https://mynster-it.dk/2025/02/09/Filtering#starts-with-startswith" class="hash-link" aria-label="Direct link to Starts with (startswith)" title="Direct link to Starts with (startswith)" translate="no">​</a></h4>
<p>The startswith function does as it states it filters on the property that you suply in the below case we use "displayName" and then parameter "morten" which will return all users where their displayname starts with morten.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=startswith(displayName,'morten')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To give a powershell example of the above filter below you will see a filter on the get-service command the services it will return those whose name starts with 'gp'.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services where the name starts with 'Win'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-like</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'gp*'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="ends-with-endswith">Ends with (endswith)<a href="https://mynster-it.dk/2025/02/09/Filtering#ends-with-endswith" class="hash-link" aria-label="Direct link to Ends with (endswith)" title="Direct link to Ends with (endswith)" translate="no">​</a></h4>
<p>The endswith function filters on the property that you supply. In the example below, we use "displayName" and the parameter "mynster", which will return all users where their display name ends with "mynster".</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=endswith(displayName,'mynster')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">#### Contains (contains)</span><br></div></code></pre></div></div>
<p>To give a powershell example of the above filter below you will see a filter on the get-service command the services it will return those whose name ends with 'gp'.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services where the name ends with 'svc'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-like</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'*svc'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="contains-contains">Contains (contains)<a href="https://mynster-it.dk/2025/02/09/Filtering#contains-contains" class="hash-link" aria-label="Direct link to Contains (contains)" title="Direct link to Contains (contains)" translate="no">​</a></h4>
<p>The <code>contains</code> function filters on the property that you supply. In the example below, we use "displayName" and the parameter "admin", which will return all users where their display name contains "admin".</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$baseUrl</span><span class="token string" style="color:rgb(255, 121, 198)">/users?`</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$filter</span><span class="token string" style="color:rgb(255, 121, 198)">=contains(displayName,'admin')"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Make the API call</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method Get </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$uri</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Headers </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$authHeaders</span><br></div></code></pre></div></div>
<p>To give a PowerShell example of the above filter, below you will see a filter on the Get-Service command. The services it will return include those whose name contains 'svc'.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Get all services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Get-Service</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Filter services where the name contains 'svc'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$services</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Where-Object</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Name </span><span class="token operator">-like</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'*svc*'</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display the filtered services</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$filteredServices</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">Select-Object</span><span class="token plain"> Name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Status</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="referencedocumentation-links">Reference/Documentation links<a href="https://mynster-it.dk/2025/02/09/Filtering#referencedocumentation-links" class="hash-link" aria-label="Direct link to Reference/Documentation links" title="Direct link to Reference/Documentation links" translate="no">​</a></h2>
<ul>
<li class="">Filtering: <a href="https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http</a></li>
<li class="">Advanced Filtering: <a href="https://learn.microsoft.com/en-us/graph/aad-advanced-queries?tabs=http" target="_blank" rel="noopener noreferrer" class="">https://learn.microsoft.com/en-us/graph/aad-advanced-queries?tabs=http</a></li>
</ul>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
            <category>speaker</category>
        </item>
        <item>
            <title><![CDATA[Device Code Authentication to Microsoft Graph API]]></title>
            <link>https://mynster-it.dk/2025/01/24/DeviceCodeAuthentication</link>
            <guid>https://mynster-it.dk/2025/01/24/DeviceCodeAuthentication</guid>
            <pubDate>Fri, 24 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Demonstrating Device Code Authentication to Microsoft Graph]]></description>
            <content:encoded><![CDATA[<p>Demonstrating Device Code Authentication to Microsoft Graph</p>
<p>In this post, I'll demonstrate how to authenticate to the Microsoft Graph API using Client ID and your own user.
The device code method is suitable for client-to-server communication where a interactive user is used to authenticate the application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="first-off-we-need-to-create-the-app-registration-in-azureentra">First off we need to create the app registration in Azure/Entra<a href="https://mynster-it.dk/2025/01/24/DeviceCodeAuthentication#first-off-we-need-to-create-the-app-registration-in-azureentra" class="hash-link" aria-label="Direct link to First off we need to create the app registration in Azure/Entra" title="Direct link to First off we need to create the app registration in Azure/Entra" translate="no">​</a></h2>
<p>Go to App Registrations page and click create "New registration"
![img-description](/assets/img/posts/2025-01-23 19_36_54-App registrations - Microsoft Azure.png)</p>
<p>Give it a new and click "Register"
![img-description](/assets/img/posts/2025-01-23 19_38_29-Register an application - Microsoft Azure.png)</p>
<p>On the front page of the new app also called "Overview" we need to get the "Directory (tenant) ID" and "Application (client) ID"
![img-description](/assets/img/posts/2025-01-23 19_43_12-Some Name - Microsoft Azure.png)</p>
<p>Go to the "Authentication" page and Change the "Allow public client flows" (under Advanced settings) and switch the No to a Yes
![img-description](/assets/img/posts/2025-01-23 21_47_36-Some Name - Microsoft Azure.png)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="now-lets-take-what-we-just-created-and-ask-for-a-token">Now lets take what we just created and ask for a token<a href="https://mynster-it.dk/2025/01/24/DeviceCodeAuthentication#now-lets-take-what-we-just-created-and-ask-for-a-token" class="hash-link" aria-label="Direct link to Now lets take what we just created and ask for a token" title="Direct link to Now lets take what we just created and ask for a token" translate="no">​</a></h3>
<p>First off we need to define or variables for authentication take the tenant id, client id we made above in our instance it would be</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Tenant ID, Client ID for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-tenant-id"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token string" style="color:rgb(255, 121, 198)">"Your-client-id"</span><br></div></code></pre></div></div>
<p>Next up we need to configure our body for authenticaton.
By looking at <a href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code#device-authorization-request" target="_blank" rel="noopener noreferrer" class="">Microsoft documentation</a>
We can see that we need to provide the following information in our body:</p>
<table aria-label="Table 1" class="table table-sm margin-top-none">
  <thead>
    <tr>
      <th>Parameter</th>
      <th>Condition</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>client_id</td>
      <td>Required</td>
      <td>Your client id</td>
    </tr>
    <tr>
      <td>scope</td>
      <td>Required</td>
      <td>You only need to specify anything if you are not going to hit the default endpoint</td>
    </tr>
  </tbody></table>
<p>Right now that we have an understanding of what the endpoint expects then we can form our body from that like shown here:
And for this one we will need to hit this endpoint "<a href="https://login.microsoftonline.com/$tenantId/oauth2/v2.0/devicecode" target="_blank" rel="noopener noreferrer" class="">https://login.microsoftonline.com/$tenantId/oauth2/v2.0/devicecode</a>"</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Default Token Body</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCodeBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    client_id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"user.read"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/devicecode"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCodeBody</span><br></div></code></pre></div></div>
<p>Now this is only part 1 for this authentication flow the above will return the following:</p>
<table>
  <thead>
    <tr>
      <th>Parameter</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>user_code</td>
      <td>DZGGXGVMS</td>
    </tr>
    <tr>
      <td>device_code</td>
      <td>DAQABIQEAAABVrSpeuWamRam2jAF1XRQEqRMWPvYmVZEDueczEXye3hct6Y9FNvOI1RMwpHdzgqUG7YFug2Cy2MeKDSTHwvN1XXNta6zeZ0PczF_y7lAgI4CuwoEs4FyylYmFmrgmAgySI0nOATyIbe-sZh_Kez7_2YUeqnZMGm60vrwlWN26Bma4dxZR58KGVMpno2Il2LogAA</td>
    </tr>
    <tr>
      <td>verification_uri</td>
      <td><a href="https://microsoft.com/devicelogin" target="_blank" rel="noopener noreferrer" class="">https://microsoft.com/devicelogin</a></td>
    </tr>
    <tr>
      <td>expires_in</td>
      <td>900</td>
    </tr>
    <tr>
      <td>interval</td>
      <td>5</td>
    </tr>
    <tr>
      <td>message</td>
      <td>To sign in, use a web browser to open the page <a href="https://microsoft.com/devicelogin" target="_blank" rel="noopener noreferrer" class="">https://microsoft.com/devicelogin</a> and enter the code DZGGXGVMS to authenticate.</td>
    </tr>
  </tbody></table>
<p>Now what needs to happen is you open the url "<a href="https://microsoft.com/devicelogin" target="_blank" rel="noopener noreferrer" class="">https://microsoft.com/devicelogin</a>" and enter the code in from the user_code property.</p>
<p>![img-description](/assets/img/posts/2025-01-23 21_57_56-Sign in to your account.png)</p>
<p>Great now we have authenticated to the endpoint but we still do not have a token that we can use in further api calls.
Now that we have authenticated we need to request a token from Azure/Entra by passing the device code we received from the previous call.</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCode</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">device_code</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceAuthCodeBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    client_id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    grant_type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    device_code   = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCode</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceAuthCodeBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>And you are done now you have a token you can use to make api request to microsoft graph if you need assitance as to how, you can see one of my other blog posts.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="complete-script-with-synopsis">Complete Script with Synopsis<a href="https://mynster-it.dk/2025/01/24/DeviceCodeAuthentication#complete-script-with-synopsis" class="hash-link" aria-label="Direct link to Complete Script with Synopsis" title="Direct link to Complete Script with Synopsis" translate="no">​</a></h4>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">&lt;#</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.SYNOPSIS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    Demonstrates how to authenticate using the device code flow with Microsoft Graph API.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.DESCRIPTION</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    This script shows how to authenticate a user interactively using the device code flow.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    It retrieves a device code, prompts the user to authenticate, and then requests an access token.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.NOTES</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    MS Docs on how to use Ms Graph API with device code flow:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-device-code</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    Remember to enable "Allow public client flows" under Authentication - Advanced settings on the app registration</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    otherwise you will get an error.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.PARAMETER tenantId</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    The tenant ID of the Azure AD tenant.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.PARAMETER clientId</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    The client ID of the registered application.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">.EXAMPLE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    # Set environment variables for tenantId and clientId</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    $env:tenantId = "your-tenant-id"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    $env:clientId = "your-client-id"</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">    # Follow the instructions to authenticate and obtain an access token.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">#&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Client Secret for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain">:tenantId</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$env</span><span class="token plain">:clientId1</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Interactive login for the MS Graph API</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/devicecode"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    client_id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"user.read"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Extract device code, user code and verification uri</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCode</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">device_code</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$userCode</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">user_code</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$verificationUrl</span><span class="token plain"> = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$response</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">verification_uri</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Open authentication url in default browser</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Start-Process</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$verificationUrl</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Display instructions to the user</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">Write-Host</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Please type in the following code: </span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$userCode</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Pause </span><span class="token string" style="color:rgb(255, 121, 198)">"Press Enter to continue..."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceAuthCodeBody</span><span class="token plain"> = @</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    client_id     = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$clientId</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    scope         = </span><span class="token string" style="color:rgb(255, 121, 198)">"https://graph.microsoft.com/.default"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    grant_type    = </span><span class="token string" style="color:rgb(255, 121, 198)">"urn:ietf:params:oauth:grant-type:device_code"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    device_code   = </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceCode</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Once the user has authenticated, request a token</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><span class="token plain"> = </span><span class="token function" style="color:rgb(80, 250, 123)">Invoke-RestMethod</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Uri </span><span class="token string" style="color:rgb(255, 121, 198)">"https://login.microsoftonline.com/</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$tenantId</span><span class="token string" style="color:rgb(255, 121, 198)">/oauth2/v2.0/token"</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">Method POST </span><span class="token operator">-</span><span class="token plain">Body </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$deviceAuthCodeBody</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$tokenResponse</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>powershell</category>
            <category>msgraph</category>
        </item>
    </channel>
</rss>