<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Praktiske Løsninger on Eriteach | Microsoft Cloud Tech</title><link>https://blog.eriteach.com/categories/praktiske-l%C3%B8sninger/</link><description>Recent content in Praktiske Løsninger on Eriteach | Microsoft Cloud Tech</description><generator>Hugo -- 0.155.1</generator><language>no</language><copyright>2024-2026 Robel Mehari. All rights reserved.</copyright><lastBuildDate>Thu, 23 Apr 2026 12:28:16 +0200</lastBuildDate><atom:link href="https://blog.eriteach.com/categories/praktiske-l%C3%B8sninger/index.xml" rel="self" type="application/rss+xml"/><item><title>Fjerning av Firefox i stor skala: Min tilnærming med Intune Proactive Remediation</title><link>https://blog.eriteach.com/posts/intune-proactive-remediation-remove-firefox/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.eriteach.com/posts/intune-proactive-remediation-remove-firefox/</guid><description>Slik rydder jeg opp i uautoriserte Firefox-installasjoner på tvers av organisasjonen ved hjelp av Intune og Defender KQL.</description><content:encoded><![CDATA[<p>Når Mozilla Firefox markeres som usanksjonert i vårt miljø, er mitt neste trekk å rydde opp i eksisterende installasjoner på alle administrerte enheter.</p>
<p>Før vi standardiserte nettleserne våre, stod brukerne fritt til å installere det de ville, noe som førte til at Firefox ble spredt over hundrevis av maskiner. Jeg kaster ikke bort tid på manuell opprydding; jeg har automatisert hele prosessen.</p>
<h2 id="kartlegging-i-stor-skala-med-kql">Kartlegging i stor skala med KQL</h2>
<p>Jeg starter med å få et klart bilde av omfanget. Jeg bruker <strong>KQL (Kusto Query Language)</strong> i Defender Advanced Hunting for å se nøyaktig hvilke versjoner som finnes og hvor mange enheter som er berørt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Min spørring for Firefox-kartlegging
</span></span><span class="line"><span class="cl">DeviceTvmSoftwareInventory
</span></span><span class="line"><span class="cl">| where SoftwareName contains &#34;Firefox&#34;
</span></span><span class="line"><span class="cl">| summarize DeviceCount = dcount(DeviceName), Versions = make_set(SoftwareVersion) by SoftwareName
</span></span><span class="line"><span class="cl">| order by DeviceCount desc
</span></span></code></pre></div><p>Denne spørringen gir meg umiddelbar oversikt over antall enheter og versjoner, noe jeg bruker for å målrette Intune-utbedringene mine effektivt.</p>
<h2 id="strategien-automatisere-oppryddingen">Strategien: Automatisere oppryddingen</h2>
<p>Jeg bruker Intune Proactive Remediation med et to-skripts system:</p>
<ul>
<li><strong>Deteksjon</strong>: Finner Firefox i registeret, Program Files og brukerprofiler.</li>
<li><strong>Utbedring (Remediation)</strong>: Fjerner alt—prosesser, filer, snarveier, tjenester og planlagte oppgaver.</li>
</ul>
<h3 id="deteksjonslogikk">Deteksjonslogikk</h3>
<p>Skriptet mitt skanner tre hovedområder hvor Firefox liker å gjemme seg:</p>
<ol>
<li><strong>Registeret</strong> - 64-bit/32-bit avinstalleringsnøkler og per-bruker installasjoner.</li>
<li><strong>Program Files</strong> - Standard installasjonsplasseringer.</li>
<li><strong>Brukerprofiler</strong> - AppData-mapper.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$findings</span> <span class="p">=</span> <span class="vm">@</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nv">$uninstallPaths</span> <span class="p">=</span> <span class="vm">@</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$path</span> <span class="k">in</span> <span class="nv">$uninstallPaths</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="nb">Test-Path</span> <span class="nv">$path</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$apps</span> <span class="p">=</span> <span class="nb">Get-ItemProperty</span> <span class="s2">&#34;</span><span class="nv">$path</span><span class="s2">\*&#34;</span> <span class="n">-ErrorAction</span> <span class="n">SilentlyContinue</span> <span class="p">|</span>
</span></span><span class="line"><span class="cl">            <span class="nb">Where-Object</span> <span class="p">{</span> <span class="nv">$_</span><span class="p">.</span><span class="py">DisplayName</span> <span class="o">-like</span> <span class="s2">&#34;*Firefox*&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">foreach</span> <span class="p">(</span><span class="nv">$app</span> <span class="k">in</span> <span class="nv">$apps</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nv">$findings</span> <span class="p">+=</span> <span class="s2">&#34;Registry: </span><span class="p">$(</span><span class="nv">$app</span><span class="p">.</span><span class="n">DisplayName</span><span class="p">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="nv">$findings</span><span class="p">.</span><span class="py">Count</span> <span class="o">-gt</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span> <span class="n">exit</span> <span class="mf">1</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="n">exit</span> <span class="mf">0</span> <span class="p">}</span>
</span></span></code></pre></div><p>Komplett skript: <a href="https://github.com/Thugney/eriteach-scripts/blob/main/intune/remediations/firefox-removal-detection.ps1">firefox-removal-detection.ps1</a></p>
<h2 id="selve-fjerningen-remediation">Selve fjerningen: Remediation</h2>
<p>Utbedringsskriptet mitt er designet for å være grundig. Det stopper alle aktive prosesser før det prøver å avinstallere, for å sikre at ingen filer er låst.</p>
<ol>
<li><strong>Stopp prosesser</strong> - Firefox, plugin-container og oppdateringsprogrammer.</li>
<li><strong>Avinstaller</strong> - Bruker avinstalleringsstrengen fra registeret (håndterer både helper.exe og msiexec).</li>
<li><strong>Opprydding</strong> - Sletter mapper i Program Files, ProgramData og AppData.</li>
<li><strong>Siste finpuss</strong> - Fjerner snarveier, tjenesten MozillaMaintenance og oppdateringsoppgaver.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="c"># Min liste over prosesser som skal stoppes</span>
</span></span><span class="line"><span class="cl"><span class="nv">$firefoxProcesses</span> <span class="p">=</span> <span class="vm">@</span><span class="p">(</span><span class="s2">&#34;firefox&#34;</span><span class="p">,</span> <span class="s2">&#34;firefox-esr&#34;</span><span class="p">,</span> <span class="s2">&#34;plugin-container&#34;</span><span class="p">,</span> <span class="s2">&#34;crashreporter&#34;</span><span class="p">,</span> <span class="s2">&#34;updater&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">foreach</span> <span class="p">(</span><span class="nv">$proc</span> <span class="k">in</span> <span class="nv">$firefoxProcesses</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">Get-Process</span> <span class="n">-Name</span> <span class="nv">$proc</span> <span class="n">-ErrorAction</span> <span class="n">SilentlyContinue</span> <span class="p">|</span> <span class="nb">Stop-Process</span> <span class="n">-Force</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Komplett skript: <a href="https://github.com/Thugney/eriteach-scripts/blob/main/intune/remediations/firefox-removal-remediation.ps1">firefox-removal-remediation.ps1</a></p>
<h2 id="resultat-og-verifisering">Resultat og verifisering</h2>
<p>Jeg overvåker fremdriften direkte i Intune-portalen under <strong>Devices</strong> &gt; <strong>Scripts and remediations</strong>.</p>
<p>Suksess betyr at enhetene får status &ldquo;fixed&rdquo;. Jeg sjekker også mine egne logger på <code>C:\ProgramData\Eriteach\Logs\</code> hvis jeg ser installasjoner som krever en manuell titt.</p>
<h2 id="erfaringer">Erfaringer</h2>
<ul>
<li><strong>Brukerprofiler</strong> - Skriptet rydder alle profiler på maskinen. Jeg varsler alltid brukerne om at bokmerker og lagrede passord vil forsvinne.</li>
<li><strong>Tvangslukking</strong> - Siden jeg tvinger prosessen til å avslutte, kjører jeg denne utbedringen i vedlikeholdsvinduer for å minimere forstyrrelser.</li>
</ul>
<h2 id="relaterte-lenker">Relaterte lenker</h2>
<ul>
<li><a href="/posts/intune-proactive-remediation-firefox-update/">Auto-oppdater Firefox med Intune</a> - Min arbeidsflyt når jeg skal beholde Firefox, men holde den oppdatert.</li>
<li><a href="https://learn.microsoft.com/en-us/mem/intune/fundamentals/remediations">Intune Remediations oversikt</a></li>
<li><a href="https://learn.microsoft.com/en-us/defender-endpoint/software-inventory">Microsoft Defender programvareoversikt</a></li>
</ul>
]]></content:encoded></item><item><title>Fjerning av uautoriserte apper: Min arbeidsflyt med Intune Proactive Remediation</title><link>https://blog.eriteach.com/posts/remove-unauthorized-apps-intune-proactive-remediation/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.eriteach.com/posts/remove-unauthorized-apps-intune-proactive-remediation/</guid><description>Slik bruker jeg Intune Proactive Remediation til å finne og fjerne uautoriserte apper som ble installert da brukerne hadde administratorrettigheter.</description><content:encoded><![CDATA[<p>I mitt miljø etterlot overgangen fra lokaladministrator til standardbruker seg et spor av &ldquo;shadow IT&rdquo;—Zoom, personlige verktøy og gammel programvare som ikke burde være der.</p>
<p>Jeg sjekker ikke hver enkelt enhet manuelt. I stedet har jeg bygget en arbeidsflyt som finner disse appene på tvers av hele flåten og fjerner dem automatisk.</p>
<h2 id="kartlegging-jakt-i-hele-flåten-med-kql">Kartlegging: Jakt i hele flåten med KQL</h2>
<p>Før jeg kan fjerne noe, må jeg vite nøyaktig hvor problemene ligger. Jeg bruker <strong>Microsoft Defender for Endpoint (MDE)</strong> for å finne disse appene på sekunder. I stedet for å bla i portalen, kjører jeg en KQL-spørring i Advanced Hunting for å identifisere høyrisiko-programvare:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Min spørring for kartlegging (Eksempel)
</span></span><span class="line"><span class="cl">DeviceTvmSoftwareInventory
</span></span><span class="line"><span class="cl">| where SoftwareName has_any (&#34;utorrent&#34;, &#34;anydesk&#34;, &#34;ccleaner&#34;)
</span></span><span class="line"><span class="cl">| project DeviceName, SoftwareName, SoftwareVersion
</span></span></code></pre></div><p>Dette gir meg &ldquo;hitlisten&rdquo; min. For en mer aggressiv tilnærming som også håndterer EOL- og EOS-programvare, bruker jeg arbeidsflyten for <a href="https://blog.eriteach.com/posts/zombie-apps-removal-intune-proactive-remediation/">Jakten på zombie-programvare</a>.</p>
<h2 id="automatisering-intune-proactive-remediation">Automatisering: Intune Proactive Remediation</h2>
<p>Når jeg har målene klare, bruker jeg Intune Proactive Remediation. Oppsettet mitt består av to skript:</p>
<ol>
<li><strong>Deteksjon</strong> - Sjekker om appen finnes (exit 1 = funnet, som trigger fjerning)</li>
<li><strong>Utbedring (Remediation)</strong> - Lydløs fjerning</li>
</ol>
<h3 id="min-konfigurasjon">Min konfigurasjon</h3>
<p>Jeg målretter apper via registeret, WMI eller programlisten. Vanligvis konfigurerer jeg deteksjonen ved å sette disse variablene:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$AppDisplayName</span> <span class="p">=</span> <span class="s2">&#34;Zoom&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$AppPublisher</span> <span class="p">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$AppProductCode</span> <span class="p">=</span> <span class="s2">&#34;{86B70A45-00A6-4CBD-97A8-464A1254D179}&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$UsePartialMatch</span> <span class="p">=</span> <span class="vm">$true</span>
</span></span></code></pre></div><p>Komplett skript: <a href="https://github.com/Thugney/eriteach-scripts/blob/main/proactive-remediation/Detect-UnwantedApp.ps1">Detect-UnwantedApp.ps1</a></p>
<h3 id="utbedringen-remediation">Utbedringen (Remediation)</h3>
<p>Når appen er oppdaget, henter utbedringsskriptet mitt avinstalleringsstrengen fra registeret eller bruker MSI-produktkoden for å fjerne appen lydløst.</p>
<p>Komplett skript: <a href="https://github.com/Thugney/eriteach-scripts/blob/main/proactive-remediation/Remove-UnwantedApp.ps1">Remove-UnwantedApp.ps1</a></p>
<h2 id="detaljer-om-utrulling">Detaljer om utrulling</h2>
<p>Slik har jeg satt det opp i min tenant:</p>
<ol>
<li><strong>Intune</strong> → <strong>Enheter</strong> → <strong>Utbedringer</strong></li>
<li><strong>Opprett skriptpakke</strong>: &ldquo;Fjern [AppNavn]&rdquo;</li>
<li><strong>Innstillinger</strong>:
<ul>
<li>Kjør skript i 64-bit PowerShell: <strong>Ja</strong></li>
<li>Kjør med påloggede legitimasjoner: <strong>Nei</strong> (kjører som SYSTEM)</li>
</ul>
</li>
<li><strong>Tidsplan</strong>: Daglig (jeg vil ha disse bort så fort som mulig)</li>
</ol>
<h2 id="erfaringer-og-avveininger">Erfaringer og avveininger</h2>
<ul>
<li><strong>Pilot først</strong> - Jeg kjører alltid deteksjon på en pilotgruppe før jeg aktiverer utbedring.</li>
<li><strong>Produktkoder endres</strong> - Jeg har lært at ulike versjoner ofte har ulike koder; KQL hjelper meg å finne alle variantene først.</li>
<li><strong>Risiko med delvis treff</strong> - Jeg bruker <code>$UsePartialMatch = $true</code> med forsiktighet for å unngå å fjerne tilleggsprogrammer (plugins) som jeg faktisk vil beholde.</li>
</ul>
<h2 id="relaterte-lenker">Relaterte lenker</h2>
<ul>
<li><a href="https://learn.microsoft.com/en-us/mem/intune/fundamentals/remediations">Microsoft: Proactive Remediations</a></li>
<li><a href="https://learn.microsoft.com/en-us/mem/intune/apps/intune-management-extension">Intune skriptkrav</a></li>
</ul>
]]></content:encoded></item></channel></rss>