Utrzymanie Windows – Czyszczenie dysku podczas wyłączania systemu.

Niestety, wszyscy fachowcy od komputerów skazani są na okresowe czyszczenie komputerów wszystkim znajomym i krewnym. Ponadto zazwyczaj opiekujemy się jakąś tam liczbą komputerów, które też od czasu do czasu poddać musimy okresowemu czyszczeniu w podstawowej formie. Zazwyczaj instalujemy na komputerze soft typu ccleaner, ale okazuje się później, że użytkownik takiego komputera zapomniał sobie czym i co ma zrobić po czym komputer ląduje znów na naszym biurku.

Poniżej przedstawiam Wam skrypt, który odpalam na komputerach z którymi mam powyższy stosunek (!). Robie to poprzez harmonogram i wyzwalam go podczas wylogowywania. Wyzwalacz ustawiam tak:

wyzwalacz

Niestety ta metoda ma wadę. Jeśli system zamyka się za szybko, skrypt może nie zdążyć usunąć wszystkich plików albo zalogować informacji do eventloga. Ta metoda jest do poprawy i zajmę się nią później.

Ważne jest aby skrypt uruchamiany był w kontekście użytkownika z prawami administracyjnymi więc dobrze jest mieć do tego konkretnego użytkownika technicznego w domenie, lub w przypadku pojedynczych stacji nie dodanych do domeny jakiegoś swojego administratora któremu nie wygaśnie nagle hasło.

Co robi skrypt zorientujecie się po kodzie – są to m. innymi:

  • czyszczenie cache i historii przeglądarek (FF, Chrome, IE, Edge)
  • czyszczenie tymczasowych folderów temp,
  • czyszczenie kosza na dysku C,
  • czyszczenie cache klienta DNS.
  • czyszczenie memory dumpfile.
  • zapis wyniku do eventloga aplikacji.

Zapis do eventloga ma o tyle duże znaczenie, że po informacji jaka zostaje zapisana możecie stwierdzić że skrypt rzeczywiście się wykonuje.

event3002

 

Gdy puściłem skrypt u siebie po raz pierwszy odzyskał mi 20GB dysku i trwało to na SSD jakieś 4 sek. Gdy jednak skrypt będzie puszczany przy każdym zamykaniu systemu to powinien być niezauważalny.

Kod poniżej:

 

# 
#  Skrypt czyści przeglądarki internetowe oraz foldery temp, kosz dysku C i inne lokalizacje tymczasowe. 
#  Dodaj go do harmonogramu z triggerem który uruchomi go przy zamykaniu syetemu 
#  Uwaga! musi się uruchamiać z uprawnieniami administratora (zrób dedykownane konto techniczne)
#  JS - 2015-11-21

#Przygotowanie eventloga
$logSourceExists = [System.Diagnostics.EventLog]::SourceExists('FreeSpace') 
if ($logSourceExists -eq $false) {
    New-EventLog -LogName "Application" -Source "FreeSpace"
}

# Informacja o wolnym miejscu przed
$Drive = 'c:'
$Filter = "DeviceID='$Drive'"
$diskAfter = Get-WmiObject Win32_LogicalDisk -ComputerName localhost -Filter $Filter |
Select-Object FreeSpace
$FreeSpaceAfter = (($DiskAfter.FreeSpace/1024)/1024)
$FreeMBAfter = [math]::Round($FreeSpaceAfter, 1)


#Czyszczenie cache przeglądarek internetowych ( core: https://liamarjitbhogal.wordpress.com/ )
Write-Host -ForegroundColor yellow “Exporting the list of users to c:\users\%username%\users.csv”
dir C:\Users | select Name | Export-Csv -Path C:\users\$env:USERNAME\users.csv -NoTypeInformation
$list=Test-Path C:\users\$env:USERNAME\users.csv
if ($list) {
# FireFox
Import-CSV -Path "C:\users\$env:USERNAME\users.csv" -Header Name | foreach {
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\cache\*" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\cache\*.*" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\cache2\entries\*.*" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\thumbnails\*" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\cookies.sqlite" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\webappsstore.sqlite" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Mozilla\Firefox\Profiles\*.default\chromeappsstore.sqlite" -Recurse -Force -EA SilentlyContinue -Verbose
}
# Chrome
Import-CSV -Path "C:\users\$env:USERNAME\users.csv" -Header Name | foreach {
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Google\Chrome\User Data\Default\Cache\*” -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Google\Chrome\User Data\Default\Cache2\entries\*” -Recurse -Force -EA SilentlyContinue -Verbose
#Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Google\Chrome\User Data\Default\Cookies” -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Google\Chrome\User Data\Default\Media Cache” -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Google\Chrome\User Data\Default\Cookies-Journal” -Recurse -Force -EA SilentlyContinue -Verbose
}
# IE
Import-CSV -Path "C:\users\$env:USERNAME\users.csv" | foreach {
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Microsoft\Windows\Temporary Internet Files\*” -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Microsoft\Windows\WER\*” -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Temp\*” -Recurse -Force -EA SilentlyContinue -Verbose
}
# Edge
Import-CSV -Path "C:\users\$env:USERNAME\users.csv" | foreach {
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\Cache\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!002\MicrosoftEdge\Cache\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\User\Default\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!002\MicrosoftEdge\User\Default\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\Cookies\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!002\MicrosoftEdge\Cookies\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\MicrosoftEdge\User\Default\Recovery\Active\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!001\MicrosoftEdge\History\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\#!002\MicrosoftEdge\History\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\MicrosoftEdge\History\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
Remove-Item -path “C:\Users\$($_.Name)\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\AC\MicrosoftEdge\Cache\*” -Recurse -Filter *.* -Force -EA SilentlyContinue -Verbose
}

} else {
Write-Host -ForegroundColor Yellow “Session Cancelled”
Exit
}

# Czyszczenie folderów temp
Import-CSV -Path "C:\users\$env:USERNAME\users.csv" -Header Name | foreach {
Remove-Item -path "C:\Users\$($_.Name)\AppData\Local\Temp\*" -Recurse -Force -EA SilentlyContinue -Verbose
}
Remove-Item -path "$env:windir\temp\*" -Recurse -Force -EA SilentlyContinue -Verbose


# Czyszczenie innych elementów
Clear-RecycleBin c: -Force
Remove-Item -path "$WindowsFolder\MEMORY.DMP" -Recurse -Force -EA SilentlyContinue -Verbose
Remove-Item -Path "$windowsFolder\Minidump\*" -Recurse -Force -EA SilentlyContinue -Verbose
Ipconfig /Flushdns

$diskBefore = Get-WmiObject Win32_LogicalDisk -ComputerName localhost -Filter $Filter |
Select-Object FreeSpace
$FreeSpaceBefore = (($DiskBefore.FreeSpace/1024)/1024)
$FreeMBBefore = [math]::Round($FreeSpaceBefore, 1)

$ResultFull = $FreeMBBefore-$FreeMBAfter
$Result = [math]::Round($ResultFull, 2)
Write-Host "Zakończono czyszczenie. Odzyskano $Result MB." -BackgroundColor DarkRed
write-eventlog -logname Application -source FreeSpace -eventID 3002 -entrytype Information -message "Przeprowadzono czyszczenie skryptem. Odzyskano $Result MB" -category 1 -rawdata 10,20

Miłego testowania. 🙂

Aktualizacja.

Nie wiem dlaczego, ale okazuje się że chrome niezbyt dobrze reaguje na czyszczenie folderu cookies. Wykomentowałem tą linijkę. Prawdopodobnie ciastka muszą być wyczyszczone jeszcze w jakiejś bazie danych. Objaw jest taki że stronę która zapisuje ciastko (wyczyszczone później skryptem) trzeba odświeżyć dwa razy.