AdminSuite — Windows IT administration desktop tool

A collection of scattered PowerShell scripts, replaced by a single, audited desktop application. Every write to Active Directory or Exchange passes through a mandatory confirmation dialog — nothing happens silently.

Ready
New UserAD account + mailbox
Shared MailboxCreate shared mailbox
Personio SyncAD ↔ Personio diff
OffboardingDeactivate employees
Audit LogToday's log file
← Select a module to begin
Ready — AD not loaded yet
Load AD Data
Preview
Create User
// main window — modular sidebar navigation + fixed status bar

The problem with PowerShell scripts

Before AdminSuite, onboarding a new employee meant opening several PowerShell consoles, running scripts from shared network drives and manually pasting the generated password into a helpdesk ticket. Steps got skipped. Accounts landed in the wrong OU. Mailboxes were forgotten.

Main risk: writes to Active Directory happened without any confirmation gate. A typo in the username, choosing the wrong OU or running the wrong version of a script had immediate, hard-to-undo consequences.

AdminSuite solves this with a mandatory confirmation dialog before every write, a structured audit log and a single executable that any member of the IT team can run — no PowerShell knowledge required.

4Integrated modules
0Silent AD writes
1Standalone exe file

Security and audit model

Every module follows the same four-step write pattern. There are no shortcuts — even changing a single field goes through the full confirmation flow.

1
Build ChangeList
field, old value, new value
2
Show dialog
user must click “Apply”
3
Execute
AD write with NetworkCredential
4
Audit log
structured entry, daily file

Credentials are stored in Windows Credential Manager via P/Invoke to advapi32.dll. On first launch the standard Windows credential dialog appears; subsequent launches silently verify the stored credential against the AD administrators group. If the account loses membership, the credential is cleared automatically.

Audit files land in %APPDATA%\AdminSuite\Audit\audit_YYYY-MM-DD.log — one file per day, human-readable, one entry per operation.


Full automation? Yes — but not with sensitive data

This entire flow — from account creation through the mailbox to group assignment — could be wired up entirely in n8n and run without any human involvement, e.g. triggered by a new record in Personio. Technically nothing stands in the way, and for many processes that's exactly what I do.

For writes to Active Directory and Exchange I deliberately did not do that. These are operations on sensitive data and hard to undo — a typo in a name, the wrong OU or a mismatch in the Personio ↔ AD mapping can cause damage that no log will reverse. So instead of full automation AdminSuite keeps a human in the loop: the live preview shows exactly what will happen, and a single click on “Apply” is the boundary between intent and write.

Principle: automation simplifies what is repetitive — but for irreversible operations it's worth keeping an extra pair of eyes. That's a design decision, not a limitation of the tool.


Modules

1
New user

Creating an AD account with an Exchange remote mailbox

A three-tab flow: personal and organisational data, group assignment, and then a full summary before execution. The username is generated live from the first initial + surname, with umlaut replacement and conflict resolution via suffix.

The live preview on tab 1 shows the generated username, UPN and automatic password before anything is written to AD. The password is copied to the clipboard immediately after the account is created successfully.

User Data
Groups & Access
Summary & Execute
PERSONAL
FIRST NAME *
Thomas
LAST NAME *
Müller
PHONE EXTENSION
142
+49 89 / 123 456 - [ext]
ACCOUNT PREVIEW
t.mueller
GENERATED PASSWORD
Mx#9kP!2qRn
(copied to clipboard after creation)
ORGANISATION
MANAGER *
Schmidt, Anna
DEPARTMENT *
IT Infrastructure
POSITION *
System Administrator
NOTES
Username: t.tester (first initial + last name). Umlauts replaced automatically. Conflict → suffix 2 added.
// new user · tab 1 — data with live account preview
User Data
Groups & Access
Summary & Execute
SUMMARY
SAMAccountName : t.mueller
UPN : [email protected]
Display Name : Thomas Müller
Department : IT Infrastructure
Title : System Administrator
Manager : Schmidt, Anna
Phone : +49 89 / … - 142

SELECTED GROUPS
- VPN Access
- Microsoft 365 E3
- All Staff DL
EXECUTION LOG
[INFO] Creating AD account t.mueller…
[OK] Account created
[INFO] Setting attributes…
[OK] Department, Title, Manager set
[INFO] Enabling Remote Mailbox…
[OK] Remote mailbox provisioned
[INFO] Assigning groups (3)…
[OK] Groups assigned
[OK] Password copied to clipboard
[DONE] t.mueller created ✓
// new user · tab 3 — summary + real-time execution log

2
Shared mailbox

Provisioning an Exchange shared mailbox

Creates a shared mailbox in a hybrid Exchange / Exchange Online environment via PowerShell Remoting. The live preview card updates as you type, showing the final SMTP address, the routing address and the GAL visibility state before a remote session is opened.

SHARED MAILBOX
DISPLAY NAME *
Support Team
ALIAS *
support
lowercase, no spaces → [email protected]
FIRST NAME *
Support
LAST NAME *
Team
TARGET OU *
OU=SharedMailboxes,DC=corp,DC=local
Visible in Global Address List (GAL)
LIVE PREVIEW
EXCHANGE OBJECT
Support Team
ADDRESSES
GAL VISIBILITY
Visible — HiddenFromAddressLists: $false
LOG
[INFO] Connecting to Exchange…
[OK] PSSession established
[INFO] New-RemoteMailbox -Shared…
// shared mailbox — form + live SMTP/GAL preview

3
Personio sync

Automatic diff between Personio HR and Active Directory

Fetches all employees from Personio API v2 and compares position, department and manager for each matched AD user. The result is a difference table where each row can be selected independently for applying.

Department name resolution works in two stages: first a bulk fetch of organisational units is attempted; if unavailable, the tool falls back to per-user fetches — transparently and without operator intervention.

Mock mode: when no API credentials are configured, the module works on static test employees — the interface and diff logic can be tested without a live Personio tenant.

PERSONIO API STATUS
Live — 174 employees · api.personio.de
AD matched: 162 · unmatched: 12
Diffs found:
7
USERFIELDAD CURRENTPERSONIO NEWSTATUS
k.braunTitleJunior DeveloperSoftware EngineerPending
k.braunDescriptionJunior DeveloperSoftware EngineerPending
m.weberDepartmentSalesKey AccountPending
s.hoffmannManagerr.kleina.schmidtPending
l.fischerTitleWerkstudentWorking StudentApplied
[INFO] Fetching Personio employees (page 1/2)…
[OK] 174 employees · 162 AD matches · 7 diffs found
[INFO] Department: 158 resolved via per-ID fallback
// Personio sync — difference table with per-row checkboxes

4
Offboarding

A structured employee deactivation flow

A search-based form — type a name or email to locate an employee, review their AD card (groups, department, manager), choose how the mailbox is handled. A mandatory confirmation checkbox and the standard audit dialog prevent accidental runs.

SELECT EMPLOYEE
SEARCH
fischer
Fischer, Laura
Fischer, Markus
Fischer, Laura
Working Student · IT
Member of 4 groups
I confirm deactivation of l.fischer
MAILBOX OPTION
Keep as Shared Mailbox
Exchange Online conversion
Remove mailbox entirely
OFFBOARDING LOG
[INFO] Searching AD for 'fischer'…
[OK] 2 users found
[INFO] Loading user card: l.fischer
[OK] Member of 4 groups, manager: a.schmidt
[INFO] Starting offboarding: l.fischer
[INFO] Removing group memberships…
[OK] 4 groups removed
[INFO] Clearing phone, manager…
[OK] Attributes cleared
[INFO] Moving to Disabled OU…
[OK] OU move complete
[INFO] Disabling account…
[OK] Account disabled
[INFO] Converting mailbox → Shared…
[OK] Set-Mailbox -Type Shared
[DONE] l.fischer offboarded ✓
// offboarding — search, user card, mailbox option, execution log

Technology stack

Distributed as a single standalone .exe file (win-x64), so no .NET runtime needs to be installed on admin machines. Configuration lives in appsettings.json next to the executable and never enters the repository.

LayerTechnologyNotes
Application.NET 9 / WPFStandalone exe file (single-file), win-x64; published via dotnet publish
Active DirectorySystem.DirectoryServicesAccountManagement for account operations + raw DirectorySearcher for bulk reads
ExchangePowerShell RemotingMicrosoft.PowerShell.SDK; PSSession to on-prem Exchange via Invoke-Command
HR integrationPersonio API v2HttpClient + System.Text.Json; pagination; mock mode without credentials
AuthenticationWindows Credential ManagerP/Invoke to advapi32.dll (CredReadW / CredWriteW); silent auto-login
Secrets1Password CLIAPI keys and other sensitive data injected at runtime; no secrets in configuration files
DI / ConfigMicrosoft.Extensions.DITyped options; appsettings.json in gitignore, example in repo
AuditIAuditLoggerDaily log file in %APPDATA%\AdminSuite\Audit\; structured entries
CI / BuildGitHub Actions + xUnitBuild + tests on every push to master; artifact as single-file exe

Result

AdminSuite eliminated the most common onboarding mistakes — wrong OU, missing mailbox, forgotten group assignments — by making every step visible and requiring an explicit confirmation. The audit log gives an instant answer to “who changed what and when”, without digging through the Windows event log.

The Personio sync module cut the time to synchronise HR data with Active Directory from a monthly, manual export to an on-demand operation that completes in under two minutes for more than 170 employees.

Secrets such as API keys are injected at runtime via the 1Password CLI — they are not kept in configuration files or in the repository. The project is in active development; the next planned step is expanded test coverage of the AD service layer.

Need custom software?

I'll gladly design and build a tool tailored to your IT processes.

Get in touch