บนเวิร์กสเตชันและเซิร์ฟเวอร์ Windows โดยเฉพาะเซิร์ฟเวอร์ RDS (Remote Desktop Services) มีความจำเป็นเป็นประจำในการลบโปรไฟล์ผู้ใช้เก่า (ที่ไม่ได้ใช้) จาก C:\Users ปัญหาหลักของเซิร์ฟเวอร์ Remote Desktop ใดๆ คือการเติบโตอย่างต่อเนื่องของขนาดไดเรกทอรีโปรไฟล์ผู้ใช้บนไดรฟ์ท้องถิ่น มันได้รับการแก้ไขบางส่วนโดยการเปิดใช้งานโควต้าบนขนาดโปรไฟล์ผู้ใช้สูงสุด (ด้วย FSRM หรือโควต้า NTFS) อย่างไรก็ตาม หากมีผู้ใช้เซิร์ฟเวอร์เทอร์มินัลมาก โฟลเดอร์ C:\Users จะสะสมไดเรกทอรีจำนวนมากพร้อมโปรไฟล์ผู้ใช้ที่ไม่จำเป็นอีกต่อไป
วิธีลบโปรไฟล์ผู้ใช้ด้วยตนเองใน Windows
ผู้ดูแลระบบ Windows มือใหม่หลายคนพยายามลบโฟลเดอร์โปรไฟล์ผู้ใช้จาก C:\Users ด้วยตนเอง คุณสามารถทำได้หากหลังจากลบโฟลเดอร์ด้วยตนเองแล้ว คุณจะลบส่วนโปรไฟล์ผู้ใช้ที่มีลิงก์ไปยังโฟลเดอร์นี้จากคีย์รีจิสทรี HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProfileList
วิธีที่ถูกต้องในการลบโปรไฟล์ผู้ใช้ใน Windows ด้วยตนเองคือเปิด System Properties ไปที่ Advanced System Settings -> User Profiles -> Settings เลือกผู้ใช้ในรายการ (คอลัมน์ Size แสดงขนาดของโปรไฟล์บนไดรฟ์ท้องถิ่น) และคลิกปุ่ม Delete

แต่นี่คือวิธีด้วยตนเอง และคุณอาจต้องการทำให้มันอัตโนมัติ
GPO: ลบโปรไฟล์ผู้ใช้ที่เก่ากว่าจำนวนวันที่ระบุ
ใน Windows มี Group Policy สร้างในสำหรับลบโปรไฟล์ผู้ใช้ที่เก่ากว่าจำนวนวัน xx โดยอัตโนมัติ คุณสามารถค้นหานโยบาย Delete user profiles older than a specified number days on system restart ในส่วน GPO Computer Configuration -> Administrative Templates -> System -> User Profiles คุณสามารถเปิดใช้นโยบายนี้ใน Local Group Policy Editor (gpedit.msc) หรือโดยใช้นโยบายโดเมนใน GPMC.msc
เปิดใช้นโยบายและระบุจำนวนวันที่โปรไฟล์ผู้ใช้ถือว่าใช้งานอยู่ เมื่อช่วงเวลานี้สิ้นสุด บริการโปรไฟล์ผู้ใช้ Windows จะลบโปรไฟล์โดยอัตโนมัติในการรีสตาร์ทครั้งถัดไป แนะนำให้ระบุช่วงเวลา 45-90 วันที่นี่

เมื่อใช้นโยบายนี้ ตรวจสอบให้แน่ใจว่าเมื่อเซิร์ฟเวอร์ปิดหรือรีสตาร์ท ไม่มีปัญหากับเวลาระบบ (ตรวจสอบบทความ "System time and date changes after reboot") มิฉะนั้นโปรไฟล์ผู้ใช้ที่ใช้งานอยู่อาจถูกลบ
ปัญหาหลักที่เกี่ยวข้องกับวิธีการลบโปรไฟล์อัตโนมัติที่อธิบายข้างต้น คือการรอการรีสตาร์ทเซิร์ฟเวอร์และไม่เป็นเลือกได้ (คุณไม่สามารถห้ามการลบโปรไฟล์ผู้ใช้บางโปรไฟล์ เช่น บัญชีท้องถิ่น บัญชีผู้ดูแลระบบ เป็นต้น) นอกจากนี้ นโยบายนี้อาจไม่ทำงาน หากซอฟต์แวร์ภายนอกบางอย่าง (บ่อยครั้งมากที่สุดคือแอนตี้ไวรัส) เข้าถึงไฟล์ NTUSER.DAT ในโปรไฟล์ผู้ใช้และอัปเดตวันที่ใช้ล่าสุด
สคริปต์ PowerShell เพื่อลบโปรไฟล์ผู้ใช้เก่าใน Windows
แทนที่จะใช้นโยบายการล้างโปรไฟล์อัตโนมัติที่อธิบายข้างต้น คุณสามารถใช้สคริปต์ PowerShell เรียบง่ายเพื่อค้นหาและลบโปรไฟล์ของผู้ใช้ที่ถูกปิดใช้งานหรือไม่ได้ใช้งาน
ขั้นแรก มาลองนับขนาดของโฟลเดอร์โปรไฟล์ผู้ใช้ทั้งหมดใน C:\Users โดยใช้สคริปต์ง่ายๆ จากบทความ Getting Directory Sizes in PowerShell:
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
$sum = $sum + $len
}
"Total size of profiles",'{0:N2} GB' -f ($sum / 1Gb)
ขนาดรวมของโปรไฟล์ผู้ใช้ทั้งหมดใน C:\Users คือ 31.5 GB

มาแสดงรายการผู้ใช้ที่โปรไฟล์ของพวกเขาไม่ได้ถูกใช้งานมานานกว่า 60 วัน เพื่อค้นหาพวกเขา คุณสามารถใช้ค่าในฟิลด์ LastUseTime ของโปรไฟล์
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}| Measure-Object
พบว่าผมมีบัญชีผู้ใช้ที่ไม่ได้ใช้งาน 127 บัญชีบนโฮสต์ RDS (ขนาดโปรไฟล์รวมประมาณ 18 GB)

เพื่อลบโปรไฟล์ทั้งหมดนี้ เพียงพอที่จะส่งรายการผู้ใช้ไปยังคำสั่ง Remove-WmiObject (ก่อนรันสคริปต์ แนะนำให้ตรวจสอบเอาต์พุตของมันซ้ำโดยใช้พารามิเตอร์ –WhatIf):
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-30))} | Remove-WmiObject –WhatIf
เพื่อไม่ให้ลบโปรไฟล์ของบางผู้ใช้ เช่น บัญชี System และ Network Service, บัญชี local administrator, บัญชีของผู้ใช้ที่มีเซสชันใช้งานอยู่, รายการ exception ของบัญชี) คุณสามารถแก้ไขสคริปต์ดังนี้:
#The list of accounts, which profiles must not be deleted
$ExcludedUsers ="Public","zabbix_agent","svc",”user_1”,”user_2”
$LocalProfiles=Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}
foreach ($LocalProfile in $LocalProfiles)
{
if (!($ExcludedUsers -like $LocalProfile.LocalPath.Replace("C:\Users\","")))
{
$LocalProfile | Remove-WmiObject
Write-host $LocalProfile.LocalPath, "profile deleted” -ForegroundColor Magenta
}
}
คุณสามารถรันสคริปต์ PowerShell นี้โดยใช้ GPO ที่ shutdown หรือด้วยสคริปท PoSh ใน Task Scheduler
ก่อนกำหนดค่าการลบโปรไฟล์อัตโนมัติ แนะนำให้ทดสอบสคริปต์ในสภาพแวดล้อมของคุณ!
คุณสามารถแก้ไขสคริปต์เพื่อลบโปรไฟล์ผู้ใช้ทั้งหมดที่เพิ่มลงในกลุ่ม AD เฉพาะ (เช่น กลุ่ม DisabledUsers) โดยอัตโนมัติ:
$users = Get-ADGroupMember -Identity DisabledUsers | Foreach {$_.Sid.Value}
$profiles = Get-WmiObject Win32_UserProfile
$profiles | Where {$users -eq $_.Sid} | Foreach {$_.Delete()}