<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Installing on Windows: wizard pages, service account, profile and the first hour]]></title><description><![CDATA[<p dir="auto"><em>Written for 6.3.4. hMailServer 6.3.7 (17 October 2026), a security release, has installers that carry the .NET Desktop Runtime 10.0.13 and install it only where no .NET 10 Desktop Runtime is installed at all; at every installation and upgrade <code>/ProtectFolders</code> hardens the program folder, <code>Bin</code> and <code>ControlPanel</code>, because in a folder that took its permissions from the root of a drive any account that could sign in to the computer could replace the programs the service runs (CVE-2026-107571; the default under Program Files was never affected); setup waits <code>ShutdownDrainSeconds</code> plus 90 seconds for the service's stop, where it waited plus 30; and the x64 installer's MySQL and MariaDB client is MariaDB Connector/C 3.4.11. See <a href="/topic/28277">the 6.3.7 announcement</a>. hMailServer 6.3.8 (2 November 2026) is the release to install today, a security release: a new server runs <code>hMailServer-6.3.8-x64.exe</code>, Authenticode-signed and with its Sigstore bundle beside it, and a server on 6.3.4, 6.3.5, 6.3.6 or 6.3.7 installs it by the live update, with the exceptions the announcement lists. Its setup makes or hardens the program folder, <code>Bin</code> and <code>ControlPanel</code> before it copies a file or runs a program of the installation, and ends with exit code 7 where another account than SYSTEM, the Administrators and TrustedInstaller controls one of them, a folder or a link on the way to them, or a program, library or script in them (step 2 below; the four narrower cases of <a href="https://gitlab.com/hmailserver/hmailserver/-/work_items/78" rel="nofollow ugc">work item 78</a> that 6.3.7's notes left open); and it refuses an installation of the original hMailServer's 5.7 before it changes anything. See <a href="/topic/28278">the 6.3.8 announcement</a>.</em></p>
<p dir="auto">This topic walks through a new installation of hMailServer 6.3.4 on Windows: what the installer checks before it shows a page, each page of the wizard, the two pages 6.3.4 adds (the setting profile and the service account), what runs after the files are copied, and the first hour after it. The one thing to know first: <strong>6.3.4 is installed by hand on every server.</strong> It carries an Authenticode signature and no Sigstore bundle, so no server's live update installs it; you download the installer, check it and run it yourself. If you already run hMailServer, read <a href="/topic/28193">Upgrading to 6.3.4</a> instead.</p>
<h3><a class="anchor-offset" name="before-you-download"></a>Before you download</h3>
<p dir="auto">The installer enforces a floor rather than advising one: <code>MinVersion=10.0.14393</code> and <code>ArchitecturesAllowed=x64</code>. On anything older, or on 32-bit Windows, setup stops with <em>"hMailServer requires Windows 10 version 1607 (build 14393) / Windows Server 2016 or later, 64-bit."</em> It needs an administrator, because it creates a service and writes to <code>HKLM</code>. The .NET 10 Desktop Runtime, which the database tools need, is installed automatically when missing; 6.3.7's installers carry 10.0.13, Microsoft's security release of 13 October 2026, and install it only where no .NET 10 Desktop Runtime is installed at all, so an upgraded server keeps the one it had. RAM is guidance only: 2 GB minimum, and nothing enforces it.</p>
<p dir="auto">Decide four things first, because the wizard asks for them:</p>
<ul>
<li><strong>The administrator password.</strong> At least five characters. It is the master password for the whole server, not an email password.</li>
<li><strong>The database.</strong> The wizard asks only "built-in or external". If in doubt take the built-in one; <a href="/topic/28228">Choosing a database</a> covers the rest.</li>
<li><strong>The kind of server it is</strong> (since 6.3.4): the setting profile, below.</li>
<li><strong>The account the service runs as</strong> (since 6.3.4): <code>NT SERVICE\hMailServer</code>, unless something it would need, such as a data or backup folder outside the program folder or SQL Server with Windows authentication on the same machine, is planned for first.</li>
</ul>
<p dir="auto">Plan antivirus exclusions for <code>Data\</code>, <code>Database\</code> and <code>Temp\</code>, and somewhere to keep the exported stored-secrets key, apart from the database backups.</p>
<h3><a class="anchor-offset" name="getting-the-installer-and-checking-it"></a>Getting the installer and checking it</h3>
<p dir="auto">Get <code>hMailServer-6.3.4-x64.exe</code> from the <a href="https://gitlab.com/hmailserver/hmailserver/-/releases/permalink/latest" rel="nofollow ugc">latest release</a> on GitLab, or from <code>https://updates.progressiverobot.com/download/hMailServer-x64.exe</code>. Both now give 6.3.8, the newest stable release: <code>hMailServer-6.3.8-x64.exe</code>, SHA-256 <code>4b9b9c3102cbed743f6c826289c54cec25c395d02208e55cdd3219187fbf8654</code>, with its <code>.cosign.bundle</code> beside it; 6.3.4's own files are on <a href="https://gitlab.com/hmailserver/hmailserver/-/releases/v6.3.4" rel="nofollow ugc">its release page</a>.</p>
<p dir="auto"><strong>6.3.4 carries no <code>.cosign.bundle</code>.</strong> It was built and Authenticode-signed by hand, after GitHub suspended the project's account on 18 September 2026 and before the project's GitLab CI signing job existed. Its SHA-256 sums are in a file signed with the release tags' SSH key: <a href="/topic/28218">the 6.3.4 announcement</a> has the two commands that check a download against it. Then check the installer's own signature:</p>
<pre><code class="language-powershell">Get-AuthenticodeSignature .\hMailServer-6.3.4-x64.exe | Format-List Status, SignerCertificate
</code></pre>
<p dir="auto"><code>Status</code> must be <code>Valid</code>, and the signer's subject names <em>Progressive Robot Ltd</em>. SmartScreen still warns: expect <em>Windows protected your PC</em> with the publisher's real name on it. <code>winget install hMailServer</code> and <code>choco install hmailserver</code> do not install this fork (<a href="/topic/28231">Unattended installs, winget and Chocolatey</a>).</p>
<h3><a class="anchor-offset" name="what-the-installer-checks-before-it-shows-a-page"></a>What the installer checks before it shows a page</h3>
<p dir="auto">Choose <strong>Run as administrator</strong>. <code>InitializeSetup()</code> runs first:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Check</th>
<th>Result</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/adminpassword</code>, or <code>HM_ADMIN_PASSWORD</code> (since 6.3.4), shorter than 5 characters</td>
<td>Setup stops</td>
</tr>
<tr>
<td>A window titled <strong>hMailServer Control Panel</strong>, <strong>hMailServer Administrator</strong>, <strong>hMailServer Database Setup</strong>, <strong>hMailServer Database Upgrader</strong> or <strong>DBSetup</strong> is open</td>
<td>Setup stops: <em>"…You must close down this application before starting the installation."</em></td>
</tr>
<tr>
<td>Ports 25, 110 or 143 in use while the hMailServer service is not running</td>
<td>Warning only: <em>"…This indicates that there already is an email server running on this computer."</em></td>
</tr>
</tbody>
</table>
<p dir="auto">Ignore the port warning and two servers will fight over port 25.</p>
<h3><a class="anchor-offset" name="the-wizard-page-by-page"></a>The wizard, page by page</h3>
<ol>
<li><strong>Licence agreement.</strong> hMailServer is AGPL-3.0.</li>
<li><strong>Destination folder.</strong> <code>C:\Program Files\hMailServer</code> is fine. Since 6.3.7 setup's <code>/ProtectFolders</code> hardens the program folder, <code>Bin</code> and <code>ControlPanel</code> at every installation and upgrade: in a folder that took its permissions from the root of a drive, any account that could sign in to the computer could replace the programs the service runs (CVE-2026-107571, every version from 6.0.0 to 6.3.6); the default folder under Program Files was never affected. Since 6.3.8 setup makes or hardens them before it copies a file or runs a program of the installation: one of them, a folder or a link on the way to them, or a program, library, script or settings file in them, that another account than SYSTEM, the Administrators and TrustedInstaller controls, and a program folder on a share or on a volume that keeps no permissions, end the installation with exit code 7, each named with the <code>icacls</code> that deals with it and, where setup says so, a restart of Windows before it runs again (<a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.8/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a>).</li>
<li><strong>Components.</strong> <code>server</code> is the mail server, the database tools and the DB scripts. <code>controlpanel</code> is the administration application; without it you have no GUI. <code>admintools</code>, <em>Remote administration support</em>, registers the COM type library on a machine that is <em>not</em> the server, for your own scripts; the Control Panel does not need it.</li>
<li><strong>Database type.</strong> <em>Use the built-in database engine</em> unless you decided otherwise. If you choose external, <code>DBSetup.exe</code> runs after the file copy and asks for the engine, host, database name and credentials. Skipped when <code>[Database] Type</code> is already set: an upgrade never re-asks.</li>
<li><strong>Start menu folder.</strong></li>
<li><strong>Administrator password.</strong> Minimum five characters; the two boxes must match. Since 6.3.4 a space, a double quote or a backslash reaches the database step as typed: the installer has the server store the password as PBKDF2 and hands it to the database tools in the environment variable <code>HM_ADMIN_PASSWORD</code>, never on a command line. Set one. While the value is empty, <code>COMAuthentication::AttempAnonymousAuthentication</code> grants server-administrator rights to any COM caller and <code>RestApiServer::Start</code> refuses to start the REST API.</li>
<li><strong>Server profile</strong> (since 6.3.4), on a new installation only.</li>
<li><strong>Service account</strong> (since 6.3.4).</li>
<li><strong>Ready to install.</strong> Pressing <strong>Install</strong> stops an existing hMailServer service and waits <code>ShutdownDrainSeconds + 30</code> seconds for it (since 6.3.7, <code>ShutdownDrainSeconds</code> plus 90). If it will not stop, setup refuses to go on: <em>"The hMailServer service did not stop within 30 seconds."</em> Stop it in <code>services.msc</code> and run setup again; do not work around this.</li>
<li><strong>Install.</strong></li>
</ol>
<h3><a class="anchor-offset" name="the-setting-profile-page-since-6.3.4"></a>The setting profile page (since 6.3.4)</h3>
<p dir="auto">A setting profile is the thirty or so settings that make a server a particular kind, named. The wizard offers four, with <strong>None</strong> (the shipped settings) chosen until you pick another:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Profile</th>
<th>For</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>office</code></td>
<td>One server that receives an office's mail, holds its mailboxes and sends what its people write: SPF, DKIM, DMARC and greylisting on, spam held in the quarantine, auto-ban and account lockout, a password policy and the breach check</td>
</tr>
<tr>
<td><code>gateway</code></td>
<td>A server behind a filtering gateway that has already judged the mail: greylisting off, and XCLIENT and an ARC seal trusted only from the addresses and the sealer you name; putting the gateway's addresses in Incoming relays is yours to do (<a href="/topic/28240">Behind a gateway</a>)</td>
</tr>
<tr>
<td><code>relay</code></td>
<td>An outbound relay that holds no mailbox anybody reads: IMAP and POP3 closed, hard bounces suppressed, deliveries throttled per destination, every message traced</td>
</tr>
<tr>
<td><code>sender</code></td>
<td>The relay's shape for a high-volume sender judged on its bounce and complaint rates</td>
</tr>
</tbody>
</table>
<p dir="auto">After the database step the installer runs <code>hMailServer.exe --apply-profile NAME --once --if-new --confirm</code>; <code>--if-new</code> leaves alone a database that already holds ten accounts or more. Every failure is said, naming the profile as not applied, and the installation succeeds with the shipped settings. In the wizard no difference is shown: each profile's sentence names the listener, the filter or the trust it changes, and choosing it is the confirmation, so <code>relay</code> and <code>sender</code> close IMAP and POP3 with no further question. Chosen later, from the Control Panel's <strong>Setting profiles</strong> page or the Control Deck's checklist, a profile shows its difference from this server before it changes anything. Either way it saves what it replaces and can be put back. A profile never sets a port, a directory, a <code>[Database]</code> value, a password or an IP range's <em>Require SSL/TLS when authenticating</em>. One caution from <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Profiles.md" rel="nofollow ugc">Profiles.md</a>: the installer page is among what it lists as "written and read, and not run", because "the installer was not built for this change".</p>
<h3><a class="anchor-offset" name="the-service-account-page-since-6.3.4"></a>The service account page (since 6.3.4)</h3>
<p dir="auto">Until 6.3.4 the Windows service ran as LocalSystem, so a flaw reachable through SMTP, IMAP or POP3 was a flaw with full control of the computer. A new installation now runs it as <code>NT SERVICE\hMailServer</code>, the service's own virtual account: no password, no account to create, and it reaches only the folders it is granted.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>The machine</th>
<th>The page offers</th>
<th>The default</th>
</tr>
</thead>
<tbody>
<tr>
<td>No hMailServer service yet</td>
<td><code>NT SERVICE\hMailServer</code>, or LocalSystem</td>
<td><code>NT SERVICE\hMailServer</code></td>
</tr>
<tr>
<td>A service running as LocalSystem</td>
<td>keep LocalSystem, or move it</td>
<td>keep LocalSystem</td>
</tr>
<tr>
<td>A service running as any other account</td>
<td>keep that account, or move it back to LocalSystem</td>
<td>keep the account</td>
</tr>
</tbody>
</table>
<p dir="auto">An upgrade never changes the account unless this page is answered to.</p>
<p dir="auto"><strong>What the account is granted</strong>, by <code>hMailServer.exe /GrantServiceAccess</code>: Modify on the program folder's own <code>Data</code>, <code>Logs</code>, <code>Temp</code> and <code>Database</code>; Read on its other folders; Modify on <code>Bin\hMailServerApiKeys.ini</code>; nothing on <code>hMailServer.INI</code>; and a folder the configuration names elsewhere only once an administrator approves it. An attended installation asks (<code>--confirm</code>). A silent one approves nothing: when the configuration names a folder or key file outside those folders, it leaves the service on LocalSystem, working, and says why.</p>
<p dir="auto">The folders and the certificate and key files the configuration names are checked against those grants and reported: <code>NOT APPROVED</code>, a folder nobody has approved; <code>OUTSIDE</code>, a certificate or key file, which is never given Read where it is (move it into <code>Data\Certificates</code>, or approve its folder for Read); <code>REFUSED</code>, a folder that may never be granted. A folder is approved with <code>--approve-modify "&lt;folder&gt;"</code> or <code>--approve-read "&lt;folder&gt;"</code>, or by answering Yes to <code>--confirm</code>; approvals are kept in <code>HKEY_LOCAL_MACHINE\SOFTWARE\hMailServer\ServiceAccessPaths</code>, a key only Administrators and SYSTEM may change. Approve only a folder you recognise: the service may then write in it. Never granted, approved or not: anything not a full path on a fixed local drive; a drive's root; the program folder, a folder above it, or anything in it but its <code>Data</code>, <code>Logs</code>, <code>Temp</code> and <code>Database</code>; the Windows folder, a Program Files folder, the user profiles folder or <code>ProgramData\Microsoft</code>, or any folder in or above one of them; <code>ProgramData</code> or a folder above it (a folder of your own inside it may be approved); and any path through a junction, a symbolic link or a mount point. <code>--report-only</code> says what would be done and changes nothing. Exit codes: <code>0</code> every grant made and everything named reached, or confirmed, <code>1</code> a grant or an approval failed, <code>2</code> not in an installation's <code>Bin</code>, <code>3</code> not elevated, <code>4</code> something outside not confirmed, <code>5</code> a folder that is never granted is named, <code>6</code> answered No.</p>
<p dir="auto"><strong>What only LocalSystem could do</strong> is refused with a sentence: the live update's apply (the update is still checked; on 6.3.4 and 6.3.5 an administrator downloads the installer from the release page, checks its signature and runs it, and from 6.3.6 installs the verified update with <strong>Install update</strong> on the Control Panel's <em>Server status</em> page on the server, with one Windows prompt), the auto-ban's Windows Firewall rules (<code>AutoBanFirewall</code>, HM7460; banned addresses are still refused by the server) and <code>Utilities.MakeDependent</code>. SQL Server with integrated authentication on the same machine needs a login first: <code>CREATE LOGIN [NT SERVICE\hMailServer] FROM WINDOWS</code>, then a user with <code>db_owner</code>. MySQL, MariaDB and PostgreSQL use a user and password, and nothing changes.</p>
<p dir="auto"><strong><code>hMailServer.INI</code> is read-only to the service.</strong> A change of the administrator password over COM or the Control Panel's <em>Administrator password</em> card is refused; make it from an elevated prompt in <code>Bin</code> with <code>hMailServer.exe --set-admin-password</code>, which takes the password from <code>HM_ADMIN_PASSWORD</code> or, failing that, from standard input, and restart the service (<a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a> writes it <code>/SetAdministratorPassword</code>). Enrolling the administrator's TOTP second factor needs an account that may write the file, so move the service to LocalSystem for the enrolment and back.</p>
<p dir="auto">To move a service that runs as LocalSystem, run the installer again and choose the move, use the Control Panel's <em>Windows service account</em> card under <em>Server limits &amp; expert settings</em>, or, from an elevated prompt in <code>Bin</code>:</p>
<pre><code class="language-bat">hMailServer.exe --confirm /GrantServiceAccess
hMailServer.exe --service-account virtual /Register
net stop hMailServer &amp;&amp; net start hMailServer
</code></pre>
<p dir="auto">running the second line only when the first ended in <code>0</code>. To go back, run the installer again and choose <em>Move it back to LocalSystem</em>, use the same card, or run <code>hMailServer.exe --service-account localsystem /Register</code> and restart the service. <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a> records that the live registration "is exercised by hand on a throwaway machine; nothing here registers a service on the bench".</p>
<h3><a class="anchor-offset" name="what-runs-after-the-files-are-copied"></a>What runs after the files are copied</h3>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>#</th>
<th>Step</th>
<th>What runs</th>
<th>If it fails</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>.NET 10 Desktop Runtime</td>
<td>Only when missing; since 6.3.4 pinned to 10.0.12 by version and SHA-512; 6.3.7 carries 10.0.13 and installs it only where no .NET 10 Desktop Runtime is installed at all</td>
<td>Error dialog; exit codes <code>0</code>, <code>3010</code> and <code>1638</code> count as success</td>
</tr>
<tr>
<td>2</td>
<td>Database backend</td>
<td><code>SSCERuntime_x64-ENU.msi</code>, built-in engine only</td>
<td>Step 4 is skipped</td>
</tr>
<tr>
<td>3</td>
<td>Create the service</td>
<td><code>hMailServer.exe --service-account &lt;choice&gt; /Register</code>; a service to be moved is registered as LocalSystem here</td>
<td>Step 5 is skipped</td>
</tr>
<tr>
<td>3a</td>
<td>Administrator password (since 6.3.4)</td>
<td><code>hMailServer.exe --set-admin-password</code></td>
<td>The install <strong>fails</strong></td>
</tr>
<tr>
<td>4</td>
<td>Create the database</td>
<td><code>DBSetupQuick.exe</code> for the built-in engine, <code>DBSetup.exe</code> for an external one chosen for the first time</td>
<td>The install <strong>fails</strong>, naming the exit code</td>
</tr>
<tr>
<td>4a</td>
<td>Secure a new installation (since 6.3.4)</td>
<td><code>hMailServer.exe --apply-new-install-defaults</code></td>
<td>Said and logged; the installation succeeds</td>
</tr>
<tr>
<td>4b</td>
<td>Apply the profile (since 6.3.4)</td>
<td><code>--apply-profile</code>, above</td>
<td>Said; the shipped settings stay</td>
</tr>
<tr>
<td>4c</td>
<td>Stored-secrets key (since 6.3.4)</td>
<td><code>hMailServer.exe --create-stored-secrets-key</code></td>
<td>Said, with the command to run by hand</td>
</tr>
<tr>
<td>4d</td>
<td>Move the service (since 6.3.4)</td>
<td><code>/GrantServiceAccess</code>, and only when that ends in 0, <code>--service-account virtual /Register</code></td>
<td>The service stays on LocalSystem, working</td>
</tr>
<tr>
<td>5</td>
<td>Start the service</td>
<td><code>net START hMailServer</code>, the verdict taken from the SCM</td>
<td><em>"The hMailServer service was installed but did not start."</em></td>
</tr>
</tbody>
</table>
<p dir="auto">The database step runs while the service is still LocalSystem, because it writes <code>[Database]</code> into <code>hMailServer.INI</code> through the service, which the virtual account may not do. <code>ServiceMain</code> reports <code>SERVICE_RUNNING</code> before it connects to the database, so a running service proves the process started, not that the schema is usable; step 4's exit code covers the schema.</p>
<h3><a class="anchor-offset" name="what-a-new-installation-starts-with-since-6.3.4"></a>What a new installation starts with (since 6.3.4)</h3>
<p dir="auto">Step 4a runs <code>hMailServer.exe --apply-new-install-defaults</code> after the database step, before the server first listens, and only on a database <strong>this installation created</strong>: on one <code>DBSetup.exe</code> attached the verb exits 5, which the installer only logs, and the installation succeeds. On a created database, ports 25, 587, 110 and 143 offer STARTTLS with a self-signed certificate that mail clients warn about, and the <em>Internet</em> IP range requires TLS for authentication, so a client on another machine must start TLS before it signs in; an upgraded server is left as it was. What each default is, how to replace the certificate (<a href="/topic/28187">Let's Encrypt certificates are automatic</a>) and how to apply the defaults by hand are in <a href="/topic/28241">Hardening a public mail server</a>.</p>
<h3><a class="anchor-offset" name="the-stored-secrets-key-since-6.3.4"></a>The stored-secrets key (since 6.3.4)</h3>
<p dir="auto">On a new installation step 4c makes the key that seals each account's TOTP second factor and the <code>[Settings]</code> secrets in the database. It is kept in this machine's <code>hMailServer.INI</code> alone, never in the database or a backup, and an upgrade makes none. Export it and keep the file with the database backups, stored apart from them:</p>
<pre><code class="language-powershell"># elevated, in the Bin folder
.\hMailServer.exe --export-stored-secrets-key D:\keys\hmailserver-stored-secrets.key
</code></pre>
<p dir="auto">A database restored without it opens none of those secrets. <a href="/topic/28241">Hardening a public mail server</a> covers the key in full: what it seals, other nodes, and a key that is lost.</p>
<h3><a class="anchor-offset" name="confirm-it-is-running-and-open-the-firewall"></a>Confirm it is running, and open the firewall</h3>
<p dir="auto"><code>Get-Service hMailServer</code> should say <code>Running</code>. On a new installation that kept the page's default, <code>services.msc</code> shows it logging on as <code>NT SERVICE\hMailServer</code>. <code>sc.exe qfailure hMailServer</code> shows the recovery the installer set: restarts after 60, 120 and 300 seconds, the counter reset after 86400.</p>
<p dir="auto"><strong>The installer does not open firewall ports.</strong> Until you do, nothing reaches the server. One rule per port, in an elevated PowerShell; for SMTP:</p>
<pre><code class="language-powershell">New-NetFirewallRule -DisplayName "hMailServer SMTP" -Direction Inbound -Protocol TCP -LocalPort 25 -Action Allow
</code></pre>
<p dir="auto">Which ports to open, and which to leave closed, are in <a href="/topic/28226">Every port hMailServer listens on</a>.</p>
<h3><a class="anchor-offset" name="the-first-hour-the-checklist-and-the-sample-domain"></a>The first hour: the checklist and the sample domain</h3>
<p dir="auto">Since 6.3.4 the server judges its own first hour. Twelve items, each <code>done</code>, <code>action_needed</code>, <code>cannot_tell</code> or <code>not_needed</code>: a profile, a domain, an account, TLS on the submission port, passwords only over TLS, an SPF record, DKIM signing, a DMARC record, a backup destination, a second factor for the administrator, the stored-secrets key and the account the server runs as. It is the Control Deck's <em>Checklist</em> view, the head of the Control Panel's <em>External setup</em> page, <code>GET /api/v1/setup/checklist</code> and COM's <code>Utilities.GetSetupChecklist</code>.</p>
<p dir="auto">A button on the Control Panel's Welcome page and on the Deck's checklist makes a throwaway sample domain, <code>example.test</code>, with three mailboxes, a list, a rule and eight delivered messages; a second removes it. The server mints one password for the three mailboxes and shows it once, in the answer that makes the sample; <a href="/topic/28229">Your first domain and mailbox</a> has the detail. Remove the sample before the server takes real mail.</p>
<h3><a class="anchor-offset" name="silent-installation"></a>Silent installation</h3>
<p dir="auto">A silent install answers the two 6.3.4 pages with <code>/profile=</code> and <code>/serviceaccount=</code>, and leaves the administrator password unset unless <code>/adminpassword=</code> or <code>HM_ADMIN_PASSWORD</code> gives it. <strong>Always check the exit code</strong>: a failed database create fails the install. The switches, the profiles and the password are in <a href="/topic/28231">Unattended installs</a>.</p>
<h3><a class="anchor-offset" name="what-the-installer-wrote"></a>What the installer wrote</h3>
<p dir="auto"><code>{app}\Bin\hMailServer.INI</code> is the only configuration file. Since 6.3.4 the database is the settings store: the file keeps <code>[Directories]</code>, <code>[Database]</code>, <code>[Security]</code> and <code>[GUILanguages]</code>, its <code>[Settings]</code> section is the server's copy, and a hand edit to a key the database holds is named in the error log (HM5804) and does not take effect. A service that may write the file puts the line back at the next start; under <code>NT SERVICE\hMailServer</code> the copy is not refreshed and the edited line stays as you left it, so a line that survives a restart is still not the value in use. <code>[Security] AdministratorPassword</code> is PBKDF2, <code>$h1$&lt;iterations&gt;$&lt;salt-hex&gt;$&lt;key-hex&gt;</code>. <code>{app}\Data</code>, <code>{app}\Events</code>, <code>{app}\Addons</code> and the ini are left behind by an uninstall, on purpose.</p>
<h3><a class="anchor-offset" name="what-it-does-not-do-and-where-to-read-more"></a>What it does not do, and where to read more</h3>
<p dir="auto">The installer does not open the firewall, does not create ports 465, 993 and 995, publishes no DNS record, and never applies the secure defaults, a profile or a stored-secrets key to an upgraded database. All of this is Windows only: the Linux packages have no wizard, no Control Panel and no COM (<a href="/topic/28190">First install on Linux</a>).</p>
<p dir="auto">Sources: the wiki's <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Installing-hMailServer" rel="nofollow ugc">Installing hMailServer</a> and <a href="https://gitlab.com/hmailserver/hmailserver/-/wikis/Before-You-Install" rel="nofollow ugc">Before You Install</a>; <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SecureDefaults.md" rel="nofollow ugc">SecureDefaults.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/ServiceAccount.md" rel="nofollow ugc">ServiceAccount.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Profiles.md" rel="nofollow ugc">Profiles.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SetupChecklist.md" rel="nofollow ugc">SetupChecklist.md</a>, <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/SampleDomain.md" rel="nofollow ugc">SampleDomain.md</a> and <a href="https://gitlab.com/hmailserver/hmailserver/-/blob/v6.3.4/hmailserver/docs/Upgrading.md" rel="nofollow ugc">Upgrading.md</a>; and chapters <a href="https://www.progressiverobot.com/hmailserver-documentation/#3-before-you-install-the-checklist" rel="nofollow ugc">3</a> and <a href="https://www.progressiverobot.com/hmailserver-documentation/#4-installing-hmailserver" rel="nofollow ugc">4</a> of the public documentation. The release announcement is <a href="/topic/28218">hMailServer 6.3.4: a password could run code on Windows servers with JScript scripting</a>.</p>
]]></description><link>https://www.hmailserver.co.uk/topic/28227/installing-on-windows-wizard-pages-service-account-profile-and-the-first-hour</link><generator>RSS for Node</generator><lastBuildDate>Fri, 06 Nov 2026 09:05:55 GMT</lastBuildDate><atom:link href="https://www.hmailserver.co.uk/topic/28227.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Sep 2026 19:09:13 GMT</pubDate><ttl>60</ttl></channel></rss>