Windmill Labs
Windmill

Native Windows automation, without Docker or WSL

Run PowerShell, MSSQL and C# on domain-joined servers with full access to Active Directory and Kerberos. A code-first replacement for Task Scheduler and Power Automate. Native Windows workers are a Self-Hosted Enterprise feature.

PowerShell, C#/.NET 9, Python, TypeScript and SQL on the same worker
MSSQL with Kerberos, no service-account passwords stored
Mix Windows and Linux workers in one fleet, route jobs by tag
Teams approvals, Entra ID SSO and audit logs out of the box

Why Windows automation breaks inside containers

PowerShell scripts that touch Active Directory need the worker to be domain-joined. SQL Server with Kerberos needs a real Windows token, not a forwarded one. Modules published to private Azure Artifacts feeds expect the user's certificate store. As soon as you put the worker inside Docker or WSL, all of that breaks, and you end up rebuilding auth shims that fight Microsoft's stack instead of using it.

Windmill runs the worker as a native Windows service, executing PowerShell, C# and SQL directly on the host. Active Directory, Kerberos, NTLM, certificate-bound credentials, GPO-managed services and private feeds all keep working, because nothing intercepts them. Server-side, Windmill stays exactly the same: one orchestrator, one queue, one observability surface, with mixed Windows and Linux workers picking up jobs by tag.

Built for the Microsoft stack

PowerShell, C#, SQL Server, Teams and Entra ID as first-class primitives. Learn more about Windows workers.

Native Windows workers

Enterprise

Install the Windmill worker via sc.exe or NSSM. Jobs run as native Windows processes with full access to domain credentials, Kerberos tickets, private module feeds and the local certificate store. No Docker, no WSL, no auth shims. Requires a Self-Hosted Enterprise license.

Learn more about workers
PS C:\windmill
> sc.exe create windmill-worker binPath= "C:\windmill\windmill-ee.exe" `
    DisplayName= "Windmill Worker" `
    start= auto `
    obj= "CORP\svc-windmill" password= ********
[SC] CreateService SUCCESS

> sc.exe start windmill-worker
SERVICE_NAME: windmill-worker
        STATE              : 4  RUNNING
        WIN32_EXIT_CODE    : 0  (0x0)

PowerShell as a first-class language

Write scripts with [CmdletBinding()], typed parameters and common parameters (Verbose, Debug, ErrorAction). Windmill auto-generates the input form, runs the script and captures the output object stream. Import modules from PSGallery or private Azure Artifacts feeds the way PowerShell expects.

Learn more about scripts

MSSQL with Kerberos

Resources hold a host, database and Kerberos config. No service-account passwords are stored in Windmill. Query SQL Server, run stored procedures and stream results into the rest of your flow with parameterized queries.

Learn more about MSSQL integration
mssql-kerberos.ps1
# Resource: mssql/prod-finance
#   host:     sql-prod.corp.local
#   database: Finance
#   auth:     kerberos    # uses the worker's domain identity

Invoke-Sqlcmd -ServerInstance $r.host `
    -Database $r.database `
    -Query "SELECT TOP 10 invoice_id, amount
            FROM dbo.invoices
            WHERE status = @status" `
    -Variable @{ status = "PENDING" }

C# / .NET 9 scripts

Author scripts in C# with full async/await, NuGet dependency management and typed inputs. Use the same Azure SDKs your team already runs in production for Blob Storage, Service Bus or Graph API calls. Compiled and cached on the worker, with per-script lockfiles to keep runs reproducible.

Learn more about C# scripts
azure-blob-upload.cs
// nuget: [email protected]
using Azure.Storage.Blobs;
using Azure.Identity;

public async Task<string> main(string container, string blob) {
    var cred = new DefaultAzureCredential();
    var client = new BlobClient(
        "https://storage.corp.local/",
        cred);
    await client.UploadAsync(blob);
    return $"uploaded {blob}";
}

AI agents on Windows infrastructure

A Windmill AI agent running on the same domain-joined host can query Active Directory, restart a Windows service, pull a row from SQL Server and post the result to Teams in a single run, with every action audited.

Learn more about AI agents

Teams approvals and alerts

Approval cards carry input fields and Resume/Cancel buttons. Route success and failure alerts to channels with the same resource your scripts already use. Pairs with Entra ID SSO so approvers are real domain users, not service accounts.

Learn more about Teams integration
Microsoft Teams interactive approval card from a Windmill flow

Windows and Linux workers in the same Windmill instance

Tag a script windows and it runs on a domain-joined Windows host. Tag it linux and it runs in your existing container fleet. The same flow can step from a PowerShell AD lookup, into a Python data transform on Linux, into a Teams approval, with one queue, one set of resources and one audit trail.

Learn more about worker groups
windows tag
  • · PowerShell + AD
  • · MSSQL Kerberos
  • · C#/.NET 9
  • · Windows services (sc.exe)
linux tag
  • · Python data jobs
  • · TypeScript / Deno
  • · Bash + cron
  • · Containerized tooling

How Windmill compares on Windows

Most Windows automation tools come from one of three eras: built-in (Task Scheduler), low-code RPA (Power Automate Desktop), or legacy enterprise schedulers (JAMS, ActiveBatch, Stonebranch). Windmill is the developer-first option that covers what each of them does, while staying open source and code-first.

CapabilityWindmillWindmillPower AutomateTask SchedulerJAMS / ActiveBatchAnsible (Win)
Runs natively on Windows (no Docker / WSL)Partial
Domain auth (Kerberos, AD groups)Partial
PowerShell as a first-class languagePartialPartial
C# / .NET scriptsPartialPartial
MSSQL with Windows Integrated AuthPartialPartialPartial
Visual flow editor with approvalsPartial
Code-first authoring + Git syncPartial
Self-hosted
Open source
Centralized observability across hostsPartialPartial
Mix Windows and Linux workers in one fleet
AI agents calling Windows scripts as toolsPartial

"Partial" means the capability exists with significant constraints (extra licensing, third-party module, or limited surface).

Frequently asked questions

Bring Windows servers under one orchestrator

Install the worker as a Windows service, point it at your Windmill instance, run the first PowerShell script in minutes.