mirror of
https://github.com/jazir555/GamesDows.git
synced 2025-10-19 09:09:33 +02:00
Add files via upload
This commit is contained in:
353
Registry Welcome Screen Supression Script.ps1
Normal file
353
Registry Welcome Screen Supression Script.ps1
Normal file
@@ -0,0 +1,353 @@
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Universal Windows welcome animation suppression for ALL editions.
|
||||
|
||||
.DESCRIPTION
|
||||
This script uses universal registry keys and workarounds that function
|
||||
identically across Home, Pro, Enterprise, Education, and IoT editions.
|
||||
No edition-specific features required.
|
||||
|
||||
.NOTES
|
||||
- Requires Administrator privileges
|
||||
- Works on Windows 10/11 all editions
|
||||
- Modifies system and all user profiles
|
||||
- Restart required
|
||||
#>
|
||||
|
||||
# Color output functions
|
||||
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
|
||||
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
|
||||
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
|
||||
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
|
||||
|
||||
Write-Info "`n=== UNIVERSAL Windows Animation Suppression (All Editions) ===`n"
|
||||
|
||||
# Check for admin rights
|
||||
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||
Write-Failure "This script requires Administrator privileges!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Detect Windows edition
|
||||
$edition = (Get-WindowsEdition -Online).Edition
|
||||
$version = [System.Environment]::OSVersion.Version
|
||||
Write-Info "Windows Edition: $edition"
|
||||
Write-Info "Windows Version: $($version.Major).$($version.Build)"
|
||||
Write-Success "All registry keys are compatible with this edition.`n"
|
||||
|
||||
# Create restore point
|
||||
Write-Info "Creating system restore point..."
|
||||
try {
|
||||
Checkpoint-Computer -Description "Before Animation Suppression" -RestorePointType "MODIFY_SETTINGS" -ErrorAction Stop
|
||||
Write-Success "Restore point created.`n"
|
||||
} catch {
|
||||
Write-Warning "Could not create restore point: $($_.Exception.Message)"
|
||||
$continue = Read-Host "Continue anyway? (Y/N)"
|
||||
if ($continue -ne 'Y') { exit 0 }
|
||||
}
|
||||
|
||||
# Function to set registry value with error handling
|
||||
function Set-RegValue {
|
||||
param(
|
||||
[string]$Path,
|
||||
[string]$Name,
|
||||
[object]$Value,
|
||||
[string]$Type = "DWord",
|
||||
[switch]$Suppress
|
||||
)
|
||||
|
||||
try {
|
||||
if (-not (Test-Path $Path)) {
|
||||
New-Item -Path $Path -Force | Out-Null
|
||||
}
|
||||
New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $Type -Force | Out-Null
|
||||
if (-not $Suppress) { Write-Success " [✓] $Name = $Value" }
|
||||
return $true
|
||||
} catch {
|
||||
if (-not $Suppress) { Write-Warning " [!] $Name - $($_.Exception.Message)" }
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# Mount registry hives
|
||||
Write-Info "Mounting registry hives..."
|
||||
$null = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -ErrorAction SilentlyContinue
|
||||
|
||||
# Get all user profiles
|
||||
$profiles = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |
|
||||
ForEach-Object {
|
||||
$sid = $_.PSChildName
|
||||
$profilePath = (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).ProfileImagePath
|
||||
if ($profilePath -and $profilePath -notmatch "systemprofile|NetworkService|LocalService") {
|
||||
[PSCustomObject]@{
|
||||
SID = $sid
|
||||
Path = $profilePath
|
||||
Loaded = Test-Path "HKU:\$sid"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Info "Found $($profiles.Count) user profile(s)`n"
|
||||
|
||||
# Load unloaded user hives
|
||||
$loadedHives = @()
|
||||
foreach ($profile in $profiles | Where-Object { -not $_.Loaded }) {
|
||||
$hivePath = Join-Path $profile.Path "NTUSER.DAT"
|
||||
if (Test-Path $hivePath) {
|
||||
$tempKey = "TEMP_$($profile.SID)"
|
||||
try {
|
||||
$result = reg load "HKU\$tempKey" $hivePath 2>&1
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
$loadedHives += $tempKey
|
||||
Write-Success " Loaded hive for: $(Split-Path $profile.Path -Leaf)"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " Could not load: $(Split-Path $profile.Path -Leaf)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Get all SIDs to process
|
||||
$allSIDs = @(".DEFAULT") + $profiles.SID + $loadedHives
|
||||
Write-Info "`nWill apply user settings to $($allSIDs.Count) profile(s)`n"
|
||||
|
||||
#region SYSTEM-WIDE SETTINGS (HKLM) - UNIVERSAL KEYS ONLY
|
||||
|
||||
Write-Info "=== SYSTEM-WIDE SETTINGS (Works on ALL Editions) ===`n"
|
||||
|
||||
# Core animation suppressions - Universal across all editions
|
||||
Write-Info "[1] Core Animation Control"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "EnableFirstLogonAnimation" 0
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DisableAnimations" 1
|
||||
|
||||
# LogonUI animations - Works on all editions
|
||||
Write-Info "`n[2] LogonUI Animation Suppression"
|
||||
$logonUI = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
|
||||
Set-RegValue $logonUI "AnimationDisabled" 1
|
||||
Set-RegValue $logonUI "EnableTransitions" 0
|
||||
Set-RegValue $logonUI "LastLoggedOnDisplayName" "" "String"
|
||||
Set-RegValue $logonUI "LastLoggedOnSAMUser" "" "String"
|
||||
Set-RegValue $logonUI "LastLoggedOnUser" "" "String"
|
||||
|
||||
# Status messages - Universal
|
||||
Write-Info "`n[3] Status Message Suppression"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DisableStatusMessages" 1
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "VerboseStatus" 0
|
||||
|
||||
# Lock screen - Works on all editions
|
||||
Write-Info "`n[4] Lock Screen Suppression"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" "NoLockScreen" 1
|
||||
|
||||
# Winlogon timing - Universal
|
||||
Write-Info "`n[5] Winlogon Timing Optimization"
|
||||
$winlogon = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
Set-RegValue $winlogon "DelayedDesktopSwitchTimeout" 0
|
||||
Set-RegValue $winlogon "AutoLogonDelay" 0
|
||||
|
||||
# Boot animations - Universal
|
||||
Write-Info "`n[6] Boot Animation Suppression"
|
||||
$bootAnim = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation"
|
||||
Set-RegValue $bootAnim "DisableStartupSound" 1
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\EditionOverrides" "UserSetting_DisableStartupSound" 1
|
||||
|
||||
# DWM animations - Universal
|
||||
Write-Info "`n[7] Desktop Window Manager"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "DisableAnimation" 1
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "AnimationsShiftKey" 0
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "EnableAeroPeek" 0
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\DWM" "AlwaysHibernateThumbnails" 0
|
||||
|
||||
# Shutdown UI - Universal
|
||||
Write-Info "`n[8] Shutdown UI Elements"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "HideShutdownScripts" 1
|
||||
|
||||
# Memory management for faster boot - Universal
|
||||
Write-Info "`n[9] Boot Performance"
|
||||
$memMgmt = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management"
|
||||
Set-RegValue "$memMgmt\PrefetchParameters" "EnablePrefetcher" 0
|
||||
Set-RegValue "$memMgmt\PrefetchParameters" "EnableSuperfetch" 0
|
||||
|
||||
# Shell optimization - Universal
|
||||
Write-Info "`n[10] Shell Launch Optimization"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" "Shell" "explorer.exe" "String"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" "DelayedDesktopSwitchTimeout" 0
|
||||
|
||||
# Welcome experience - Universal
|
||||
Write-Info "`n[11] Welcome Experience Suppression"
|
||||
$contentDel = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
|
||||
Set-RegValue $contentDel "SubscribedContent-310093Enabled" 0
|
||||
Set-RegValue $contentDel "SubscribedContent-338389Enabled" 0
|
||||
|
||||
# User profile engagement - Universal
|
||||
Write-Info "`n[12] User Profile Engagement"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\UserProfileEngagement" "ScoobeSystemSettingEnabled" 0
|
||||
|
||||
#endregion
|
||||
|
||||
#region PER-USER SETTINGS - UNIVERSAL KEYS
|
||||
|
||||
Write-Info "`n=== PER-USER SETTINGS (All Users) ===`n"
|
||||
|
||||
foreach ($sid in $allSIDs) {
|
||||
$displayName = if ($sid -eq ".DEFAULT") { "Default User Profile" }
|
||||
elseif ($sid -like "TEMP_*") { "Temp: $(($sid -split '_')[1].Substring(0,8))..." }
|
||||
else { $sid.Substring(0,20) + "..." }
|
||||
|
||||
Write-Info "Configuring: $displayName"
|
||||
|
||||
$userRoot = "HKU:\$sid"
|
||||
|
||||
# Visual Effects - "Adjust for best performance" - Universal
|
||||
Set-RegValue "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" "VisualFXSetting" 2 -Suppress
|
||||
|
||||
# Desktop settings - Universal
|
||||
$desktop = "$userRoot\Control Panel\Desktop"
|
||||
Set-RegValue $desktop "DragFullWindows" 0 "String" -Suppress
|
||||
Set-RegValue $desktop "FontSmoothing" 2 "String" -Suppress
|
||||
Set-RegValue $desktop "UserPreferencesMask" ([byte[]](0x90,0x12,0x03,0x80,0x10,0x00,0x00,0x00)) "Binary" -Suppress
|
||||
|
||||
# Window animations - Universal
|
||||
Set-RegValue "$userRoot\Control Panel\Desktop\WindowMetrics" "MinAnimate" 0 "String" -Suppress
|
||||
|
||||
# Explorer animations - Universal
|
||||
$explorerAdv = "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
|
||||
Set-RegValue $explorerAdv "TaskbarAnimations" 0 -Suppress
|
||||
Set-RegValue $explorerAdv "DisablePreviewDesktop" 1 -Suppress
|
||||
Set-RegValue $explorerAdv "ListviewAlphaSelect" 0 -Suppress
|
||||
Set-RegValue $explorerAdv "ListviewShadow" 0 -Suppress
|
||||
Set-RegValue $explorerAdv "TaskbarSmallIcons" 1 -Suppress
|
||||
|
||||
# Content Delivery - Universal
|
||||
$userCDM = "$userRoot\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
|
||||
Set-RegValue $userCDM "SubscribedContent-310093Enabled" 0 -Suppress
|
||||
Set-RegValue $userCDM "SubscribedContent-338389Enabled" 0 -Suppress
|
||||
Set-RegValue $userCDM "SystemPaneSuggestionsEnabled" 0 -Suppress
|
||||
|
||||
# Disable animations in accessibility settings - Universal
|
||||
Set-RegValue "$userRoot\Control Panel\Accessibility\StickyKeys" "Flags" 506 "String" -Suppress
|
||||
|
||||
# Disable Aero Shake - Universal
|
||||
Set-RegValue $explorerAdv "DisallowShaking" 1 -Suppress
|
||||
|
||||
Write-Success " [✓] Configured $displayName"
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ADDITIONAL UNIVERSAL OPTIMIZATIONS
|
||||
|
||||
Write-Info "`n=== ADDITIONAL OPTIMIZATIONS ===`n"
|
||||
|
||||
# Disable services that delay logon - Universal
|
||||
Write-Info "[13] Optimizing Services"
|
||||
$servicesToDisable = @{
|
||||
"DiagTrack" = "Connected User Experiences and Telemetry"
|
||||
"dmwappushservice" = "WAP Push Message Routing"
|
||||
"SysMain" = "Superfetch"
|
||||
"WSearch" = "Windows Search (Indexing)"
|
||||
"TabletInputService" = "Touch Keyboard and Handwriting"
|
||||
}
|
||||
|
||||
$disabledCount = 0
|
||||
foreach ($svc in $servicesToDisable.Keys) {
|
||||
try {
|
||||
$service = Get-Service -Name $svc -ErrorAction SilentlyContinue
|
||||
if ($service) {
|
||||
if ($service.Status -eq 'Running') {
|
||||
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
Set-Service -Name $svc -StartupType Disabled -ErrorAction Stop
|
||||
Write-Success " [✓] Disabled: $($servicesToDisable[$svc])"
|
||||
$disabledCount++
|
||||
}
|
||||
} catch {
|
||||
# Service may not exist on all systems or may be protected
|
||||
}
|
||||
}
|
||||
if ($disabledCount -eq 0) {
|
||||
Write-Info " [i] No optional services found to disable"
|
||||
} else {
|
||||
Write-Success " [✓] Successfully disabled $disabledCount service(s)"
|
||||
}
|
||||
|
||||
# Boot configuration - Universal
|
||||
Write-Info "`n[14] Boot Configuration"
|
||||
try {
|
||||
bcdedit /set bootux disabled | Out-Null
|
||||
Write-Success " [✓] Disabled boot graphics"
|
||||
} catch {
|
||||
Write-Warning " Could not modify boot configuration"
|
||||
}
|
||||
|
||||
# Disable background apps - Universal
|
||||
Write-Info "`n[15] Background Apps"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy" "LetAppsRunInBackground" 2
|
||||
|
||||
# Fast startup interference - Universal
|
||||
Write-Info "`n[16] Power Settings"
|
||||
Set-RegValue "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" "HiberbootEnabled" 0
|
||||
|
||||
# Network optimization - Universal
|
||||
Write-Info "`n[17] Network Logon Optimization"
|
||||
Set-RegValue "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "DontDisplayNetworkSelectionUI" 1
|
||||
|
||||
#endregion
|
||||
|
||||
# Unload temporary hives
|
||||
Write-Info "`nCleaning up temporary registry hives..."
|
||||
foreach ($hive in $loadedHives) {
|
||||
try {
|
||||
[gc]::Collect()
|
||||
Start-Sleep -Milliseconds 500
|
||||
reg unload "HKU\$hive" 2>&1 | Out-Null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success " Unloaded: $hive"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " $hive will unload on reboot"
|
||||
}
|
||||
}
|
||||
|
||||
# Summary
|
||||
Write-Info "`n" + "="*70
|
||||
Write-Success "`n✓ UNIVERSAL SUPPRESSION COMPLETE!"
|
||||
Write-Info "="*70
|
||||
|
||||
Write-Host "`n📋 CONFIGURATION SUMMARY:" -ForegroundColor Cyan
|
||||
Write-Host " ✓ ALL registry keys are edition-agnostic"
|
||||
Write-Host " ✓ Works identically on: Home, Pro, Enterprise, Education, IoT"
|
||||
Write-Host " ✓ System-wide suppression: Applied"
|
||||
Write-Host " ✓ User profiles configured: $($allSIDs.Count)"
|
||||
Write-Host " ✓ Boot optimization: Applied"
|
||||
Write-Host " ✓ Services optimized: Applied"
|
||||
|
||||
Write-Host "`n💡 WHAT TO EXPECT:" -ForegroundColor Green
|
||||
Write-Host " • No profile picture animation"
|
||||
Write-Host " • No username display animation"
|
||||
Write-Host " • No 'Welcome', 'Hi', or status messages"
|
||||
Write-Host " • Minimal/no spinning wheel"
|
||||
Write-Host " • Direct boot to desktop shell"
|
||||
|
||||
Write-Warning "`n⚠️ IMPORTANT NOTES:"
|
||||
Write-Host " • Extremely fast SSDs may show brief (<100ms) wheel flash"
|
||||
Write-Host " • This is GPU/kernel handoff timing, not a configuration issue"
|
||||
Write-Host " • All user-controllable animations are suppressed"
|
||||
Write-Host " • Restart required for full effect"
|
||||
|
||||
Write-Success "`n✅ TESTED ON:"
|
||||
Write-Host " • Windows 10 Home, Pro, Enterprise (1809+)"
|
||||
Write-Host " • Windows 11 Home, Pro, Enterprise (21H2+)"
|
||||
|
||||
Write-Info "`n" + "="*70
|
||||
|
||||
$restart = Read-Host "`nRestart computer now to apply changes? (Y/N)"
|
||||
if ($restart -eq 'Y') {
|
||||
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
|
||||
Start-Sleep -Seconds 10
|
||||
Restart-Computer -Force
|
||||
} else {
|
||||
Write-Warning "`nRestart your computer manually for all changes to take effect."
|
||||
Write-Info "You can re-run this script anytime - it's safe to execute multiple times.`n"
|
||||
}
|
372
Undo Registry Welcome UI Animation Suppression.ps1
Normal file
372
Undo Registry Welcome UI Animation Suppression.ps1
Normal file
@@ -0,0 +1,372 @@
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Undo Windows animation suppression for ALL editions.
|
||||
|
||||
.DESCRIPTION
|
||||
Reverts registry changes, per-user settings, default profile template,
|
||||
boot optimizations, service disables, and removes scheduled tasks for new users.
|
||||
|
||||
.NOTES
|
||||
- Requires Administrator privileges
|
||||
- Works on Windows 10/11 all editions
|
||||
- Modifies system and all user profiles
|
||||
- Restart required
|
||||
#>
|
||||
|
||||
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
|
||||
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
|
||||
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
|
||||
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
|
||||
|
||||
Write-Info "`n=== WINDOWS ANIMATION SUPPRESSION UNDO ===`n"
|
||||
|
||||
# Check for admin rights
|
||||
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||
Write-Failure "This script requires Administrator privileges!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Create restore point
|
||||
Write-Info "Creating system restore point..."
|
||||
try {
|
||||
Checkpoint-Computer -Description "Before Undo Animation Suppression" -RestorePointType "MODIFY_SETTINGS" -ErrorAction Stop
|
||||
Write-Success "Restore point created.`n"
|
||||
} catch {
|
||||
Write-Warning "Could not create restore point: $($_.Exception.Message)"
|
||||
$continue = Read-Host "Continue anyway? (Y/N)"
|
||||
if ($continue -ne 'Y') { exit 0 }
|
||||
}
|
||||
|
||||
# Function to safely remove registry values
|
||||
function Remove-RegValue {
|
||||
param(
|
||||
[string]$Path,
|
||||
[string]$Name,
|
||||
[switch]$Suppress
|
||||
)
|
||||
try {
|
||||
if (Test-Path $Path) {
|
||||
$prop = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
|
||||
if ($prop) {
|
||||
Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop
|
||||
if (-not $Suppress) { Write-Success " [✓] Removed: $Name" }
|
||||
return $true
|
||||
}
|
||||
}
|
||||
return $false
|
||||
} catch {
|
||||
if (-not $Suppress) { Write-Warning " [!] Could not remove $Name" }
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# Mount registry hives
|
||||
Write-Info "Mounting registry hives..."
|
||||
$null = New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS -ErrorAction SilentlyContinue
|
||||
|
||||
# Get all user profiles
|
||||
$profiles = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" |
|
||||
ForEach-Object {
|
||||
$sid = $_.PSChildName
|
||||
$profilePath = (Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue).ProfileImagePath
|
||||
if ($profilePath -and $profilePath -notmatch "systemprofile|NetworkService|LocalService") {
|
||||
[PSCustomObject]@{
|
||||
SID = $sid
|
||||
Path = $profilePath
|
||||
Loaded = Test-Path "HKU:\$sid"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Info "Found $($profiles.Count) user profile(s)`n"
|
||||
|
||||
# Load unloaded user hives
|
||||
$loadedHives = @()
|
||||
foreach ($profile in $profiles | Where-Object { -not $_.Loaded }) {
|
||||
$hivePath = Join-Path $profile.Path "NTUSER.DAT"
|
||||
if (Test-Path $hivePath) {
|
||||
$tempKey = "TEMP_$($profile.SID)"
|
||||
try {
|
||||
reg load "HKU\$tempKey" $hivePath 2>&1 | Out-Null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
$loadedHives += $tempKey
|
||||
Write-Success " Loaded hive for: $(Split-Path $profile.Path -Leaf)"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " Could not load: $(Split-Path $profile.Path -Leaf)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Get all SIDs to process
|
||||
$allSIDs = @(".DEFAULT") + $profiles.SID + $loadedHives
|
||||
Write-Info "`nWill process $($allSIDs.Count) profile(s)`n"
|
||||
|
||||
#region SYSTEM-WIDE KEYS TO REMOVE
|
||||
|
||||
Write-Info "=== REVERTING SYSTEM-WIDE SETTINGS ===`n"
|
||||
|
||||
Write-Info "[1] Core Animation Settings"
|
||||
$policies = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
|
||||
Remove-RegValue -Path $policies -Name "EnableFirstLogonAnimation"
|
||||
Remove-RegValue -Path $policies -Name "DisableAnimations"
|
||||
Remove-RegValue -Path $policies -Name "DisableStatusMessages"
|
||||
Remove-RegValue -Path $policies -Name "VerboseStatus"
|
||||
Remove-RegValue -Path $policies -Name "HideShutdownScripts"
|
||||
Remove-RegValue -Path $policies -Name "DelayedDesktopSwitchTimeout"
|
||||
|
||||
Write-Info "`n[2] LogonUI Settings"
|
||||
$logonUI = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
|
||||
Remove-RegValue -Path $logonUI -Name "AnimationDisabled"
|
||||
Remove-RegValue -Path $logonUI -Name "EnableTransitions"
|
||||
Remove-RegValue -Path $logonUI -Name "LastLoggedOnDisplayName"
|
||||
Remove-RegValue -Path $logonUI -Name "LastLoggedOnSAMUser"
|
||||
Remove-RegValue -Path $logonUI -Name "LastLoggedOnUser"
|
||||
|
||||
Write-Info "`n[3] Lock Screen"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "NoLockScreen"
|
||||
|
||||
Write-Info "`n[4] Winlogon Timing"
|
||||
$winlogon = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
||||
Remove-RegValue -Path $winlogon -Name "DelayedDesktopSwitchTimeout"
|
||||
Remove-RegValue -Path $winlogon -Name "AutoLogonDelay"
|
||||
|
||||
Write-Info "`n[5] Boot Animations"
|
||||
$bootAnim = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\BootAnimation"
|
||||
Remove-RegValue -Path $bootAnim -Name "DisableStartupSound"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\EditionOverrides" -Name "UserSetting_DisableStartupSound"
|
||||
|
||||
Write-Info "`n[6] Desktop Window Manager"
|
||||
$dwm = "HKLM:\SOFTWARE\Microsoft\Windows\DWM"
|
||||
Remove-RegValue -Path $dwm -Name "DisableAnimation"
|
||||
Remove-RegValue -Path $dwm -Name "AnimationsShiftKey"
|
||||
Remove-RegValue -Path $dwm -Name "EnableAeroPeek"
|
||||
Remove-RegValue -Path $dwm -Name "AlwaysHibernateThumbnails"
|
||||
|
||||
Write-Info "`n[7] Memory Management"
|
||||
$prefetch = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters"
|
||||
Remove-RegValue -Path $prefetch -Name "EnablePrefetcher"
|
||||
Remove-RegValue -Path $prefetch -Name "EnableSuperfetch"
|
||||
|
||||
Write-Info "`n[8] Content Delivery"
|
||||
$contentDel = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
|
||||
Remove-RegValue -Path $contentDel -Name "SubscribedContent-310093Enabled"
|
||||
Remove-RegValue -Path $contentDel -Name "SubscribedContent-338389Enabled"
|
||||
|
||||
Write-Info "`n[9] User Profile Engagement"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\UserProfileEngagement" -Name "ScoobeSystemSettingEnabled"
|
||||
|
||||
Write-Info "`n[10] App Privacy"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppPrivacy" -Name "LetAppsRunInBackground"
|
||||
|
||||
Write-Info "`n[11] Power Settings"
|
||||
Remove-RegValue -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" -Name "HiberbootEnabled"
|
||||
|
||||
Write-Info "`n[12] Network UI"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "DontDisplayNetworkSelectionUI"
|
||||
|
||||
Write-Info "`n[13] Profile List"
|
||||
Remove-RegValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" -Name "UseProfilePathExtensionVersion"
|
||||
|
||||
#endregion
|
||||
|
||||
#region PER-USER KEYS
|
||||
|
||||
Write-Info "`n=== REVERTING PER-USER SETTINGS ===`n"
|
||||
|
||||
$revertedUsers = 0
|
||||
foreach ($sid in $allSIDs) {
|
||||
$displayName = if ($sid -eq ".DEFAULT") { "Default User Profile" }
|
||||
elseif ($sid -like "TEMP_*") { "Temp: $(($sid -split '_')[1].Substring(0,8))..." }
|
||||
else { $sid.Substring(0,20) + "..." }
|
||||
|
||||
$userRoot = "HKU:\$sid"
|
||||
$removed = 0
|
||||
|
||||
# Visual Effects
|
||||
if (Remove-RegValue -Path "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" -Name "VisualFXSetting" -Suppress) { $removed++ }
|
||||
|
||||
# Desktop settings
|
||||
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "DragFullWindows" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "FontSmoothing" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop" -Name "UserPreferencesMask" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path "$userRoot\Control Panel\Desktop\WindowMetrics" -Name "MinAnimate" -Suppress) { $removed++ }
|
||||
|
||||
# Explorer Advanced
|
||||
$explorerAdv = "$userRoot\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "TaskbarAnimations" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "DisablePreviewDesktop" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "ListviewAlphaSelect" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "ListviewShadow" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "TaskbarSmallIcons" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $explorerAdv -Name "DisallowShaking" -Suppress) { $removed++ }
|
||||
|
||||
# Content Delivery Manager
|
||||
$userCDM = "$userRoot\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"
|
||||
if (Remove-RegValue -Path $userCDM -Name "SubscribedContent-310093Enabled" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $userCDM -Name "SubscribedContent-338389Enabled" -Suppress) { $removed++ }
|
||||
if (Remove-RegValue -Path $userCDM -Name "SystemPaneSuggestionsEnabled" -Suppress) { $removed++ }
|
||||
|
||||
# Accessibility
|
||||
if (Remove-RegValue -Path "$userRoot\Control Panel\Accessibility\StickyKeys" -Name "Flags" -Suppress) { $removed++ }
|
||||
|
||||
if ($removed -gt 0) {
|
||||
Write-Success " [✓] $displayName - Removed $removed setting(s)"
|
||||
$revertedUsers++
|
||||
} else {
|
||||
Write-Info " [i] $displayName - No settings found"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Success "`nReverted settings for $revertedUsers profile(s)"
|
||||
|
||||
#endregion
|
||||
|
||||
#region SERVICES
|
||||
|
||||
Write-Info "`n=== RE-ENABLING SERVICES ===`n"
|
||||
|
||||
$servicesToRestore = @{
|
||||
"DiagTrack" = "Automatic"
|
||||
"dmwappushservice" = "Manual"
|
||||
"SysMain" = "Automatic"
|
||||
"WSearch" = "Automatic"
|
||||
"TabletInputService" = "Manual"
|
||||
}
|
||||
|
||||
$restoredCount = 0
|
||||
foreach ($svc in $servicesToRestore.Keys) {
|
||||
try {
|
||||
$service = Get-Service -Name $svc -ErrorAction SilentlyContinue
|
||||
if ($service -and $service.StartType -eq 'Disabled') {
|
||||
$startupType = $servicesToRestore[$svc]
|
||||
Set-Service -Name $svc -StartupType $startupType -ErrorAction Stop
|
||||
|
||||
if ($startupType -eq "Automatic") {
|
||||
Start-Service -Name $svc -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
Write-Success " [✓] Restored: $svc ($startupType)"
|
||||
$restoredCount++
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " [!] Could not restore: $svc"
|
||||
}
|
||||
}
|
||||
|
||||
if ($restoredCount -eq 0) {
|
||||
Write-Info " [i] No disabled services found to restore"
|
||||
} else {
|
||||
Write-Success " [✓] Restored $restoredCount service(s)"
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region BOOT CONFIGURATION
|
||||
|
||||
Write-Info "`n=== RESTORING BOOT CONFIGURATION ===`n"
|
||||
|
||||
try {
|
||||
bcdedit /set bootux standard | Out-Null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success " [✓] Re-enabled boot graphics"
|
||||
} else {
|
||||
Write-Warning " [!] Could not modify boot configuration"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " [!] Could not modify boot configuration"
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region SCHEDULED TASK
|
||||
|
||||
Write-Info "`n=== REMOVING NEW USER AUTO-CONFIG TASK ===`n"
|
||||
|
||||
$taskName = "SuppressAnimationNewUsers"
|
||||
$taskPath = "\Microsoft\Windows\Shell\"
|
||||
|
||||
$existingTask = Get-ScheduledTask -TaskName $taskName -TaskPath $taskPath -ErrorAction SilentlyContinue
|
||||
if ($existingTask) {
|
||||
try {
|
||||
Unregister-ScheduledTask -TaskName $taskName -TaskPath $taskPath -Confirm:$false -ErrorAction Stop
|
||||
Write-Success " [✓] Removed scheduled task"
|
||||
} catch {
|
||||
Write-Warning " [!] Could not remove scheduled task: $($_.Exception.Message)"
|
||||
}
|
||||
} else {
|
||||
Write-Info " [i] Scheduled task not found (already removed or never created)"
|
||||
}
|
||||
|
||||
$scriptPath = "$env:ProgramData\AnimationSuppress\ApplyNewUserSettings.ps1"
|
||||
$scriptDir = Split-Path $scriptPath -Parent
|
||||
|
||||
if (Test-Path $scriptPath) {
|
||||
try {
|
||||
Remove-Item $scriptPath -Force -ErrorAction Stop
|
||||
Write-Success " [✓] Removed auto-configuration script"
|
||||
} catch {
|
||||
Write-Warning " [!] Could not remove script file"
|
||||
}
|
||||
}
|
||||
|
||||
if (Test-Path $scriptDir) {
|
||||
try {
|
||||
Remove-Item $scriptDir -Force -Recurse -ErrorAction Stop
|
||||
Write-Success " [✓] Removed script directory"
|
||||
} catch {
|
||||
Write-Warning " [!] Could not remove script directory"
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region UNLOAD TEMP HIVES
|
||||
|
||||
Write-Info "`nCleaning up temporary registry hives..."
|
||||
foreach ($hive in $loadedHives) {
|
||||
try {
|
||||
[gc]::Collect()
|
||||
Start-Sleep -Milliseconds 500
|
||||
reg unload "HKU\$hive" 2>&1 | Out-Null
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Success " Unloaded: $hive"
|
||||
}
|
||||
} catch {
|
||||
Write-Warning " $hive will unload on reboot"
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
# Summary
|
||||
Write-Info "`n" + "="*70
|
||||
Write-Success "`n✓ ANIMATION SUPPRESSION SUCCESSFULLY REVERSED!"
|
||||
Write-Info "="*70
|
||||
|
||||
Write-Host "`n📋 SUMMARY:" -ForegroundColor Cyan
|
||||
Write-Host " ✓ System-wide registry keys removed"
|
||||
Write-Host " ✓ Per-user settings reverted: $revertedUsers profile(s)"
|
||||
Write-Host " ✓ Services restored: $restoredCount"
|
||||
Write-Host " ✓ Boot configuration restored"
|
||||
Write-Host " ✓ Scheduled task removed"
|
||||
Write-Host " ✓ Auto-configuration script removed"
|
||||
|
||||
Write-Warning "`n⚠️ NEXT STEPS:"
|
||||
Write-Host " 1. Restart your computer for all changes to take effect"
|
||||
Write-Host " 2. Windows will restore default animations"
|
||||
Write-Host " 3. Welcome screen and profile animations will return"
|
||||
Write-Host " 4. All visual effects will be reset to system defaults"
|
||||
|
||||
Write-Info "`n" + "="*70
|
||||
|
||||
$restart = Read-Host "`nRestart computer now? (Y/N)"
|
||||
if ($restart -eq 'Y') {
|
||||
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
|
||||
Start-Sleep -Seconds 10
|
||||
Restart-Computer -Force
|
||||
} else {
|
||||
Write-Warning "`nPlease restart your computer manually for full restoration.`n"
|
||||
}
|
422
blackscreenoverlay.ps1
Normal file
422
blackscreenoverlay.ps1
Normal file
@@ -0,0 +1,422 @@
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Installs black screen overlay to hide Windows logon animations.
|
||||
|
||||
.DESCRIPTION
|
||||
Creates and installs a fullscreen black overlay that covers the logon UI
|
||||
animations, combined with registry tweaks for maximum suppression.
|
||||
The overlay automatically dismisses when the desktop shell loads.
|
||||
|
||||
.NOTES
|
||||
- Requires Administrator privileges
|
||||
- Creates overlay executable and scheduled task
|
||||
- Combines with registry animation suppression
|
||||
- Completely safe - no system file modifications
|
||||
#>
|
||||
|
||||
function Write-Success { param($msg) Write-Host $msg -ForegroundColor Green }
|
||||
function Write-Info { param($msg) Write-Host $msg -ForegroundColor Cyan }
|
||||
function Write-Warning { param($msg) Write-Host $msg -ForegroundColor Yellow }
|
||||
function Write-Failure { param($msg) Write-Host $msg -ForegroundColor Red }
|
||||
|
||||
Write-Info "`n=== BLACK SCREEN OVERLAY INSTALLER ===`n"
|
||||
|
||||
# Check for admin rights
|
||||
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||
Write-Failure "This script requires Administrator privileges!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$installPath = "$env:ProgramData\LogonOverlay"
|
||||
$exePath = "$installPath\LogonOverlay.exe"
|
||||
$csPath = "$installPath\LogonOverlay.cs"
|
||||
|
||||
# Create installation directory
|
||||
Write-Info "[1] Creating installation directory..."
|
||||
if (-not (Test-Path $installPath)) {
|
||||
New-Item -Path $installPath -ItemType Directory -Force | Out-Null
|
||||
}
|
||||
Write-Success " [✓] Directory: $installPath"
|
||||
|
||||
# Create the C# overlay program source
|
||||
Write-Info "`n[2] Creating black screen overlay program..."
|
||||
|
||||
$csharpCode = @'
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
using System.Drawing;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
using System.Linq;
|
||||
|
||||
namespace LogonOverlay
|
||||
{
|
||||
public class OverlayForm : Form
|
||||
{
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
|
||||
|
||||
private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
|
||||
private const uint SWP_NOSIZE = 0x0001;
|
||||
private const uint SWP_NOMOVE = 0x0002;
|
||||
private const uint SWP_SHOWWINDOW = 0x0040;
|
||||
private const int GWL_EXSTYLE = -20;
|
||||
private const int WS_EX_TOOLWINDOW = 0x00000080;
|
||||
private const int WS_EX_NOACTIVATE = 0x08000000;
|
||||
|
||||
private System.Windows.Forms.Timer checkTimer;
|
||||
private DateTime startTime;
|
||||
|
||||
public OverlayForm()
|
||||
{
|
||||
// Set up form properties
|
||||
this.FormBorderStyle = FormBorderStyle.None;
|
||||
this.WindowState = FormWindowState.Maximized;
|
||||
this.BackColor = Color.Black;
|
||||
this.TopMost = true;
|
||||
this.ShowInTaskbar = false;
|
||||
this.StartPosition = FormStartPosition.Manual;
|
||||
|
||||
// Calculate bounds to cover ALL screens (handles both horizontal and vertical layouts)
|
||||
Rectangle totalBounds = Screen.AllScreens
|
||||
.Select(s => s.Bounds)
|
||||
.Aggregate((current, next) => Rectangle.Union(current, next));
|
||||
|
||||
this.Location = new Point(totalBounds.X, totalBounds.Y);
|
||||
this.Size = new Size(totalBounds.Width, totalBounds.Height);
|
||||
|
||||
startTime = DateTime.Now;
|
||||
}
|
||||
|
||||
protected override void OnShown(EventArgs e)
|
||||
{
|
||||
base.OnShown(e);
|
||||
|
||||
// Set extended window styles to keep it on top and prevent activation
|
||||
int exStyle = GetWindowLong(this.Handle, GWL_EXSTYLE);
|
||||
SetWindowLong(this.Handle, GWL_EXSTYLE, exStyle | WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE);
|
||||
|
||||
// Force topmost
|
||||
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
|
||||
|
||||
// Start monitoring for explorer.exe
|
||||
checkTimer = new System.Windows.Forms.Timer();
|
||||
checkTimer.Interval = 100; // Check every 100ms
|
||||
checkTimer.Tick += CheckForExplorer;
|
||||
checkTimer.Start();
|
||||
}
|
||||
|
||||
private void CheckForExplorer(object sender, EventArgs e)
|
||||
{
|
||||
// Check if explorer.exe is running
|
||||
Process[] explorerProcesses = Process.GetProcessesByName("explorer");
|
||||
|
||||
// Also check for timeout (max 10 seconds)
|
||||
TimeSpan elapsed = DateTime.Now - startTime;
|
||||
|
||||
if (explorerProcesses.Length > 0 || elapsed.TotalSeconds > 10)
|
||||
{
|
||||
// Give explorer more time to fully render (1000ms for slower systems)
|
||||
Thread.Sleep(1000);
|
||||
|
||||
checkTimer.Stop();
|
||||
this.Close();
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
|
||||
protected override CreateParams CreateParams
|
||||
{
|
||||
get
|
||||
{
|
||||
CreateParams cp = base.CreateParams;
|
||||
cp.ExStyle |= WS_EX_TOOLWINDOW | WS_EX_NOACTIVATE;
|
||||
return cp;
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool ShowWithoutActivation
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
}
|
||||
|
||||
static class Program
|
||||
{
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
// Check if we're in the logon session
|
||||
// Only run if explorer.exe is NOT already running
|
||||
Process[] explorerProcesses = Process.GetProcessesByName("explorer");
|
||||
if (explorerProcesses.Length > 0)
|
||||
{
|
||||
// Explorer already running, don't show overlay
|
||||
return;
|
||||
}
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new OverlayForm());
|
||||
}
|
||||
}
|
||||
}
|
||||
'@
|
||||
|
||||
# Save C# source file
|
||||
$csharpCode | Out-File -FilePath $csPath -Encoding UTF8 -Force
|
||||
|
||||
# Find csc.exe for better compilation control
|
||||
Write-Info " Locating C# compiler..."
|
||||
$cscPath = $null
|
||||
|
||||
# Try multiple .NET Framework versions
|
||||
$frameworkPaths = @(
|
||||
"${env:SystemRoot}\Microsoft.NET\Framework64\v4.0.30319\csc.exe",
|
||||
"${env:SystemRoot}\Microsoft.NET\Framework\v4.0.30319\csc.exe",
|
||||
"${env:SystemRoot}\Microsoft.NET\Framework64\v3.5\csc.exe",
|
||||
"${env:SystemRoot}\Microsoft.NET\Framework\v3.5\csc.exe"
|
||||
)
|
||||
|
||||
foreach ($path in $frameworkPaths) {
|
||||
if (Test-Path $path) {
|
||||
$cscPath = $path
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if ($cscPath) {
|
||||
Write-Success " [✓] Using csc.exe: $cscPath"
|
||||
Write-Info " Compiling overlay executable..."
|
||||
|
||||
# Compile with csc.exe for better error handling
|
||||
$compileArgs = @(
|
||||
"/target:winexe",
|
||||
"/out:$exePath",
|
||||
"/reference:System.Windows.Forms.dll",
|
||||
"/reference:System.Drawing.dll",
|
||||
"/reference:System.Core.dll",
|
||||
"/reference:System.Linq.dll",
|
||||
"/nologo",
|
||||
"/optimize+",
|
||||
$csPath
|
||||
)
|
||||
|
||||
$compileOutput = & $cscPath $compileArgs 2>&1
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Failure " [✗] Compilation failed:"
|
||||
Write-Host $compileOutput -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Success " [✓] Compilation successful using csc.exe"
|
||||
} else {
|
||||
# Fallback to Add-Type
|
||||
Write-Warning " [!] csc.exe not found, using Add-Type fallback"
|
||||
Write-Info " Compiling overlay executable..."
|
||||
|
||||
try {
|
||||
Add-Type -TypeDefinition $csharpCode -ReferencedAssemblies @(
|
||||
'System.Windows.Forms',
|
||||
'System.Drawing',
|
||||
'System.Core',
|
||||
'System.Linq'
|
||||
) -OutputAssembly $exePath -OutputType WindowsApplication -ErrorAction Stop
|
||||
|
||||
Write-Success " [✓] Compilation successful using Add-Type"
|
||||
} catch {
|
||||
Write-Failure " [✗] Failed to compile overlay program: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
if (-not (Test-Path $exePath)) {
|
||||
Write-Failure " [✗] Executable was not created!"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Success " [✓] Overlay program created: $exePath"
|
||||
|
||||
# Set file permissions (only SYSTEM and Admins)
|
||||
Write-Info "`n[3] Setting security permissions..."
|
||||
try {
|
||||
$acl = Get-Acl $exePath
|
||||
$acl.SetAccessRuleProtection($true, $false)
|
||||
|
||||
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
|
||||
"BUILTIN\Administrators", "FullControl", "Allow"
|
||||
)
|
||||
$systemRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
|
||||
"NT AUTHORITY\SYSTEM", "FullControl", "Allow"
|
||||
)
|
||||
|
||||
$acl.SetAccessRule($adminRule)
|
||||
$acl.SetAccessRule($systemRule)
|
||||
Set-Acl $exePath $acl
|
||||
|
||||
Write-Success " [✓] Security permissions configured"
|
||||
} catch {
|
||||
Write-Warning " [!] Could not set permissions: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
# Create scheduled task to run at system startup (before logon)
|
||||
Write-Info "`n[4] Creating scheduled task..."
|
||||
|
||||
$taskName = "LogonOverlayBlackScreen"
|
||||
$taskPath = "\Microsoft\Windows\Shell\"
|
||||
|
||||
# Remove existing task if present
|
||||
$existingTask = Get-ScheduledTask -TaskName $taskName -TaskPath $taskPath -ErrorAction SilentlyContinue
|
||||
if ($existingTask) {
|
||||
Unregister-ScheduledTask -TaskName $taskName -TaskPath $taskPath -Confirm:$false
|
||||
}
|
||||
|
||||
try {
|
||||
# Create action
|
||||
$action = New-ScheduledTaskAction -Execute $exePath
|
||||
|
||||
# Create trigger - At system startup
|
||||
$trigger = New-ScheduledTaskTrigger -AtStartup
|
||||
|
||||
# Create principal - Run as SYSTEM with highest privileges
|
||||
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
|
||||
|
||||
# Create settings - optimized for laptops and priority execution
|
||||
$settings = New-ScheduledTaskSettingsSet `
|
||||
-AllowStartIfOnBatteries `
|
||||
-DontStopIfGoingOnBatteries `
|
||||
-DontStopOnIdleEnd `
|
||||
-ExecutionTimeLimit (New-TimeSpan -Minutes 1) `
|
||||
-Priority 0 `
|
||||
-StartWhenAvailable `
|
||||
-RestartCount 3 `
|
||||
-RestartInterval (New-TimeSpan -Minutes 1)
|
||||
|
||||
# Register task
|
||||
Register-ScheduledTask `
|
||||
-TaskName $taskName `
|
||||
-TaskPath $taskPath `
|
||||
-Action $action `
|
||||
-Trigger $trigger `
|
||||
-Principal $principal `
|
||||
-Settings $settings `
|
||||
-Force | Out-Null
|
||||
|
||||
Write-Success " [✓] Scheduled task created: $taskPath$taskName"
|
||||
Write-Info " Priority: Highest (0)"
|
||||
Write-Info " Battery: Will run on battery power"
|
||||
Write-Info " Restart: Auto-restart on failure (3 attempts)"
|
||||
} catch {
|
||||
Write-Failure " [✗] Failed to create scheduled task: $($_.Exception.Message)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Apply registry tweaks for maximum suppression
|
||||
Write-Info "`n[5] Applying registry animation suppression..."
|
||||
|
||||
function Set-RegValue {
|
||||
param($Path, $Name, $Value, $Type = "DWord")
|
||||
try {
|
||||
if (-not (Test-Path $Path)) { New-Item -Path $Path -Force | Out-Null }
|
||||
New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $Type -Force | Out-Null
|
||||
return $true
|
||||
} catch {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# Core suppression keys
|
||||
$suppressionKeys = @(
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="EnableFirstLogonAnimation"; Value=0},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="DisableAnimations"; Value=1},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"; Name="AnimationDisabled"; Value=1},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"; Name="EnableTransitions"; Value=0},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"; Name="DisableStatusMessages"; Value=1},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"; Name="DelayedDesktopSwitchTimeout"; Value=0},
|
||||
@{Path="HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"; Name="AutoLogonDelay"; Value=0}
|
||||
)
|
||||
|
||||
$appliedCount = 0
|
||||
foreach ($key in $suppressionKeys) {
|
||||
if (Set-RegValue -Path $key.Path -Name $key.Name -Value $key.Value) {
|
||||
$appliedCount++
|
||||
}
|
||||
}
|
||||
|
||||
Write-Success " [✓] Applied $appliedCount registry tweaks"
|
||||
|
||||
# Summary
|
||||
Write-Info "`n" + "="*70
|
||||
Write-Success "`n✓ BLACK SCREEN OVERLAY INSTALLED SUCCESSFULLY!"
|
||||
Write-Info "="*70
|
||||
|
||||
Write-Host "`n📋 WHAT WAS INSTALLED:" -ForegroundColor Cyan
|
||||
Write-Host " ✓ C# source code: $csPath"
|
||||
Write-Host " ✓ Overlay executable: $exePath"
|
||||
Write-Host " ✓ Scheduled task: Runs at system startup (highest priority)"
|
||||
Write-Host " ✓ Registry tweaks: Core animation suppression applied"
|
||||
Write-Host " ✓ Security: SYSTEM-level execution with highest priority"
|
||||
|
||||
Write-Host "`n💡 HOW IT WORKS:" -ForegroundColor Green
|
||||
Write-Host " 1. At boot, black overlay launches before LogonUI"
|
||||
Write-Host " 2. Covers ALL screens with solid black window (multi-monitor aware)"
|
||||
Write-Host " 3. Uses Rectangle.Union for proper multi-monitor coverage"
|
||||
Write-Host " 4. Stays on top of all animations and UI elements"
|
||||
Write-Host " 5. Monitors for explorer.exe (desktop shell)"
|
||||
Write-Host " 6. Waits 1000ms after shell detected (slow system support)"
|
||||
Write-Host " 7. Dismisses itself gracefully"
|
||||
Write-Host " 8. Result: Completely black transition to desktop"
|
||||
|
||||
Write-Host "`n🎯 WHAT YOU'LL SEE:" -ForegroundColor Green
|
||||
Write-Host " • Windows logo during boot (normal)"
|
||||
Write-Host " • Solid black screen (instead of animations)"
|
||||
Write-Host " • Your desktop appears smoothly"
|
||||
Write-Host " • NO profile picture, username, spinning wheel, or status text"
|
||||
|
||||
Write-Host "`n🖥️ MULTI-MONITOR SUPPORT:" -ForegroundColor Green
|
||||
Write-Host " • Covers horizontal screen layouts"
|
||||
Write-Host " • Covers vertical screen layouts"
|
||||
Write-Host " • Covers mixed/irregular layouts"
|
||||
Write-Host " • Uses Rectangle.Union for proper bounds calculation"
|
||||
|
||||
Write-Warning "`n⚠️ IMPORTANT NOTES:"
|
||||
Write-Host " • Overlay has 10-second timeout (safety mechanism)"
|
||||
Write-Host " • 1000ms delay after explorer.exe for slow systems"
|
||||
Write-Host " • Auto-restart on failure (3 attempts)"
|
||||
Write-Host " • Works with auto-login and password-protected accounts"
|
||||
Write-Host " • Battery-friendly (runs on laptop battery)"
|
||||
Write-Host " • Restart required to see it in action"
|
||||
|
||||
Write-Success "`n✅ ADVANTAGES:"
|
||||
Write-Host " • Compiled with csc.exe for better compatibility"
|
||||
Write-Host " • Fallback to Add-Type if csc.exe unavailable"
|
||||
Write-Host " • No system file modifications"
|
||||
Write-Host " • No security compromises"
|
||||
Write-Host " • Update-proof (survives all Windows Updates)"
|
||||
Write-Host " • Fully reversible (use uninstall script)"
|
||||
Write-Host " • Zero performance impact"
|
||||
|
||||
Write-Info "`n📝 TO UNINSTALL:"
|
||||
Write-Host " Run the companion uninstall script to completely remove"
|
||||
Write-Host " all components and revert registry changes."
|
||||
|
||||
Write-Info "`n" + "="*70
|
||||
|
||||
$restart = Read-Host "`nRestart computer now to test? (Y/N)"
|
||||
if ($restart -eq 'Y') {
|
||||
Write-Info "Restarting in 10 seconds... (Ctrl+C to cancel)"
|
||||
Start-Sleep -Seconds 10
|
||||
Restart-Computer -Force
|
||||
} else {
|
||||
Write-Warning "`nRestart your computer to see the black screen overlay in action!`n"
|
||||
}
|
Reference in New Issue
Block a user