<?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>I Have No Signal</title>
    <link>https://blog.nosignal.ie/</link>
    <description>Recent content on I Have No Signal</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 20 Sep 2026 23:00:00 +0100</lastBuildDate>
    <atom:link href="https://blog.nosignal.ie/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Day Windows Fought Me Over a Checkbox</title>
      <link>https://blog.nosignal.ie/posts/the-day-windows-fought-me-over-a-checkbox/</link>
      <pubDate>Sun, 20 Sep 2026 23:00:00 +0100</pubDate>
      <guid>https://blog.nosignal.ie/posts/the-day-windows-fought-me-over-a-checkbox/</guid>
      <description>&lt;p&gt;Somewhere in the pile of &amp;ldquo;things that should take five minutes&amp;rdquo; sits installing the SNMP client on a Windows laptop. It is, after all, a single checkbox in Optional Features. Or it was, until it wasn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;This is the story of trying to get one Windows laptop talking SNMP so it could join the rest of the homelab in LibreNMS and how a five-minute task turned into a multi-hour forensic investigation spanning the Windows registry, the Component-Based Servicing engine and eventually a fact about remote sessions that nobody warns you about.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Somewhere in the pile of &ldquo;things that should take five minutes&rdquo; sits installing the SNMP client on a Windows laptop. It is, after all, a single checkbox in Optional Features. Or it was, until it wasn&rsquo;t.</p>
<p>This is the story of trying to get one Windows laptop talking SNMP so it could join the rest of the homelab in LibreNMS and how a five-minute task turned into a multi-hour forensic investigation spanning the Windows registry, the Component-Based Servicing engine and eventually a fact about remote sessions that nobody warns you about.</p>
<h2 id="the-setup">The setup</h2>
<p>The plan was simple. Every other device on the network already reports into LibreNMS: pfSense, the Proxmox host, the managed switches, a small fleet of LXC guests, even the MacBook. This laptop was next on the list. Install the <code>SNMP.Client</code> Windows Capability, set a community string, done.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nb">Add-WindowsCapability</span> <span class="n">-Online</span> <span class="n">-Name</span> <span class="s1">&#39;SNMP.Client~~~~0.0.1.0&#39;</span>
</span></span></code></pre></div><pre tabindex="0"><code>Add-WindowsCapability : Access is denied.
</code></pre><p>No further explanation. No hint. Just the Windows equivalent of a shrug.</p>
<h2 id="act-one-assume-its-permissions">Act one: assume it&rsquo;s permissions</h2>
<p>Access denied usually means exactly what it says, so the obvious first move was checking the registry ACLs around the Component-Based Servicing hives. This is where things got interesting. <code>COMPONENTS</code>, one of the hives CBS uses during servicing, was missing <code>NT SERVICE\TrustedInstaller</code> permissions entirely. Not reduced, not restricted. Just gone.</p>
<p>That is a genuinely alarming thing to find on a system you use every day. The working theory, based on timeline and known behaviour, points at a &ldquo;PC cleaner&rdquo; tool that had been running on this machine years ago and has since been removed. These tools have a bad habit of &ldquo;optimising&rdquo; registry permissions in ways that make sense to nobody, least of all Windows itself.</p>
<p>Fixing one hive felt like progress. Then the same pattern turned up on <code>SOFTWARE</code>. Then <code>SYSTEM</code>. Then <code>HKEY_USERS\.DEFAULT</code>. Then, for good measure, the user&rsquo;s own <code>NTUSER.DAT</code>. Six hives in total, all quietly missing the one permission Windows Update depends on to do its job.</p>
<p>Each fix was verified properly this time, not just trusted on faith. Real ACL checks, before and after, on real subkeys. Genuinely fixed, every time.</p>
<p>The install still failed with the exact same error.</p>
<h2 id="act-two-rule-everything-else-out">Act two: rule everything else out</h2>
<p>At this point the obvious question was whether this was a registry problem at all, or something else entirely wearing a registry-shaped costume. A run through the usual suspects:</p>
<ul>
<li><strong>General CBS corruption?</strong> No. <code>Enable-WindowsOptionalFeature -FeatureName TelnetClient</code> worked instantly. Optional Features and Capabilities are different subsystems under the hood and only one of them was broken.</li>
<li><strong>Network or source access?</strong> No. Forcing the install to use a local source only (<code>-LimitAccess</code>) produced a <em>different</em> error entirely, &ldquo;source files not found&rdquo;, proving the normal attempt was successfully reaching and downloading from Windows Update. The failure was happening after the download, not before it.</li>
<li><strong>Explicit deny rules somewhere in the ACL chain?</strong> None found.</li>
<li><strong>Corrupted CBS staging folders?</strong> Checked several. All fine.</li>
<li><strong>Process Monitor, to watch the exact failing operation live?</strong> Captured cleanly over a remote session. Exporting the results, however, got stuck at zero CPU indefinitely, an early sign of a pattern that would repeat.</li>
<li><strong>Windows Update Agent COM registration?</strong> Re-registered every relevant DLL. No change.</li>
</ul>
<p>Each of these took real time to test properly and each one came back clean, which was somehow more frustrating than if any of them had been the answer.</p>
<h2 id="act-three-the-culprit">Act three: the culprit</h2>
<p>The breakthrough came from reading the CBS log with fresh eyes instead of grepping for the same error message again. Buried a few lines before the familiar access denied was this:</p>
<pre tabindex="0"><code>Failed to set interactive flag for search [HRESULT = 0x80070005 - E_ACCESSDENIED]
Failed to do Windows update search [HRESULT = 0x80070005 - E_ACCESSDENIED]
</code></pre><p><code>Add-WindowsCapability</code> doesn&rsquo;t just talk to a local package store. It calls into the Windows Update client and part of that call requires an interactive desktop session, a real window station with a real logged-in user sitting at it. A remote session, no matter how privileged, doesn&rsquo;t have one. It never did.</p>
<p>This machine had already surfaced this exact limitation earlier in the session with GUI tools that silently refuse to do anything useful remotely. It turns out Windows Capability installation belongs to that same family of &ldquo;secretly needs a desktop&rdquo; operations. It just expresses the requirement as a generic access denied error instead of, say, telling you.</p>
<p>Turns out this is a known, if obscure, Windows quirk rather than something unique to this machine. It shows up under a few different names, &ldquo;second hop problem&rdquo;, &ldquo;WinRM session limitation&rdquo;, &ldquo;requires interactive logon&rdquo;, scattered across Microsoft&rsquo;s own Q&amp;A forums and the odd GitLab issue tracker, always with the identical symptom: works fine from a local or RDP session, fails every time over a remote one.</p>
<h2 id="the-fix-once-you-know-it">The fix, once you know it</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$action</span> <span class="p">=</span> <span class="nb">New-ScheduledTaskAction</span> <span class="n">-Execute</span> <span class="s1">&#39;powershell.exe&#39;</span> <span class="n">-Argument</span> <span class="s1">&#39;-File C:\install-snmp.ps1&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$principal</span> <span class="p">=</span> <span class="nb">New-ScheduledTaskPrincipal</span> <span class="n">-UserId</span> <span class="s1">&#39;&lt;username&gt;&#39;</span> <span class="n">-LogonType</span> <span class="n">Interactive</span> <span class="n">-RunLevel</span> <span class="n">Highest</span>
</span></span><span class="line"><span class="cl"><span class="nb">Register-ScheduledTask</span> <span class="n">-TaskName</span> <span class="n">SnmpInstallJob</span> <span class="n">-Action</span> <span class="nv">$action</span> <span class="n">-Principal</span> <span class="nv">$principal</span> <span class="n">-Force</span>
</span></span><span class="line"><span class="cl"><span class="nb">Start-ScheduledTask</span> <span class="n">-TaskName</span> <span class="n">SnmpInstallJob</span>
</span></span></code></pre></div><p>Route the same command through a scheduled task configured to log on interactively and it works first try. Not &ldquo;works better.&rdquo; Works. The download that had failed instantly for hours now proceeded normally, slowly churned through Windows&rsquo; component-store bookkeeping (this machine has years of accumulated Feature-on-Demand cruft, so &ldquo;slowly&rdquo; meant a genuine ten minutes) and finished clean.</p>
<p>The companion capability, <code>WMI-SNMP-Provider.Client</code>, had one more trick left. It installed, but sat at <code>Staged</code> instead of <code>Installed</code>, even after a full reboot. The instinct was to reboot again. The actual fix was simpler: just run the same interactive install command a second time. No reboot needed, no further mystery, just Windows apparently wanting to be asked twice.</p>
<h2 id="the-reckoning">The reckoning</h2>
<p>Six genuinely broken registry hives, found and properly fixed. Every documented failure mode for <code>Add-WindowsCapability</code> ruled out one at a time. A restart deployed as a diagnostic tool that, in fairness, didn&rsquo;t actually fix anything but felt necessary anyway. And the real answer, the whole time, was that the command wanted to see an actual desktop before it would talk to Windows Update.</p>
<p>The registry fixes were not wasted effort. They were real defects and leaving <code>TrustedInstaller</code> locked out of half the registry is not a great place to leave a machine regardless of whether it explains this particular bug. But they weren&rsquo;t the fix either. The fix was one flag on a scheduled task.</p>
<p>The laptop now reports happily into LibreNMS alongside everything else on the network. Total time from &ldquo;this should take five minutes&rdquo; to a green checkmark: measured in hours, not minutes and almost entirely spent ruling out things that turned out to be correct all along.</p>
]]></content:encoded>
    </item>
    <item>
      <title>About</title>
      <link>https://blog.nosignal.ie/about/</link>
      <pubDate>Sun, 20 Sep 2026 19:58:12 +0100</pubDate>
      <guid>https://blog.nosignal.ie/about/</guid>
      <description>&lt;p&gt;&lt;strong&gt;I Have No Signal&lt;/strong&gt; is a blog about cutting through noise. Homelab engineering, self-hosting, automation, and the occasional rant about technology that should just work.&lt;/p&gt;
&lt;p&gt;Signal, not noise.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>I Have No Signal</strong> is a blog about cutting through noise. Homelab engineering, self-hosting, automation, and the occasional rant about technology that should just work.</p>
<p>Signal, not noise.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
