Intermediate System & Host

Windows Hardening — GPO, UAC, AppLocker, and unnecessary services

Windows is the most common target in corporate environments. A default configuration exposes services, allows unrestricted program execution, and facilitates privilege escalation. Hardening reduces that risk without sacrificing usability.

Group Policy Object (GPO)

GPO lets you push security settings across the network through Active Directory — or locally via gpedit.msc.

Critical settings:

Computer Configuration > Policies > Windows Settings > Security Settings:

- Password Policy:
    Minimum length: 12 characters
    History: 10 passwords
    Maximum age: 90 days

- Account Lockout Policy:
    Threshold: 5 attempts
    Duration: 15 minutes

- Audit Policy:
    Account Logon: Success and Failure
    Object Access: Failure
    Privilege Use: Failure

UAC — User Account Control

UAC prevents processes from silently elevating privileges. Set it to the highest level that does not disrupt workflows:

Control Panel > User Accounts > Change User Account Control settings
  → "Always notify"

Equivalent GPO:
Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options
  → User Account Control: Behavior of the elevation prompt for administrators
     Value: Prompt for credentials on the secure desktop

Never disable UAC on workstations. Evaluate case by case on servers.

AppLocker — execution control

AppLocker defines which executables, scripts, and DLLs are allowed to run:

GPO: Computer Configuration > Windows Settings > Security Settings > Application Control Policies > AppLocker

Example rule (Whitelist mode):
  Type: Executable
  Action: Allow
  Condition: Path = %PROGRAMFILES%\*
  Exception: block C:\Temp\*, C:\Users\*\Downloads\*

Enable the Application Identity service for AppLocker to work:

Set-Service -Name AppIDSvc -StartupType Automatic
Start-Service AppIDSvc

Unnecessary services — reduce the surface

Disable services that are not used in your environment:

# List running services
Get-Service | Where-Object { $_.Status -eq 'Running' } | Select-Object Name, DisplayName

# Disable common unnecessary services
$unneeded = @('Fax','XblGameSave','XboxNetApiSvc','RemoteRegistry','Telnet')
foreach ($svc in $unneeded) {
    Set-Service -Name $svc -StartupType Disabled -ErrorAction SilentlyContinue
    Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
}

Windows Firewall

# Enable on all profiles
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True

# Block inbound by default
Set-NetFirewallProfile -DefaultInboundAction Block -DefaultOutboundAction Allow

# Allow only what is needed
New-NetFirewallRule -DisplayName "Allow RDP" -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Allow

Quick checklist

  • Windows Update enabled and automatic
  • SMBv1 disabled (Set-SmbServerConfiguration -EnableSMB1Protocol $false)
  • PowerShell running in Constrained Language Mode
  • LAPS deployed for local admin passwords
  • Defender real-time protection active
  • Credential Guard enabled (Windows 10/11 Enterprise)