WLAN-Profile, portables OpenVPN und automatischer AD-Join

- WLAN-Tab: SSIDs (WPA2/WPA3/offen, versteckt) in Blaupausen speichern,
  fuer alle Benutzer anlegen, Profile eines Referenzgeraets uebernehmen
- OpenVPN portabel: offizielles MSI per msiexec /a entpackt + Microsoft-
  signierter TAP-Treiber in tools\openvpn; Treiber wird nur temporaer
  geladen und danach entfernt (--disable-dco, --dev-node)
- .ovpn/Zertifikate je Kunde hochladen, Benutzer/Kennwort optional
- AD-Join mit DC-Test (SRV+LDAP), OU, Umbenennung, lokalen Admins,
  optional ueber VPN; VPN optional als Dienst fuer die erste Anmeldung
- Fehlende Kennwoerter werden beim Start abgefragt und nicht gespeichert

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-09 16:29:07 +02:00
co-authored by Claude Opus 5.5
parent ebfec7000e
commit 46a969ee90
8 changed files with 692 additions and 4 deletions
+102
View File
@@ -15,6 +15,8 @@
<a data-tab="apps">Programme</a>
<a data-tab="office">Office</a>
<a data-tab="shortcuts">Desktop-Icons</a>
<a data-tab="wifi">WLAN</a>
<a data-tab="vpn">VPN &amp; Domäne</a>
<a data-tab="bloatware">Bloatware</a>
<a data-tab="system">System &amp; Sicherheit</a>
<a data-tab="power">Energie</a>
@@ -43,6 +45,7 @@
<p id="bpQuickDesc" class="muted small"></p>
<div class="checks" id="steps">
<label><input type="checkbox" value="system" checked> System</label>
<label><input type="checkbox" value="wifi"> WLAN</label>
<label><input type="checkbox" value="bloatware"> Bloatware</label>
<label><input type="checkbox" value="security" checked> Sicherheit</label>
<label><input type="checkbox" value="power" checked> Energie</label>
@@ -51,6 +54,7 @@
<label><input type="checkbox" value="shortcuts" checked> Desktop-Icons</label>
<label><input type="checkbox" value="drivers"> Hersteller-Treiber</label>
<label><input type="checkbox" value="updates" checked> Windows Update</label>
<label><input type="checkbox" value="domain"> VPN &amp; Domäne</label>
<label><input type="checkbox" value="bitlocker"> BitLocker</label>
</div>
<div id="summary" class="summary"></div>
@@ -242,6 +246,96 @@
</div>
</section>
<!-- WLAN -->
<section id="tab-wifi" class="tab">
<h1>WLAN</h1>
<div class="cols">
<div>
<div class="card">
<h2>WLAN zur Blaupause hinzufügen</h2>
<div class="row" style="margin-top:0">
<label class="f" style="flex:2">SSID<input id="wfSsid" list="wfNetworks" placeholder="Netzwerkname"></label>
<label class="f">Sicherheit<select id="wfAuth"><option value="WPA2PSK">WPA2-Personal</option><option value="WPA3SAE">WPA3-Personal</option><option value="open">Offen</option></select></label>
</div>
<datalist id="wfNetworks"></datalist>
<div class="f" id="wfKeyRow">Kennwort<div class="row" style="margin:3px 0 0"><input id="wfKey" type="password" autocomplete="new-password"><button class="small ghost" id="wfShow" type="button">👁</button></div></div>
<div class="checks">
<label><input type="checkbox" id="wfAuto" checked> Automatisch verbinden</label>
<label><input type="checkbox" id="wfHidden"> Verstecktes Netzwerk</label>
<label><input type="checkbox" id="wfConnect"> Nach dem Anlegen verbinden</label>
</div>
<button class="primary" id="btnWfAdd">Hinzufügen</button>
</div>
<div class="card">
<h2>In der Blaupause <span id="wfCount" class="badge">0</span></h2>
<div id="wfList" class="list"></div>
<button class="primary" id="btnWfApply">Jetzt auf diesem Gerät anlegen</button>
<p class="muted small">Profile werden für <b>alle Benutzer</b> gespeichert. Kennwörter liegen im Klartext in der Blaupause.</p>
</div>
</div>
<div>
<div class="card">
<h2>Dieses Gerät <button class="small ghost" id="btnWfRefresh">↻</button></h2>
<div id="wfState" class="muted small"></div>
<h3>Gespeicherte Profile</h3>
<div id="wfDevice" class="list"></div>
<button id="btnWfImport">Profile dieses Geräts in die Blaupause übernehmen</button>
<p class="muted small">Praktisch, um WLANs vom eigenen Techniker-Notebook oder einem Referenzgerät zu übernehmen (inkl. Kennwörter; Enterprise-WLANs werden übersprungen).</p>
</div>
</div>
</div>
</section>
<!-- VPN & Domäne -->
<section id="tab-vpn" class="tab">
<h1>VPN &amp; Domäne</h1>
<div class="cols">
<div>
<div class="card">
<h2>OpenVPN (portabel vom Stick)</h2>
<div id="vpnPortable" class="muted small"></div>
<div class="f">Konfiguration (.ovpn)<div class="row" style="margin:3px 0 0"><select id="vpnConfig" data-bind="vpn.config"></select>
<label class="button">Hochladen<input type="file" id="vpnUpload" accept=".ovpn,.conf,.crt,.pem,.key,.p12,.pfx" multiple hidden></label></div></div>
<p class="muted small">Zertifikate/Schlüssel, auf die die .ovpn verweist, einfach mit hochladen (Ordner <code>vpn\</code>).</p>
<div class="row">
<label class="f">VPN-Benutzer (falls nötig)<input data-bind="vpn.user" autocomplete="off"></label>
<label class="f">VPN-Kennwort<input data-bind="vpn.password" type="password" autocomplete="new-password" placeholder="leer = beim Start fragen"></label>
</div>
<label class="f">DNS-Server für den Tunnel (optional)<input data-bind="vpn.dns" placeholder="z.B. 10.0.0.10, 10.0.0.11 – nur falls das VPN keinen DNS mitliefert"></label>
<div class="row">
<button class="primary" id="btnVpnConnect">Verbinden</button>
<button id="btnVpnDisconnect">Trennen</button>
<button class="ghost" id="btnVpnRefresh">↻ Status</button>
</div>
<div id="vpnStatus" style="margin-top:12px"></div>
</div>
</div>
<div>
<div class="card">
<h2>Domänenbeitritt (Active Directory)</h2>
<div class="row" style="margin-top:0">
<label class="f">Domäne (FQDN)<input data-bind="domain.name" placeholder="firma.local"></label>
<button id="btnDomTest">Erreichbarkeit testen</button>
</div>
<div id="domTest" class="muted small"></div>
<label class="f">Ziel-OU (optional)<input data-bind="domain.ou" placeholder="OU=Notebooks,OU=Computer,DC=firma,DC=local"></label>
<div class="row">
<label class="f">Benutzer mit Beitrittsrecht<input data-bind="domain.user" placeholder="FIRMA\admin oder [email protected]" autocomplete="off"></label>
<label class="f">Kennwort<input data-bind="domain.password" type="password" autocomplete="new-password" placeholder="leer = beim Start fragen"></label>
</div>
<label class="f">Lokale Administratoren hinzufügen (optional)<input data-bind="domain.admins" placeholder="z.B. IT-Admins, FIRMA\Helpdesk"></label>
<p class="muted small">Neuer Computername kommt aus „System &amp; Sicherheit“ und wird beim Beitritt gleich mit gesetzt.</p>
<div class="checks col">
<label><input type="checkbox" data-bind="domain.useVpn"> Vorher OpenVPN verbinden</label>
<label><input type="checkbox" data-bind="domain.vpnService"> VPN danach dauerhaft als Dienst einrichten (für die erste Domänenanmeldung außerhalb des Firmennetzes – installiert OpenVPN offline vom Stick)</label>
<label><input type="checkbox" data-bind="domain.reboot"> Danach neu starten</label>
</div>
<button class="primary" id="btnDomJoin">Domäne beitreten</button>
</div>
</div>
</div>
</section>
<!-- Bloatware -->
<section id="tab-bloatware" class="tab">
<h1>Bloatware entfernen</h1>
@@ -417,6 +511,14 @@
</section>
</main>
<dialog id="secretDlg">
<form method="dialog">
<h2 id="secretTitle">Kennwort</h2>
<p id="secretText" class="muted small"></p>
<input id="secretInput" type="password" autocomplete="new-password" style="width:100%">
<div class="row"><button value="cancel" class="ghost">Abbrechen</button><button value="ok" class="primary">OK</button></div>
</form>
</dialog>
<div id="toast"></div>
<script src="app.js"></script>
</body>