Очистка временных файлов на всех компах в домене, в системных каталогах и во всех учетках пользователей #Psh
писался давно, работает на любой версии PoSh, без предустановленного модуля Active Directory.
Чистит, если свободного места меньше десяти гигов.
Если после чистки свободного места остаётся меньше шести гигов, пишет имя компа в лог usedSpace. Второй столбец - размер диска C.
В лог clearedSpace.log пишутся результаты до и после чистки.
Логи после работы удобно просматривать в экселе, сортировать по столбцам.
######Настройки
#Указываем корень поиска. По умолчанию ищем во всем домене.
#Вместо $DomainDN указываем свой путь вида OU=Computers,OU=Accounts,DC=mydomain,DC=ru
$Srchroot = [ADSI]"LDAP://OU=Computers,OU=Accounts,DC=mydomain,DC=ru"
#Путь к лог-файлам
$LogPathLowSpace = "D:\work\log\usedSpace.log"
$LogPathClearSpace = "D:\work\log\clearedSpace.log"
Function Test-Host ($Name)
{
$ping = new-object System.Net.NetworkInformation.Ping
trap {Write-Verbose "Ошибка пинга"; $False; continue}
if ($ping.send($Name, 50).Status -eq "Success" ) { $True }
else { $False }
}
function Clear-TempFiles
{ param([string]$computername=$env:COMPUTERNAME)
$UsersDir = "\\$computername\C$\users"
$UserProfileTemp1 ="\AppData\Local\Temp"
$UserProfileTemp2 ="\AppData\Local\Microsoft\Windows\Temporary Internet Files"
$WindowsTemp = "\\$computername\C$\Windows\Temp"
$RecycleBin = "\\$computername\C$"+'\$Recycle.Bin'
$dirs = ls $UsersDir
foreach ($path in $dirs)
{
$temp1=$path.FullName+$UserProfileTemp1
$temp2=$path.FullName+$UserProfileTemp2
if((Test-Path $temp1) -and (Test-Path $temp2) ){
Write-host ("Clearing profile: "+$path+".....") -NoNewline
Remove-Item "$temp1\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Remove-Item "$temp2\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Done"
}
}
Write-Host ('Clearing C:\$Recycle.Bin.....') -NoNewline
Remove-Item "$RecycleBin\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Done"
Write-Host ("Clearing C:\Windows\Temp:.....") -NoNewline
Remove-Item "$WindowsTemp\*" -Force -Recurse -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Done"
}
function Get-FreeSpace
{param ([string]$DnsHosName)
$driveC=Get-WmiObject Win32_LogicalDisk -ComputerName $DnsHosName| Where-Object {$_.DeviceID -eq "C:"}
$freespace=[int]($driveC.FreeSpace/1GB)
return $freespace
}
#====Обращение к Актив Директори=================
#Получаем имя домена
$DomainName = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$DomainDN = $DomainName.GetDirectoryEntry().distinguishedName
$DN=$DomainName.Name
#Получаем список компов в домене
$selector = New-Object system.DirectoryServices.DirectorySearcher
$Selector.SearchRoot = $Srchroot
$Selector.PageSize = 3000
$selector.Filter = '(objectClass=Computer)'
$selector.PropertiesToLoad.AddRange(@("name","dnshostname", "distinguishedName",
"canonicalName","lastLogonTimestamp"))
$Computers = $selector.FindAll()
#==================================================
""|Out-File -FilePath $LogPathLowSpace
""|Out-File -FilePath $LogPathClearSpace
foreach ($comp in $Computers)
{
$dnsname = $comp.Properties.get_item("dnshostname")
$CompName = $comp.Properties.get_item("name")
if(Test-Host $dnsname)
{
Write-Host "Scanning:"$CompName
$freespaceBeforClr = Get-FreeSpace -DnsHosName $dnsname
if ($freespaceBeforClr -le 10)
{
Write-Host ("Clearing: "+$CompName+" FreeSpace: "+$freespaceBeforClr)
Clear-TempFiles -computername $dnsname
$freespaceAfterClr = Get-FreeSpace -DnsHosName $dnsname
Write-Host ("Clearing: "+$CompName+" After clr: "+$freespaceAfterClr)
$clrResult = [string] ($CompName+$freespaceBeforClr+$freespaceAfterClr)
$clrResult|Out-File -FilePath $LogPathClearSpace -Append
if ($freespaceAfterClr -le 6)
{
$driveC=Get-WmiObject Win32_LogicalDisk -ComputerName $dnsname| Where-Object {$_.DeviceID -eq "C:"}
$totalspace=[int]($driveC.Size/1GB)
$result = [string] ($CompName+$freespaceAfterClr+$totalspace)
$result| Out-File -FilePath $LogPathLowSpace -Append
}
}
}
}