<p>There doesn’t appear to be a GUI-based way of doing this unless you’re joined to a domain - at least not one I could find anywhere - so I did a bit more digging and I’ve found an answer that works for our situation.</p>
<p>I didn’t understand what the string representation meant in the knowledge base article, but doing a bit of digging led me to discover that it’s SDDL syntax. Further digging led me to <a href="https://web.archive.org/web/20100922155044/http://msmvps.com/blogs/alunj/archive/2006/02/13/83472.aspx">this article by Alun Jones</a> which explains how to get the security descriptor for a service and what each bit means. <a href="https://support.microsoft.com/en-us/kb/914392">MS KB914392</a> has more details.</p>
<p>To append to the service’s existing security descriptor, use <code>sc sdshow "Service Name"</code> to get the existing descriptor. If this is a plain old .NET Windows Service - as is the case with ours - the security descriptor should look something like this:</p>
<pre><code class="lang-auto">D🙁A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)S🙁AU;FA
;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
</code></pre>
<p>We needed to grant permissions <code>RP</code> (to start the service), <code>WP</code> (to stop the service), <code>DT</code> (to pause/continue the service) and <code>LO</code> (to query the service’s current status). This could be done by adding our service account to the Power Users group, but I only want to grant individual access to the account under which the maintenance service runs.</p>
<p>Using <code>runas</code> to open a command prompt under the service account, I ran <code>whoami /all</code> which gave me the SID of the service account, and then constructed the additional SDDL below:</p>
<pre><code class="lang-auto">(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)
</code></pre>
<p>This then gets added to the <strong>D:</strong> section of the SDDL string above:</p>
<pre><code class="lang-auto">D🙁A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOC
RRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;RPWP
DTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S🙁AU;FA;CCDCLCSWRPWPDTLOC
RSDRCWDWO;;;WD)
</code></pre>
<p>This is then applied to the service using the <code>sc sdset</code> command (before the <code>S:</code> text):</p>
<pre><code class="lang-auto">sc sdset "Service Name" D🙁A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;
CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CR;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU
)(A;;RPWPDTLO;;;S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxx-xxxx)S🙁AU;FA;CCDCLCSW
RPWPDTLOCRSDRCWDWO;;;WD)
</code></pre>
<p>If all goes according to plan, the service can then be started, stopped, paused and have it’s status queried by the user defined by the SID above.</p>