90 lines
3.2 KiB
PowerShell
90 lines
3.2 KiB
PowerShell
Function global:Fix-WindowsScriptingComponents
|
|
{
|
|
## List of all scripting component DLL files
|
|
$DLL_FILES = @("${Env:WINDIR}\system32\vbscript.dll",
|
|
"${Env:WINDIR}\system32\jscript.dll",
|
|
"${Env:WINDIR}\system32\dispex.dll",
|
|
"${Env:WINDIR}\system32\scrobj.dll",
|
|
"${Env:WINDIR}\system32\scrrun.dll",
|
|
"${Env:WINDIR}\system32\wshext.dll"
|
|
"${Env:WINDIR}\system32\wshom.ocx",
|
|
"${Env:WINDIR}\syswow64\vbscript.dll",
|
|
"${Env:WINDIR}\syswow64\jscript.dll",
|
|
"${Env:WINDIR}\syswow64\dispex.dll",
|
|
"${Env:WINDIR}\syswow64\scrobj.dll",
|
|
"${Env:WINDIR}\syswow64\scrrun.dll",
|
|
"${Env:WINDIR}\syswow64\wshext.dll",
|
|
"${Env:WINDIR}\syswow64\wshom.ocx")
|
|
|
|
## Unregister all DLLs
|
|
ForEach ($dll in $DLL_FILES)
|
|
{
|
|
If ( Test-Path $dll )
|
|
{
|
|
If ( $dll -Match "syswow64" ) { $REGSVR32 = "${Env:WINDIR}\syswow64\regsvr32" } Else { $REGSVR32 = "regsvr32" }
|
|
Start-Process "${REGSVR32}" -ArgumentList "/u /s ${dll}" -Wait
|
|
}
|
|
}
|
|
|
|
## Register all DLLs
|
|
ForEach ($dll in $DLL_FILES)
|
|
{
|
|
If ( Test-Path $dll )
|
|
{
|
|
If ( $dll -Match "syswow64" )
|
|
{ $REGSVR32 = "${Env:WINDIR}\syswow64\regsvr32" } Else { $REGSVR32 = "regsvr32" }
|
|
Start-Process "${REGSVR32}" -ArgumentList "/s ${dll}" -Wait
|
|
}
|
|
}
|
|
}
|
|
|
|
Function global:Fix-SystemPrintQueue
|
|
{
|
|
## Make sure the spooler service isn't already stopped
|
|
If ( (Get-Service -Name spooler).Status -ne "Stopped" )
|
|
{
|
|
## Forcefully stop the spooler service
|
|
Stop-Service -Name spooler -Force
|
|
|
|
## Wait a few seconds to make sure it's stopped
|
|
Start-Sleep -Seconds 5
|
|
}
|
|
|
|
## Check to make sure the spooler service has stopped
|
|
If ((Get-Service -Name spooler).Status -eq "Stopped")
|
|
{
|
|
## Delete all print jobs, including secure prints
|
|
Remove-Item "${Env:WINDIR}\System32\spool\PRINTERS\*" -Recurse
|
|
|
|
## Start the spooler service again
|
|
Start-Service -Name spooler
|
|
}
|
|
|
|
## If the spooler service didn't stop on time, just return an error
|
|
Else { Write-Output "Could not clean ${Env:WINDIR}\System32\spool\PRINTERS\* because spooler service is running." }
|
|
}
|
|
|
|
Function global:Fix-WindowsUpdate
|
|
{
|
|
param([switch]$WSUS)
|
|
|
|
## Delete any existing folder from a previous execution of this script
|
|
If ( Test-Path "${Env:WinDir}\SoftwareDistribution.old" ) { Remove-Item "${Env:WinDir}\SoftwareDistribution.old" -Recurse -Force }
|
|
|
|
## Stop Background Intelligent Transfer Services and Windows Update
|
|
Stop-Service BITS
|
|
Stop-Service wuauserv
|
|
|
|
## Rename the SoftwareDistribution folder, forcing Windows Update to recreate all metrics and redownload all updates
|
|
Rename-Item -Path "${Env:WinDir}\SoftwareDistribution" -NewName "${Env:WinDir}\SoftwareDistribution.old" -Force
|
|
|
|
## Start Windows Update and Background Intelligent Transfer Services
|
|
Start-Service wuauserv
|
|
Start-Service BITS
|
|
|
|
## Delete SoftwareDistribution.old from this execution of this script
|
|
If ( Test-Path "${Env:WinDir}\SoftwareDistribution.old" ) { Remove-Item "${Env:WinDir}\SoftwareDistribution.old" -Recurse -Force }
|
|
|
|
## If using WSUS, reset authorization with server and detect new updates
|
|
If ( $WSUS ) { Start-Process "${Env:WinDir}\System32\wuauctl.exe" -ArgumentList "/resetauthorization /detectnow" }
|
|
} |