The Windows Desktop Optimization Tool (WDOT) is a comprehensive PowerShell-based solution designed to optimize Windows devices for Virtual Desktop Infrastructure (VDI), Azure Virtual Desktop (AVD), and standalone machines. This tool automates the application of numerous optimization settings to improve performance, reduce resource consumption, and enhance user experience across various Windows environments.
- 🎯 Targeted Optimizations: Apply specific optimizations for services, applications, scheduled tasks, and system settings
- 🔧 Configuration-Based: Use customizable JSON configuration files for different environments
- 🛡️ Safe Defaults: Conservative settings that can be customized per environment
- 📊 Comprehensive Logging: Built-in Windows Event Log integration for monitoring and troubleshooting
- 🔄 Modular Design: Choose which optimization categories to apply
- 🎛️ Interactive Configuration: User-friendly tools for customizing optimization settings
The WDOT consists of three main components:
The primary optimization engine that applies performance and resource optimizations based on configuration profiles.
- New-WVDConfigurationFiles.ps1: Creates new configuration profiles from templates
- Set-WVDConfigurations.ps1: Interactive tool for customizing configuration settings
Modular PowerShell functions in the Functions/ directory that handle specific optimization categories.
- Windows 10/11 or Windows Server 2019/2022/2025
- PowerShell 5.1 or higher
- Administrator privileges (required for system-level optimizations)
- Execution Policy: Set to allow script execution
-
Clone or Download the Repository
git clone https://github.com/The-Virtual-Desktop-Team/Windows-Desktop-Optimization-Tool.git cd Windows-Desktop-Optimization-Tool
-
Set PowerShell Execution Policy
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
-
Verify Installation
# Check available configuration profiles Get-ChildItem .\Configurations -Directory | Select-Object Name
-
Create a Configuration Profile
.\New-WVDConfigurationFiles.ps1 -FolderName "MyEnvironment"
-
Customize Your Configuration (Optional)
.\Set-WVDConfigurations.ps1 -ConfigurationFile "Services" -ConfigFolderName "MyEnvironment"
-
Apply Optimizations
.\Windows_Optimization.ps1 -ConfigProfile "MyEnvironment" -Optimizations All -AcceptEULA
VDI/AVD Environment:
# Create and configure for VDI
.\New-WVDConfigurationFiles.ps1 -FolderName "Production-VDI"
.\Set-WVDConfigurations.ps1 -ConfigurationFile "Services" -ConfigFolderName "Production-VDI" -ApplyAll
# Apply aggressive optimizations
.\Windows_Optimization.ps1 -ConfigProfile "Production-VDI" -Optimizations All -AcceptEULADevelopment Workstation:
# Create conservative configuration
.\New-WVDConfigurationFiles.ps1 -FolderName "Development"
.\Set-WVDConfigurations.ps1 -ConfigurationFile "Services" -ConfigFolderName "Development" -SkipAll
# Apply selective optimizations
.\Windows_Optimization.ps1 -ConfigProfile "Development" -Optimizations @("DiskCleanup", "NetworkOptimizations") -AcceptEULAThe core optimization script that applies various performance and resource optimizations to Windows systems.
| Parameter | Type | Description | Default |
|---|---|---|---|
ConfigProfile |
String | [Required] Name of configuration profile to use | None |
WindowsVersion |
String | [Being Deprecated] This parameter is deprecated and will be removed in a future release. Use -ConfigProfile instead. | None |
Optimizations |
String[] | Optimization categories to apply | None |
AdvancedOptimizations |
String[] | Advanced/aggressive optimizations | None |
AcceptEULA |
Switch | Accept EULA without prompting | False |
Restart |
Switch | Automatically restart after completion | False |
| Category | Description | Impact |
|---|---|---|
All |
Apply all standard optimizations | High |
Services |
Disable unnecessary Windows services | High |
AppxPackages |
Remove unwanted Microsoft Store apps | Medium |
ScheduledTasks |
Disable unnecessary scheduled tasks | Medium |
DefaultUserSettings |
Optimize default user profile settings | Low |
LocalPolicy |
Apply local group policy optimizations | Medium |
Autologgers |
Disable Windows diagnostic logging | Low |
NetworkOptimizations |
Optimize network settings (SMB, etc.) | Medium |
DiskCleanup |
Clean temporary files and caches | Low |
WindowsMediaPlayer |
Remove Windows Media Player | Low |
| Category | Description | Impact | Warning |
|---|---|---|---|
All |
Apply all advanced optimizations | High | |
Edge |
Optimize Microsoft Edge settings | Medium | |
RemoveLegacyIE |
Remove Internet Explorer | High | |
RemoveOneDrive |
Remove OneDrive integration | High |
Apply All Standard Optimizations:
.\Windows_Optimization.ps1 -ConfigProfile "Windows11_24H2" -Optimizations All -AcceptEULASelective Optimization:
.\Windows_Optimization.ps1 -ConfigProfile "MyConfig" -Optimizations @("Services", "AppxPackages", "DiskCleanup") -AcceptEULAVDI-Focused Optimization:
.\Windows_Optimization.ps1 -ConfigProfile "VDI-Production" -Optimizations @("Services", "AppxPackages", "ScheduledTasks", "NetworkOptimizations") -AdvancedOptimizations @("Edge", "RemoveLegacyIE") -AcceptEULA -RestartConservative Optimization:
.\Windows_Optimization.ps1 -ConfigProfile "Conservative" -Optimizations @("DiskCleanup", "NetworkOptimizations") -AcceptEULAUse New-WVDConfigurationFiles.ps1 to create new configuration profiles:
.\New-WVDConfigurationFiles.ps1 -FolderName "MyCustomConfig"This creates a new folder in Configurations/ with template files that can be customized.
Use Set-WVDConfigurations.ps1 for interactive configuration:
# Interactive configuration
.\Set-WVDConfigurations.ps1 -ConfigurationFile "Services" -ConfigFolderName "MyConfig"
# Apply all optimizations
.\Set-WVDConfigurations.ps1 -ConfigurationFile "AppxPackages" -ConfigFolderName "MyConfig" -ApplyAll
# Skip all optimizations (safe defaults)
.\Set-WVDConfigurations.ps1 -ConfigurationFile "ScheduledTasks" -ConfigFolderName "MyConfig" -SkipAll📖 For detailed configuration instructions, see: Configuration Files User Guide
Windows-Desktop-Optimization-Tool/
├── Windows_Optimization.ps1 # Main optimization script
├── New-WVDConfigurationFiles.ps1 # Configuration profile creator
├── Set-WVDConfigurations.ps1 # Interactive configuration tool
├── EULA.txt # End User License Agreement
├── Configuration Files User Guide.md # Detailed configuration guide
├── Configurations/ # Configuration profiles
│ ├── Templates/ # Default template files
│ │ ├── Services.json # Windows services configuration
│ │ ├── AppxPackages.json # Store apps configuration
│ │ ├── ScheduledTasks.json # Scheduled tasks configuration
│ │ ├── DefaultUserSettings.json # User profile settings
│ │ ├── PolicyRegSettings.json # Group policy settings
│ │ ├── EdgeSettings.json # Microsoft Edge settings
│ │ ├── Autologgers.Json # Diagnostic logging settings
│ │ ├── LanManWorkstation.json # Network optimization settings
│ │ └── DefaultAssociationsConfiguration.xml # File associations
│ └── [Custom Profiles]/ # User-created configuration profiles
├── Functions/ # Optimization function modules
└── Images/ # Project icons and images
Each configuration profile contains JSON files that control optimization behavior:
| File | Purpose | Items | OptimizationState Values |
|---|---|---|---|
Services.json |
Windows services to disable/enable | ~45 services | Apply / Skip |
AppxPackages.json |
Store apps to remove/keep | ~80 packages | Apply / Skip |
ScheduledTasks.json |
Scheduled tasks to disable | ~30 tasks | Apply / Skip |
DefaultUserSettings.json |
User profile registry settings | ~20 settings | Apply / Skip |
PolicyRegSettings.json |
Local policy registry settings | ~15 policies | Apply / Skip |
EdgeSettings.json |
Microsoft Edge optimizations | ~10 settings | Apply / Skip |
Autologgers.Json |
Diagnostic logging services | ~15 loggers | Apply / Skip |
LanManWorkstation.json |
Network performance settings | ~5 settings | Apply / Skip |
Apply: The optimization will be applied during executionSkip: The optimization will be ignored (safe/conservative choice)
WDOT includes comprehensive logging capabilities:
- Log Name:
WDOT - Event Sources: Multiple sources for different optimization categories
- Event Types: Information, Warning, Error
- Log Size: 64KB with automatic rotation
# View recent WDOT events
Get-WinEvent -LogName "WDOT" -MaxEvents 50
# View specific optimization results
Get-WinEvent -LogName "WDOT" | Where-Object {$_.Id -eq 1}WDOT maintains execution tracking in the registry:
- Location:
HKLM:\SOFTWARE\WDOT - Values: Version, LastRunTime
- Purpose: Track optimization history and version compatibility
⚠️ WARNING: These optimizations modify system behavior. Always test in a non-production environment first.
- VDI/AVD: All optimizations suitable with proper testing
- Physical Workstations: Use conservative settings, avoid hardware-specific optimizations
- Server Environments: Carefully review service and application optimizations
- Development Machines: Use minimal optimizations to preserve development tools
- System Restore Point: Create before running optimizations
- Registry Backup: Export relevant registry keys
- Configuration Backup: Use
-CreateBackupflag withSet-WVDConfigurations.ps1
We welcome contributions to improve WDOT:
- Fork the repository
- Create a feature branch
- Test your changes thoroughly
- Submit a pull request with detailed description
- Follow PowerShell best practices
- Include proper error handling
- Add verbose logging for troubleshooting
- Test on multiple Windows versions
- Document new optimization categories
This project is provided under the Microsoft Sample Code License. See EULA.txt for complete terms.
Key Points:
- Provided "AS IS" for illustration purposes
- Not intended for production without testing
- No warranty or support guarantees
- User assumes all risks and responsibilities
- Check the Documentation: Review this README and the Configuration Files User Guide
- Review Event Logs: Check the WDOT Windows Event Log for detailed error information
- GitHub Issues: Search existing issues or create a new one
- Community Support: Engage with the community through GitHub Discussions
Common Issues:
- Execution Policy: Ensure PowerShell execution policy allows script execution
- Permissions: Run PowerShell as Administrator
- Configuration Not Found: Verify configuration profile exists in
Configurations/folder - Service Dependencies: Some services may have dependencies that prevent disabling
# Check execution policy
Get-ExecutionPolicy
# View available configurations
Get-ChildItem .\Configurations -Directory
# Test configuration file validity
Test-Json -Path ".\Configurations\MyConfig\Services.json"
# Check WDOT version and last run
Get-ItemProperty "HKLM:\SOFTWARE\WDOT"Authors: Robert M. Smith and Tim Muessig (Microsoft)
Project: Windows Desktop Optimization Tool
Last Updated: October 2025