Hot off the presses, get it now, the Windows 8 VDI optimization script, courtesy of PFE!


Hats off to Carl Luberti!  So, here it is, without further ado….its’ time to start Optimizing!

 

‘ // ========================================================================
  ‘ // Original generated with VDIOptimizer – http://www.autoitscript.com/tools
  ‘ // (c)2010 Jonathan Bennett
  ‘ //
  ‘ // Version:          1.3-Win8
  ‘ // Last Modified:    9th April 2013
  ‘ // Last Modified by: Carl Luberti (MSFT)
  ‘ // Contributions by: Jeff Stokes (MSFT)
  ‘ // ========================================================================

  ‘ // ==============
  ‘ // General Advice
  ‘ // ==============
  ‘
  ‘ Before finalizing the image perform the following tasks:
  ‘ – Ensure no unwanted startup files by using autoruns.exe from SysInternals
  ‘ – Run the Disk Cleanup tool as administrator and delete all temporary files and system restore points (can be automated with this script)
  ‘ – Run disk defrag and consolidate free space: defrag c: /v /x
  ‘ – Reboot the machine 6 times and wait 120 seconds after logging on before performing the next reboot (boot prefetch training)
  ‘ – Run disk defrag and optimize boot files: defrag c: /v /b
  ‘ – If using a dynamic virtual disk, use the vendor’s utilities to perform a "shrink" operation

  ‘ // *************
  ‘ // *  CAUTION  *
  ‘ // *************
  ‘
  ‘ THIS SCRIPT MAKES CONSIDERABLE CHANGES TO THE DEFAULT CONFIGURATION OF WINDOWS.
  ‘
  ‘ Please review this script THOROUGHLY before applying to your virtual machine, and disable changes below as necessary to suit your current
  ‘ environment.
  ‘
  ‘ This script is provided AS-IS – usage of this source assumes that you are at the very least familiar with the vbscript language being used and the
  ‘ tools used to create and debug this file.
  ‘
  ‘ In other words, if you break it, you get to keep the pieces.

  ‘ Constants
Const ForReading = 1
Const Disable_Aero = False
Const Disable_BranchCache = False
Const Disable_EFS = False
Const Disable_iSCSI = False
Const Disable_MachPass = False
Const Disable_Search = False

Const Install_NetFX3 = False
Const NetFX3_Source = "D:\Sources\SxS"

‘ Common objects
  Set oShell = WScript.CreateObject ("WScript.Shell")
  Set oFSO = CreateObject("Scripting.FileSystemObject")
  Set oEnv = oShell.Environment("User")

‘ Command Line Arguments for Some Settings
  Set colNamedArguments = WScript.Arguments.Named

If colNamedArguments.Exists("Aero") Then
     strAero = colNamedArguments.Item("Aero")
  Else
     strAero = Disable_Aero
  End If

If colNamedArguments.Exists("BranchCache") Then
     strBranchCache = colNamedArguments.Item("BranchCache")
  Else
     strBranchCache = Disable_BranchCache
  End If

If colNamedArguments.Exists("EFS") Then
     strEFS = colNamedArguments.Item("EFS")
  Else
     strEFS = Disable_EFS
  End If

If colNamedArguments.Exists("iSCSI") Then
     striSCSI = colNamedArguments.Item("iSCSI")
  Else
     striSCSI = Disable_iSCSI
  End If

If colNamedArguments.Exists("MachPass") Then
     strMachPass = colNamedArguments.Item("MachPass")
  Else
     strMachPass = Disable_MachPass
  End If

If colNamedArguments.Exists("Search") Then
    strSearch = colNamedArguments.Item("Search")
  Else
    strSearch = Disable_Search
  End If

If colNamedArguments.Exists("NetFX3") Then
    strNetFX3 = colNamedArguments.Item("NetFX3")
  Else
    strNetFX3 = Install_NetFX3
  End If

  ‘ First things first – enable RDP Connections!!!
RunWait "WMIC rdtoggle where AllowTSConnections=0 call SetAllowTSConnections 1,1"
RunWait "netsh advfirewall firewall set rule group=" & Chr(34) & "remote desktop" & Chr(34) & " new enable=Yes"

 

‘ // ==================
  ‘ // Configure Services
  ‘ // ==================

‘ Disable Application Layer Gateway Service
RunWait "sc config ALG start= disabled"

‘ Disable Background Intelligent Transfer Service
RunWait "sc config BITS start= disabled"

‘ Disable Bitlocker Drive Encryption Service
RunWait "sc config BDESVC start= disabled"

‘ Disable Block Level Backup Engine Service
RunWait "sc config wbengine start= disabled"

‘ Disable Bluetooth Support Service
RunWait "sc config bthserv start= disabled"

If strBranchCache = True Then
    ‘ Disable BranchCache Service
    RunWait "sc config PeerDistSvc start= disabled"
  End If

‘ Disable Computer Browser Service
RunWait "sc config Browser start= disabled"

‘ Disable Device Association Service
RunWait "sc config DeviceAssociationService start= disabled"

‘ Disable Device Setup Manager Service
RunWait "sc config DsmSvc start= disabled"

‘ Disable Diagnostic Policy Services
RunWait "sc config DPS start= disabled"
RunWait "sc config WdiServiceHost start= disabled"
RunWait "sc config WdiSystemHost start= disabled"

‘ Disable Distributed Link Tracking Client Service
RunWait "sc stop TrkWks"
RunWait "sc config TrkWks start= disabled"

If strEFS = True Then
    ‘ Disable Encrypting File System Service
    RunWait "sc config EFS start= disabled"
  End If

‘ Disable Family Safety Service
RunWait "sc config WPCSvc start= disabled"

‘ Disable Fax Service
RunWait "sc config Fax start= disabled"

‘ Disable Function Discovery Resource Publication Service
RunWait "sc config fdPHost start= disabled"

‘ Disable HomeGroup Listener Service
RunWait "sc config HomeGroupListener start= disabled"

‘ Disable HomeGroup Provider Service
RunWait "sc config HomeGroupProvider start= disabled"

If striSCSI = True Then
    ‘ Disable Microsoft iSCSI Initiator Service
    RunWait "sc config msiscsi start= disabled"
  End If

‘ Disable Microsoft Software Shadow Copy Provider Service
RunWait "sc config swprv start= disabled"

‘ Set Network List Service to Auto
RunWait "sc config netprofm start= auto"

‘ Disable Optimize Drives Service
RunWait "schtasks /change /tn ""microsoft\windows\defrag\ScheduledDefrag"" /disable"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunction\Enable", "N", "REG_SZ"
RunWait "sc config defragsvc start= disabled"

‘ Disable Secure Socket Tunneling Protocol Service
RunWait "sc config SstpSvc start= disabled"

‘ Disable Sensor Monitoring Service
RunWait "sc config SensrSvc start= disabled"

‘ Disable Shell Hardware Detection Service
RunWait "sc config ShellHWDetection start= disabled"

‘ Disable SNMP Trap Service
RunWait "sc config SNMPTRAP start= disabled"

‘ Disable SSDP Discovery Service
RunWait "sc stop SSDPSRV"
RunWait "sc config SSDPSRV start= disabled"

‘ Disable Telephony Service
RunWait "sc config TapiSrv start= disabled"

If strAero = True Then
    ‘ Disable Themes Service
    RunWait "sc config Themes start= disabled"
  End If

‘ Disable UPnP Device Host Service
RunWait "sc config upnphost start= disabled"

‘ Disable Volume Shadow Copy Service
RunWait "sc config VSS start= disabled"

‘ Disable Windows Backup Service
RunWait "sc config SDRSVC start= disabled"

‘ Disable Windows Color System Service
RunWait "sc config WcsPlugInService start= disabled"

‘ Disable Windows Connect Now – Config Registrar Service
RunWait "sc config wcncsvc start= disabled"

‘ Disable Windows Defender Service
RunWait "schtasks /change /tn ""microsoft\windows\windows Defender\Windows Defender Cache Maintenance"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\windows Defender\Windows Defender Cleanup"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\windows Defender\Windows Defender Scheduled Scan"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\windows Defender\Windows Defender Verification"" /disable"

‘ Disable Windows Error Reporting Service
RunWait "sc config WerSvc start= disabled"

‘ Disable Windows Media Player Network Sharing Service
RunWait "sc config WMPNetworkSvc start= disabled"

‘ Break out Windows Management Instrumentation Service
RunWait "winmgmt /standalonehost"
RunWait "sc config winmgmt group= COM Infrastructure"

‘Disable Windows Search Service
  If strSearch = True Then
    RunWait "sc stop WSearch"
    RunWait "sc config WSearch start= disabled"
  End If

‘ Disable WLAN AutoConfig Service
RunWait "sc config Wlansvc start= disabled"

‘ Disable WWAN AutoConfig Service
RunWait "sc config WwanSvc start= disabled"

 

‘ // ================
  ‘ // MACHINE SETTINGS
  ‘ // ================

‘ Disable Hard disk timeouts
RunWait "POWERCFG /SETACVALUEINDEX 381b4222-f694-41f0-9685-ff5bb260df2e 0012ee47-9041-4b5d-9b77-535fba8b1442 6738e2c4-e8a5-4a42-b16a-e040e769756e 0"
RunWait "POWERCFG /SETDCVALUEINDEX 381b4222-f694-41f0-9685-ff5bb260df2e 0012ee47-9041-4b5d-9b77-535fba8b1442 6738e2c4-e8a5-4a42-b16a-e040e769756e 0"

  ‘ Disable TCP/IP / Large Send Offload
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DisableTaskOffload", &H00000001, "REG_DWORD"

  ‘ Disable hibernate
RunWait "powercfg -h off"

  ‘ Disable System Restore
  Set objWMIService = GetObject("winmgmts:\\.\root\default")
  Set objItem = objWMIService.Get("SystemRestore")
objItem.Disable("")
RunWait "schtasks /change /tn ""microsoft\windows\SystemRestore\SR"" /disable"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore\DisableSR", &H00000001, "REG_DWORD"

  ‘ Disable NTFS Last Access Timestamps
RunWait "FSUTIL behavior set disablelastaccess 1"

  If strMachPass = True Then
    ‘ Disable Machine Account Password Changes
    oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange", &H00000001, "REG_DWORD"
  End If

  ‘ Disable memory dumps
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\CrashDumpEnabled", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\LogEvent", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\SendAlert", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\AutoReboot", &H00000001, "REG_DWORD"

  ‘ Disable default system screensaver
oShell.RegWrite "HKEY_USERS\.DEFAULT\Control Panel\Desktop\ScreenSaveActive", 0, "REG_DWORD"

  ‘ Increase service startup timeouts
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout", &H0002bf20, "REG_DWORD"

  ‘ Increase Disk I/O Timeout to 200 seconds.
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\TimeOutValue", &H000000C8, "REG_DWORD"

  ‘ Disable Other Scheduled Tasks
RunWait "schtasks /change /tn ""microsoft\windows\Application Experience\AitAgent"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Application Experience\ProgramDataUpdater"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Application Experience\StartupAppTask"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Autochk\Proxy"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Bluetooth\UninstallDeviceTask"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Customer Experience Improvement Program\BthSQM"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Customer Experience Improvement Program\Consolidator"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Customer Experience Improvement Program\KernelCeipTask"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Customer Experience Improvement Program\Uploader"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Customer Experience Improvement Program\UsbCeip"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Diagnosis\Scheduled"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\DiskDiagnostic\Microsoft-Windows-DiskDiagnosticDataCollector"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\DiskDiagnostic\Microsoft-Windows-DiskDiagnosticResolver"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Maintenance\WinSAT"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\MobilePC\HotStart"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Power Efficiency Diagnostic\AnalyzeSystem"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\RAC\RacTask"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Ras\MobilityManager"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Registry\RegIdleBackup"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Shell\FamilySafetyMonitor"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Shell\FamilySafetyRefresh"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\SideShow\AutoWake"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\SideShow\GadgetManager"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\SideShow\SessionAgent"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\SideShow\SystemDataProviders"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\UPnP\UPnPHostConfig"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\WDI\ResolutionHost"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Windows Filtering Platform\BfeOnServiceStartTypeChange"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\Windows Media Sharing\UpdateLibrary"" /disable"
RunWait "schtasks /change /tn ""microsoft\windows\WindowsBackup\ConfigNotification"" /disable"

  ‘ Configure Event Logs to 1028KB (Minimum size under Vista/7) and set retention to "overwrite"
  Set oEventLogs = GetObject("winmgmts:{impersonationLevel=impersonate,(Security)}!//./root/cimv2").InstancesOf("Win32_NTEventLogFile")
  For Each e in oEventLogs
    e.MaxFileSize = 1052672
    e.OverWritePolicy = "WhenNeeded"
    e.OverWriteOutdated = 0
    e.Put_
    e.ClearEventLog()
  Next

oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\eventlog\Application\Retention", 0, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\eventlog\Security\Retention", 0, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\eventlog\System\Retention", 0, "REG_DWORD"

  ‘ Set PopUp Error Mode to "Neither"
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode", 2, "REG_DWORD"

  ‘ Disable bootlog and boot animation
RunWait "bcdedit /set {default} bootlog no"
RunWait "bcdedit /set {default} quietboot yes"

  ‘ Disable UAC secure desktop prompt
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop", &H00000000, "REG_DWORD"

  ‘ Disable New Network dialog
RunWait "reg add HKLM\SYSTEM\CurrentControlSet\Control\Network\NewNetworkWindowOff"

  ‘ Disable AutoUpdate of drivers from WU
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\DriverSearching\searchorderConfig", 0, "REG_DWORD"

  ‘ Turn off Windows SideShow and install NetFX3
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Sideshow\Disabled", 1, "REG_DWORD"
  If strNetFX3 = True Then
    RunWait "dism /online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:" & NetFX3_Source & " /NoRestart"
  End If

‘ Disable IE First Run Wizard and RSS Feeds
oShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Main\DisableFirstRunCustomize", 1, "REG_DWORD"

  ‘ Disable the ability to clear the paging file during shutdown
oShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\ClearPageFileAtShutdown", 0, "REG_DWORD"

  ‘ Perform a disk cleanup
  ‘ Automate by creating the reg checks corresponding to "cleanmgr /sageset:100" so we can use "sagerun:100"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Downloaded Program Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Internet Cache Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Memory Dump Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Offline Pages Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Old ChkDsk Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Previous Installations\StateFlags0100", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Recycle Bin\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Setup Log Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error memory dump files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error minidump files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Setup Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Thumbnail Cache\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Upgrade Discarded Files\StateFlags0100", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Archive Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Queue Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Archive Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Queue Files\StateFlags0100", &H00000002, "REG_DWORD"
oShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Upgrade Log Files\StateFlags0100", &H00000002, "REG_DWORD"
RunWait "cleanmgr.exe /sagerun:100"

 

‘ // =============
  ‘ // USER SETTINGS
  ‘ // =============

‘ Reduce menu show delay
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\MenuShowDelay", "0", "REG_SZ"

  ‘ Disable cursor blink
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\CursorBlinkRate", "-1", "REG_SZ"
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\DisableCursorBlink", &H00000001, "REG_DWORD"

  ‘ Force off-screen composition in IE
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Force Offscreen Composition", &H00000001, "REG_DWORD"

  ‘ Disable screensavers
oShell.RegWrite "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Control Panel\Desktop\ScreenSaveActive", "0", "REG_SZ"
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive", "0", "REG_SZ"
oShell.RegWrite "HKEY_USERS\.DEFAULT\Control Panel\Desktop\ScreenSaveActive", "0", "REG_SZ"

  ‘ Don’t show window contents when dragging
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\DragFullWindows", "0", "REG_SZ"

  ‘ Don’t show window minimize/maximize animations
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\MinAnimate", "0", "REG_SZ"

  ‘ Disable font smoothing
oShell.RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\FontSmoothing", "0", "REG_SZ"

  ‘ Disable most other visual effects
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects\VisualFXSetting", &H00000003, "REG_DWORD"
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewAlphaSelect", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarAnimations", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewWatermark", &H00000000, "REG_DWORD"
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\ListviewShadow", &H00000000, "REG_DWORD"
RegBinWrite "HKEY_CURRENT_USER\Control Panel\Desktop", "UserPreferencesMask", "90,12,01,80"

  ‘ Disable Action Center
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\HideSCAHealth", &H00000001, "REG_DWORD"

  ‘ Disable IE Persistent Cache
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache\Persistent", 0, "REG_DWORD"
oShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Feeds\SyncStatus", 0, "REG_DWORD"

  ‘ Done
WScript.Quit

 

 

  ‘ // ================
  ‘ // HELPER FUNCTIONS
  ‘ // ================

Function Run(sFile)
    Run = oShell.Run(sFile, 1, False)
  End Function

  Function RunWait(sFile)
    RunWait = oShell.Run(sFile, 1, True)
  End Function

  Function RunWaitHidden(sFile)
    RunWaitHidden = oShell.Run(sFile, 0, True)
  End Function

  Function IsServer()
    IsServer = False
    On Error Resume Next
    For Each objOS in GetObject("winmgmts:").InstancesOf ("Win32_OperatingSystem")
        If objOS.ProductType = 1 Then IsServer = False
        If objOS.ProductType = 2 Or ObjOS.ProductType = 3 Then IsServer = True
    Next
  End Function

  Sub RegBinWrite (key, value, data)
    key = "[" & key & "]"

    If value <> "@" then
        value = chr(34) & value & chr(34)
    End if

    valString = value & "=" & "hex:" & data

    tempFile = GetTempDir() & "\regbinaryimport.reg"
    Set txtStream = oFSO.CreateTextFile(tempFile,true)
    txtStream.WriteLine("Windows Registry Editor Version 5.00")
    txtStream.WriteLine(key)
    txtStream.WriteLine(valString)
    txtStream.Close

    oShell.Run "regedit.exe /s """ & tempFile & """", 1, true

    oFSO.DeleteFile tempFile
  End Sub

  Function GetTEMPDir()
    GetTEMPDir = oEnv("TEMP")
    If InStr(GetTEMPDir, "%") Then
        GetTEMPDir = oShell.ExpandEnvironmentStrings(GetTEMPDir)
    End If
  End Function

 

Disclaimed:  If none of this makes sense to you, you probably shouldn’t be doing it.  All liability is the property of the person applying it.  If you break it you get to keep the pieces….


Comments (29)

  1. Anonymous says:

    Should be fine for RDS yeah. I am not that good at powershell, so yeah…

  2. Anonymous says:

    Hi Ravi A, no modifications needed to my knowledge.

  3. Anonymous says:

    Rob did I get back to you?  We are!  Rob T.  Peter, please explain what you mean sir?

  4. Anonymous says:

    Good eye Andrew!  Good eye!  Windows 8 is hyper-visor aware in this regard.  A big improvement over 7 in this area.  I'm looking for something public on this and will post it to this comment area when I find it ok?

  5. Anonymous says:

    Correct, superfetch is not disabled in the 8 script, but is on 7 yes.

  6. Anonymous says:

    Nah some of the stuff will go away post sysprep /generalize, I’d make it a post deploy task TS step.

  7. Anonymous says:

    @Andrew Wood

    Windows 8 detects SSD drives and doesn’t do any prefetch for this drive, but keeps prefetching for normal HDDs. So no need to stop the superfetch service:

    channel9.msdn.com/…/Defrag-Disabling-Hibernation-Superfetch-onboard-VGA

  8. Anonymous says:

    Anthony you may want to email me (email blog author link)

  9. Andrew Wood says:

    No disable pre-fetch or superfetch?

  10. Steve says:

    Can you comment on the volume cache changes?  I'm not familiar with those tweaks.

  11. dani says:

    Does it works for Windows 7 as well? If not, any equivalent script for Win7?

  12. Rob T says:

    If you're ever interested in converting all or part of this to Powershell, let me know!  This might be a fun project to do as a Powershell Module and I'd appreciate your guidance on it!

  13. Peter de Zeeuw says:

    Maybe a very stupid question but how should this script be run on a w8 template?

  14. Ravi A says:

    Jeff, Can we use this on Windows 8.1 or any modifications needed for this script?

  15. Anonymous says:

    Pingback from Optimisation des VM Windows

  16. David Saltrick says:

    Jeff – so once an image is created. Run this script and then sysprep the image???

  17. Mike G says:

    Jeff thank you for sharing this it is a great help. Just curious to know if these commands can be used for optimizing Windows 2012/R2 server build in particular Citrix and TS builds? At the present moment I don't have something like WDS/MDT for deploying
    the Image so I use a scripted install of Win7/8/2008/2012 using unattend.xml and using a post install batch file I apply the cutomizations. It would be great if someone could kindly convert this into a Powershell script.

  18. Jason Turner says:

    According to this video for optimizing (which they demo this script in) Windows 8 Superfetch is virtualization aware, so it does not need to be disabled…

    http://channel9.msdn.com/Events/MMS/2013/DV-B308

    Decent video. Would still prefer to see all of this done via GPOs (with the GPOs being posted.)

  19. Steve says:

    8.1 and Update 1 have installed new Services (Windows App Store). Can you update this script to include the latest recommendations?

  20. David Kohn says:

    Will there be an update to this script for Windows 8.1 Update 1?

    Thanks!

  21. Ryan says:

    If you want network printers to show up under Devices and Printers (so that a user can change their default printer), don't disable the Device Setup Manager service.

  22. Anthony says:

    I posted this same question in the wrong section earlier:

    Having a Type Mismatch error at each instance of 'RunWait' in the script. Running script in Wscript at base admin level. Any help would be appreciated! Thanks.

  23. Dan says:

    Running this on Windows 8.1 Enterprise then using CopyProfile during sysprep leaves newly created profiles with a strange gap in windows explorer between the window border and the menu bar. Killing explorer.exe and restarting resolves it but I'm wondering
    what the root cause might be since I can't tell VDI users to restart explorer. Any idea what parts of the script might be to blame?

  24. Jeff Stokes says:

    Dan can you email me a screenshot of what you are seeing please? jeff.stokes@microsoft.com

    Thanks,
    Jeff

  25. Anonymous says:

    ~ John Behneman | Senior Support Escalation Engineer Hello everyone, John Behneman here again. I’d like

  26. Rhys E says:

    Hi Jeff, any idea if there is a Windows 10 version of this script yet? 🙂
    Big fan of the Windows 8 script.

  27. Raoul says:

    From what i have seen on W2K12R2 and W10

    ' Disable Function Discovery Resource Publication Service
    RunWait "sc config fdPHost start= disabled"

    Should be

    ' Disable Function Discovery Resource Publication Service
    RunWait "sc config FDResPub start= disabled"

  28. Jeff Stokes says:

    https://github.com/cluberti/VDI is the current library of scripts for this. I checked in 10, you are correct.