ล้างแคชและไฟล์ชั่วคราวในโปรไฟล์ผู้ใช้บน Windows (RDS) ด้วย PowerShell และ GPO
ผู้ดูแลระบบฟาร์ม Windows Server RDS มักประสบกับปัญหาเนื้อที่ว่างในไดรฟ์ระบบไม่เพียงพอเนื่องจากข้อมูลผู้ใช้จำนวนมาก บทความนี้แสดงวิธีใช้ PowerShell และ Group Policies เพื่อล้างข้อมูลในโฟลเดอร์ Recycle Bin, Downloads, Temp และ Cache โดยอัตโนมัติในโปรไฟล์ผู้ใช้บน Windows
ล้างข้อมูลชั่วคราวโดยอัตโนมัติและดาวน์โหลดโฟลเดอร์ด้วย Windows Storage Space
คุณสามารถใช้คุณลักษณะ Storage Sense ในตัวเพื่อลบไฟล์เก่าและไฟล์ชั่วคราวบน Windows Server 2019/2022 และ Windows 10/11 โดยอัตโนมัติ มีตัวเลือก GPO พิเศษที่ให้คุณล้างโฟลเดอร์ Temp และ Downloads
วิธีล้างถังรีไซเคิลสำหรับผู้ใช้ Windows
ตามค่าเริ่มต้น โฟลเดอร์ถังรีไซเคิล (
$Recycle.Bin) สำหรับไฟล์ที่ถูกลบเปิดใช้งานบนโฮสต์ Windows โฟลเดอร์ถังรีไซเคิลแต่ละโฟลเดอร์จะถูกสร้างขึ้นสำหรับผู้ใช้แต่ละคนในไดเร็กทอรีนี้ (โดยใช้ชื่อ SID ของผู้ใช้) บนเซิร์ฟเวอร์ RDS เมื่อเวลาผ่านไป คุณจะพบว่าขนาดไฟล์ทั้งหมดในถังรีไซเคิลของผู้ใช้ทั้งหมดจะใช้พื้นที่ดิสก์จำนวนมากบนโฮสต์ RDS
ขนาดเริ่มต้นของถังรีไซเคิลใน Windows คือประมาณ 5% ของขนาดดิสก์ คุณสามารถเปลี่ยนขนาดสูงสุดของถังรีไซเคิลในแต่ละไดรฟ์ได้ในคุณสมบัติ ที่นี่ คุณยังสามารถปิดใช้งานถังรีไซเคิลได้อย่างสมบูรณ์โดยใช้ตัวเลือก อย่าย้ายไฟล์ไปที่ถังรีไซเคิล อย่างไรก็ตาม การดำเนินการนี้จะเปลี่ยนการตั้งค่าถังรีไซเคิลสำหรับผู้ใช้ปัจจุบันเท่านั้น
คุณสามารถตั้งค่าขนาดถังรีไซเคิลสูงสุดสำหรับผู้ใช้ด้วยตัวเลือก GPO ขนาดถังรีไซเคิลสูงสุดที่อนุญาต ภายใต้ User Configuration -> Administrative Templates -> Windows Components -> File Explorer ขนาดถังรีไซเคิลสูงสุดถูกกำหนดเป็นเปอร์เซ็นต์ของขนาดดิสก์ของคุณ การตั้งค่านี้เป็น 0 จะปิดใช้งานถังรีไซเคิลในไดรฟ์ทั้งหมด
หากต้องการล้างถังรีไซเคิลใน Windows คุณสามารถใช้ cmdlet ล้างถังรีไซเคิล (ใช้งานได้ใน PowerShell 5.1 และใหม่กว่าบน Windows 10) ในการล้างถังรีไซเคิลโดยไม่แจ้ง ให้รันคำสั่งต่อไปนี้:
Clear-RecycleBin -Forceหากคุณเรียกใช้คำสั่งนี้ในฐานะผู้ใช้ทั่วไปบนโฮสต์ RDS เฉพาะถังรีไซเคิลของผู้ใช้ปัจจุบันเท่านั้นที่จะถูกล้าง คุณสามารถเพิ่มคำสั่งนี้ในสคริปต์ออกจากระบบ GPO เพื่อล้างถังรีไซเคิลเมื่อผู้ใช้ออกจากระบบ:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command Clear-RecycleBin -Confirm:$falseสำหรับ Windows รุ่นก่อนหน้า (ที่มี PowerShell รุ่นเก่ากว่า) คุณสามารถใช้รหัสต่อไปนี้เพื่อล้าง RecycleBin:
$Shell = New-Object -ComObject Shell.Application
$RecycleBin = $Shell.Namespace(0xA)
$RecycleBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}ล้างแคช อุณหภูมิ และโฟลเดอร์ดาวน์โหลดในโปรไฟล์ผู้ใช้ด้วย PowerShell
ลองพิจารณาสคริปต์ PowerShell เพื่อล้าง Temp, Downloads และโฟลเดอร์ชั่วคราวอื่นๆ ในโปรไฟล์ผู้ใช้บน Windows Server RDS หรือคอมพิวเตอร์เดสก์ท็อปที่ใช้ Windows 10/11
ความคิดเห็นสคริปต์:
-
ในตัวอย่างนี้ เราจะลบไฟล์ที่เก่ากว่า 14 วันในโฟลเดอร์ Downloads (คุณสามารถเปลี่ยนตัวเลือกนี้ได้) โฟลเดอร์อื่นที่มีแคชและไฟล์ชั่วคราวจะว่างเปล่า
สคริปต์ทำงานในบริบทของผู้ใช้ปัจจุบัน (สคริปต์จะลบไฟล์เก่าเมื่อผู้ใช้ออกจากระบบ Windows และเรียกใช้เป็นสคริปต์ออกจากระบบ GPO)
หากใช้ในสภาพแวดล้อม RDS ตรวจสอบให้แน่ใจว่าผู้ใช้คลิกปุ่มออกจากระบบ/เข้าสู่ระบบเพื่อสิ้นสุดเซสชัน นอกจากนี้ เราขอแนะนำให้กำหนดค่าการหมดเวลาของเซสชัน RDS เพื่อสิ้นสุดเซสชันหลังจากไม่มีการใช้งานเป็นระยะเวลาหนึ่งโดยอัตโนมัติ
ข้อมูลทั้งหมดเกี่ยวกับไฟล์ที่ถูกลบจะถูกบันทึกลงในไฟล์บันทึกข้อความ (คุณสามารถปิดใช้งานได้หลังจากแก้ไขข้อบกพร่องของสคริปต์ในผู้ใช้ทดสอบ)
นอกจากนี้ยังจะล้างประวัติการเชื่อมต่อ RDP และแคช
โฟลเดอร์ Windows Error Reporting (WER) ในโปรไฟล์ผู้ใช้ถูกล้าง
บรรทัดที่ล้างแคชของ Google Chrome จะถูกใส่ความคิดเห็นไว้ในสคริปต์ หากผู้ใช้ของคุณใช้งานและแคช Chrome ใช้พื้นที่มาก ให้ยกเลิกการใส่ความคิดเห็นในบรรทัดที่มีเส้นทาง
คุณสามารถเพิ่มการดำเนินการพิเศษเพื่อตรวจสอบขนาดปัจจุบันของโฟลเดอร์โปรไฟล์ผู้ใช้ก่อนและหลังการล้างข้อมูล (ช่วยให้คุณได้รับข้อมูลที่ถูกต้องมากขึ้น แต่ต้องใช้เวลา) หรือคุณสามารถตรวจสอบพื้นที่ว่างในดิสก์ก่อนและหลัง (ทำได้อย่างรวดเร็ว)
# You can use this script to clean folders in a user profile (cache, temp, downloads, google chrome cache) on RDS hosts, VDIs, or workstations
# Run the PowerShell script under a commaon user account (no administrator privileges are required). Only temporary files and the current user's cache are deleted.
# You can run this script via GPO (logoff script) or with the Task Scheduler
# Test the script in your environment and then remove the WhatIf option to permanently delete files
$Logfile = "$env:USERPROFILE\cleanup_profile_script.log"
$OldFilesData = (Get-Date).AddDays(-14)
# Complete cleanup of cache folders
[array] $clear_paths = (
'AppData\Local\Temp',
'AppData\Local\Microsoft\Terminal Server Client\Cache',
'AppData\Local\Microsoft\Windows\WER',
'AppData\Local\Microsoft\Windows\AppCache',
'AppData\Local\CrashDumps'
#'AppData\Local\Google\Chrome\User Data\Default\Cache',
#'AppData\Local\Google\Chrome\User Data\Default\Cache2\entries',
#'AppData\Local\Google\Chrome\User Data\Default\Cookies',
#'AppData\Local\Google\Chrome\User Data\Default\Media Cache',
#'AppData\Local\Google\Chrome\User Data\Default\Cookies-Journal'
)
# Folders where only old files should be removed
[array] $clear_old_paths = (
'Downloads'
)
function WriteLog {
Param ([string]$LogString)
$Stamp = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
$LogMessage = "$Stamp $LogString"
Add-content $LogFile -value $LogMessage
}
WriteLog "Starting profile cleanup script"
# If you want to clear the Google Chrome cache folder, stop the chrome.exe process
$currentuser = $env:UserDomain + "\"+ $env:UserName
WriteLog "Stopping Chrome.exe Process for $currentuser"
Get-Process -Name chrome -ErrorAction SilentlyContinue | Where-Object {$_.SI -eq (Get-Process -PID $PID).SessionId} | Stop-Process
Start-Sleep -Seconds 5
# Clean up cache folders
ForEach ($path In $clear_paths) {
If ((Test-Path -Path "$env:USERPROFILE\$path") -eq $true) {
WriteLog "Clearing $env:USERPROFILE\$path"
Remove-Item -Path "$env:USERPROFILE\$path" -Recurse -Force -ErrorAction SilentlyContinue -WhatIf -Verbose 4>&1 | Add-Content $Logfile
}
}
# Delete old files
ForEach ($path_old In $clear_old_paths) {
If ((Test-Path -Path "$env:USERPROFILE\$path_old") -eq $true) {
WriteLog "Clearing $env:USERPROFILE\$path_old"
Get-ChildItem -Path "$env:USERPROFILE\$path_old" -Recurse -Force -ErrorAction SilentlyContinue | Where-Object {($_.LastWriteTime -lt $OldFilesData)} | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue -WhatIf -Verbose 4>&1 | Add-Content $Logfile
}
}
WriteLog "End profile cleanup script"
ในทำนองเดียวกัน คุณสามารถเพิ่มโฟลเดอร์อื่นๆ ที่คุณต้องการล้างข้อมูลในโปรไฟล์ผู้ใช้
$clear_paths.
ดู repo GitHub ของฉันสำหรับสคริปต์เวอร์ชันเต็ม: https://github.com/maxbakhub/winposh/blob/main/RDS/CleanupUserProfile.ps1
สคริปต์ PowerShell นี้สามารถเรียกใช้ได้เมื่อเซสชันเซิร์ฟเวอร์ RDP ของผู้ใช้สิ้นสุดลง วิธีที่ง่ายที่สุดในการกำหนดสคริปต์คือการใช้นโยบาย GPO ออกจากระบบ
สร้าง GPO ใหม่และกำหนดให้กับหน่วยองค์กร (OU) ซึ่งเป็นที่ตั้งของโฮสต์ RDS ของคุณ
เปิดใช้งานตัวเลือกกำหนดค่านโยบายกลุ่มของผู้ใช้ โหมดการประมวลผลย้อนกลับ จำเป็นต้องใช้การตั้งค่าจากส่วนผู้ใช้กับคอมพิวเตอร์
ดูสาเหตุที่นโยบายกลุ่มไม่ถูกนำไปใช้กับคอมพิวเตอร์/ผู้ใช้สำหรับข้อมูลเพิ่มเติม
คัดลอกไฟล์สคริปต์ PowerShell ไปยังโฟลเดอร์ Net logon บนตัวควบคุมโดเมนของคุณ (
\\a-d.site\netlogon\CleanupUserProfile.ps1);
คุณสามารถลงนามรหัสสคริปต์ PowerShell ด้วยใบรับรองเพื่อป้องกันการแก้ไขโดยไม่ได้รับอนุญาต
ไปที่ส่วน GPO User Configuration -> Policies -> Windows Settings -> Scripts -> Logoff เปิดแท็บ สคริปต์ PowerShell และเพิ่มเส้นทาง UNC ไปยังไฟล์ PS1 ใน Netlogon
ออกจากระบบผู้ใช้จาก Windows เพื่อใช้การตั้งค่า GPO ใหม่
เมื่อสิ้นสุดเซสชันผู้ใช้บนเซิร์ฟเวอร์ RDS โฟลเดอร์ที่ระบุจะถูกล้างโดยอัตโนมัติ คุณสามารถดูรายการไฟล์และโฟลเดอร์ที่ถูกลบในไฟล์บันทึกข้อความในโปรไฟล์ผู้ใช้
คุณยังสามารถใช้วิธีการต่อไปนี้ที่อนุญาตให้จัดการขนาดโปรไฟล์ผู้ใช้บนเซิร์ฟเวอร์ Windows Server RDS:
จะลบโปรไฟล์ผู้ใช้เก่าได้อย่างไร
เปิดใช้งานโควต้าดิสก์ NTFS
วิธีการล้างโฟลเดอร์ผู้ใช้ที่กล่าวถึงในที่นี้สามารถนำไปใช้กับทั้งโปรไฟล์ผู้ใช้ที่จัดเก็บไว้ในเครื่องและดิสก์โปรไฟล์ผู้ใช้หรือคอนเทนเนอร์โปรไฟล์ FSlogix บน Windows Server RDSH






