כיצד למחוק פרופילי משתמשים ישנים ב- Windows
מנהלי מערכת צריכים מדי פעם למחוק פרופילי משתמש ישנים (משתמשים שיצאו משימוש או לא פעילים וכו') מ- C:\Users בתחנות עבודה ובשרתים של Windows. משימת ניקוי פרופיל המשתמש של Windows מבוצעת לרוב בשרתי מסוף של שירותי שולחן עבודה מרוחק (RDS).
הבעיה העיקרית עם שרתי RDS היא הגידול המתמיד בגודל ספריות פרופיל המשתמש בדיסק הקשיח. בעיה זו נפתרת חלקית על-ידי מיכסות גודל פרופיל משתמש באמצעות מיכסות FSRM או NTFS, שימוש בפרופילי נדידה כגון FSLogix או דיסק פרופיל משתמש, תיקיות מנותבות מחדש וכו '. עם זאת, אם יש לך מספר גדול של משתמשי RDS, עם הזמן התיקיה C:\Users תכיל מספר רב של ספריות עם פרופילי משתמש ישנים (שאינם בשימוש).
כיצד למחוק פרופיל משתמש ב- Windows באופן ידני?
ב- Windows, באפשרותך למחוק פרופיל באופן ידני מלוח הבקרה:
פתח את הגדרות מערכת מתקדמות (הפעל את הפקודה
SystemPropertiesAdvanced) ועבור אל פרופילי משתמשים -> הגדרות;
-
חלון זה מפרט את כל פרופילי המשתמש (חשבונות מקומיים, חשבונות תחום וחשבונות Microsoft) המאוחסנים במחשב זה. הגודל של כל פרופיל משתמש בדיסק מופיע בעמודה גודל;
בחר את המשתמש שאת הפרופיל שלו ברצונך למחוק ולחץ על הלחצן מחק.
ב- Windows 11/10 וב- Windows Server 2022/2019, באפשרותך למחוק פרופילי משתמשים מהדיסק באמצעות האפליקציה הגדרות. עבור אל חשבונות -> גישה לעבודה וללימודים (או הפעל את קיצור הדרך ל- URI
ms-settings:otherusers). בחר משתמש ולחץ על הסר כדי למחוק את נתוני הפרופיל שלו מהמחשב.
כאשר פרופיל משתמש נמחק כהלכה ב- Windows, ספריית הפרופילים ב- C:\Users וערך המשתמש ברישום נמחקים.
מנהלי מערכת מתחילים רבים מנסים להסיר באופן ידני את ספריית פרופיל המשתמש מהתיקיה C:\Users. במקרה זה, יהיה עליך למחוק באופן ידני את הפניית הפרופיל מהרישום של Windows:
הפעל את עורך הרישום (
regedit.exe);
-
עבור אל מפתח הרישום HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList;
עבור כל משתמש המחובר באופן מקומי (שיטת התחברות זו חייבת להיות מותרת עבור המשתמש על ידי האפשרות אפשר כניסה מקומית GPO), מפתח משנה נפרד נוצר עם SID של המשתמש כשם;
באפשרותך למצוא את מפתח הרישום המתאים למשתמש לפי ה- SID שלו, או לעיין ידנית בתוכן של כל מפתחות המשנה עד שתמצא מפתח שבו הערך ProfileImagePath מצביע על הספרייה עם פרופיל המשתמש בדיסק (לדוגמה,
C:\Users\j.smith);
מחק מפתח רישום זה כדי להשלים את ההסרה הנכונה של הפרופיל.
באפשרותך גם למחוק פרופיל של משתמש ספציפי באמצעות PowerShell:
Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.LocalPath.split(‘\’)[-1] -eq 'j.smith' } | Remove-CimInstanceפקודה זו מסירה הן את ספריית הכונן הקשיח והן את
j.smithהפניה לפרופיל משתמש uthe nder HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList registry.
פקודה זו פועלת הן ב- Windows PowerShell והן בגירסאות חדשות של PowerShell Core 6.x, 7.x.
באפשרותך להסיר פרופיל משתמש במחשב מרוחק באמצעות PowerShell Remoting וה- cmdlet Invoke-Command:
$compname="mun-wks92s3"
$user = "j.smith"
Invoke-Command -ComputerName $compname -ScriptBlock {
param($user)
Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.LocalPath.split(‘\’)[-1] -eq $user } | Remove-CimInstance
} -ArgumentList $userGPO: מחיקת פרופילי משתמשים שגילם עולה על מספר ימים מוגדר
ב- Windows, קיימת אפשרות מוכללת של מדיניות קבוצתית למחיקה אוטומטית של פרופילי משתמשים שגילם עולה על xx ימים. באפשרותך להפוך אפשרות זו לזמינה באמצעות עורך המדיניות הקבוצתית המקומית (
gpedit.msc) או עם מסוף ניהול GPO של התחום (
gpmc.msc). בדוגמה זו, נחיל מדיניות ניקוי פרופיל אוטומטית על מארחים בחוות RDS הנמצאים בגורם מכיל נפרד (יחידה ארגונית, OU) ב- Active Directory.
לפני החלת מדיניות פרופילי הניקוי על כל המארחים, מומלץ מאוד לבדוק אותה על מארח בדיקה. שים את אחד משרתי RDSH במצב תחזוקה (ניקוז) ובדוק את המדיניות עליו.
אתר את ה-OU המכיל את המחשבים/שרתים שעליהם ברצונך להחיל את מדיניות ניקוי פרופיל המשתמש. לחץ לחיצה ימנית על ה- OU ובחר צור GPO בתחום זה וקשר אותו לכאן;
ציין את שם המדיניות וערוך את GPO;
נווט אל תצורת מחשב -> תבניות מנהליות -> מערכת -> פרופילי משתמשים;
פתח את האפשרות מחק פרופילי משתמשים שגילם עולה על מספר ימים שצוין בעת הפעלה מחדש של המערכת;
הפוך את המדיניות לזמינה וציין את מספר הימים שבהם פרופיל משתמש נחשב לפעיל. כאשר תקופה זו תסתיים, שירות פרופילי המשתמשים של Windows ימחק באופן אוטומטי את הפרופיל בהפעלה מחדש הבאה. מומלץ לציין כאן את התקופה של 45-90 יום;
לאחר החלת הגדרות המדיניות הקבוצתית החדשות, שירות פרופילי המשתמשים ב- Windows Server ימחק באופן אוטומטי את פרופילי המשתמשים הישנים. פרופילי משתמשים יימחקו באתחול השרת הבא.
אם אתה משתמש במדיניות זו, עליך לוודא שאין בעיות בזמן המערכת כאשר השרת מופסק/מופעל מחדש (עיין במאמר "שינויי זמן ותאריך של המערכת לאחר אתחול מחדש "). אחרת, פרופילי משתמשים פעילים עלולים להימחק.
חסרון נוסף הוא שלא ניתן למנוע הסרה של פרופילים מסוימים, כגון חשבונות מקומיים, מנהלי מערכת וכו'.
מדיניות זו לא פעלה כראוי בגירסאות שקדמו ל- Windows 11/10 ול- Windows Server 2022/2019. בעבר, חוסר הפעילות של פרופיל המשתמש נקבע לפי תאריך שינוי הקובץ NTUSER.dat. בעת התקנת עדכוני Windows, שירות המתקין המהימן יכול לשנות את תאריך השינוי של קובץ NTUSER.dat בפרופיל של כל משתמש. כתוצאה מכך, שירות Win32_UserProfile חושב כי הפרופיל שימש לאחרונה.
בגירסאות מודרניות של Windows, אפשרות מדיניות קבוצתית זו בודקת את פעילות פרופיל המשתמש מול הערכים של הפרמטרים LocalProfileUnloadTimeLow ו- LocalProfileUnloadTimeHigh תחת ב- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\<USER_SID>
באפשרותך להשתמש בקובץ ה-script הבא כדי לקבל את ערכי הרישום LocalProfileLoadTimeLow ו- LocalProfileUnloadTimeHigh בתבנית זמן רגילה:
$profilelist = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
foreach ($p in $profilelist) {
try {
$objUser = (New-Object System.Security.Principal.SecurityIdentifier($p.PSChildName)).Translate([System.Security.Principal.NTAccount]).value
} catch {
$objUser = "[UNKNOWN]"
}
Remove-Variable -Force LTH,LTL,UTH,UTL -ErrorAction SilentlyContinue
$LTH = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileLoadTimeHigh -ErrorAction SilentlyContinue).LocalProfileLoadTimeHigh
$LTL = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileLoadTimeLow -ErrorAction SilentlyContinue).LocalProfileLoadTimeLow
$UTH = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileUnloadTimeHigh -ErrorAction SilentlyContinue).LocalProfileUnloadTimeHigh
$UTL = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileUnloadTimeLow -ErrorAction SilentlyContinue).LocalProfileUnloadTimeLow
$LoadTime = if ($LTH -and $LTL) {
[datetime]::FromFileTime("0x$LTH$LTL")
} else {
$null
}
$UnloadTime = if ($UTH -and $UTL) {
[datetime]::FromFileTime("0x$UTH$UTL")
} else {
$null
}
[pscustomobject][ordered]@{
User = $objUser
SID = $p.PSChildName
Loadtime = $LoadTime
UnloadTime = $UnloadTime
}
}
רשימה זו מכילה את זמן הטעינה האחרון עבור כל פרופיל משתמש.
מחיקת פרופילי משתמשים ישנים באמצעות PowerShell Script
במקום להשתמש במדיניות ניקוי הפרופיל האוטומטי המתוארת לעיל, באפשרותך להשתמש בקובץ script פשוט של PowerShell כדי לחפש ולהסיר פרופילים של משתמשים לא זמינים או לא פעילים.
ראשית, בואו ננסה לחשב את גודל הפרופיל של כל משתמש ב- C:\Users באמצעות סקריפט פשוט מתוך המאמר קבלת גודל תיקיה עם PowerShell
gci -force ‘C:\Users\’-ErrorAction SilentlyContinue | Where { !($_.Attributes -match " ReparsePoint") }| ? { $_ -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 הוא כ- 32 GB.
קובץ Script מתעלם מקישורים סמליים (קישורים סימבוליים) של Windows בעת חישוב גודל פרופיל המשתמש.
בואו נראה את רשימת המשתמשים שהפרופילים שלהם לא היו בשימוש במשך יותר מ -60 יום. באפשרותך להשתמש בערך בשדה LastUseTime של הפרופיל כדי למצוא אותם.
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}| Measure-Objectהתברר שהיו לי 127 חשבונות משתמש לא פעילים במארח RDS שלי (עם פרופילים בגודל כולל של כ -18 GB).
קובץ ה-script הבא של PowerShell מפרט את הפרטים של פרופילי משתמשים שלא עודכנו במשך יותר מ- 60 יום. קובץ ה- Script ממיר את ה- SID של המשתמש לשם, מחשב את גודל הפרופיל של כל משתמש ומציג טבלה שנוצרה:
$allprofilesinfo = @()
$OldProfiles=Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}
Foreach ($OldProfile in $OldProfiles)
{$objSID = New-Object System.Security.Principal.SecurityIdentifier ($OldProfile.SID)
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$userinfo = New-Object PSObject -Property @{
userName = $objUser.Value
ProfilePath = $OldProfile.localpath
LastUsedDate = $OldProfile.ConvertToDateTime($OldProfile.LastUseTime)
FolderSize = "{0:N2} GB" -f ((gci -force $OldProfile.localpath -Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)
}
$allprofilesinfo += $userinfo
}
$allprofilesinfoכדי להסיר את כל פרופילי המשתמש הללו, מספיק להעביר את רשימת המשתמשים לפקודה Remove-WmiObject (מומלץ לבדוק את הפלט של הסקריפט עם הפרמטר -WhatIf לפני הפעלתו):
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-30))} | Remove-WmiObject -WhatIfכפי שצוין קודם לכן, בעת התקנת עדכונים מסוימים של Windows, שירות המתקין המהימן יכול לשנות את תאריך השינוי של קובץ NTUSER.dat בפרופיל של כל משתמש.
צילום המסך לעיל מראה שכל הפרופילים השתנו בערך באותו זמן. בדוק את תאריך העדכונים האחרונים המותקנים ב- Windows:
gwmi win32_quickfixengineering |sort installedon |select InstalledOn -Last 1או באמצעות מודול PSWindowsUpdate:
Get-WUHistory | Select-Object -First 10סביר להניח שזה יחפוף לתאריך שינוי הפרופילים. לכן, בגירסאות קודמות של Windows, באפשרותך לקבל רשימה של פרופילים לא פעילים באמצעות קובץ script אחר הבודק את התכונה lastwritetime של ספריית הפרופילים של המשתמש:
$USERS= (Get-ChildItem -directory -force 'C:\Users' | Where { ((Get-Date) — $_.lastwritetime).days -ge 60 } | % {'c:\users\' + $_.Name})
foreach ($User in $USERS) {
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.LocalPath -eq $User)} | Remove-WmiObject WhatIf }כדי להימנע ממחיקת פרופילים של משתמשים מסוימים (כגון חשבונות מערכת ושירות רשת, חשבון מנהל מערכת מקומי, חשבונות של משתמשים בעלי הפעלות פעילות וחשבונות אחרים מרשימת החריגים), באפשרותך לשנות את קובץ ה- Script באופן הבא:
#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
}
}באפשרותך להפעיל קובץ script זה של PowerShell באמצעות GPO בעת כיבוי או באמצעות קובץ script של PowerShell במתזמן המשימות.
מומלץ לבדוק את הסקריפט בסביבה שלך לפני הגדרת מחיקת פרופיל אוטומטית!
באפשרותך לשנות את הסקריפט כדי למחוק באופן אוטומטי את כל פרופילי המשתמש שנוספו לקבוצת AD הספציפית. לדוגמה, ברצונך למחוק את הפרופילים של משתמשים שעזבו. פשוט הוסף חשבונות אלה לקבוצה DisabledUsers והפעל את הסקריפט במארח היעד:
$users = Get-ADGroupMember -Identity DisabledUsers | Foreach {$_.Sid.Value}
$profiles = Get-WmiObject Win32_UserProfile
$profiles | Where {$users -eq $_.Sid} | Foreach {$_.Delete()}








