Windows

任何人都有刪除特定本地 Windows 配置文件的腳本?

  • August 5, 2013

我正在尋找 Powershell(首選)腳本或 .CMD 或 .VBS,以刪除工作站 (WinXP) 或終端伺服器(2000、‘03 或 ‘08)上的**特定使用者配置文件。**我對 delprof 實用程序瞭如指掌……這只允許您根據一段時間不活動進行刪除。我想要一個腳本:

  • 提示管理員輸入使用者名

  • 刪除該使用者名的個人資料

    • 並刪除整個配置文件 - 系統資料庫配置單元(不僅僅是文件和設置中的文件夾結構)。
    • 如果您轉到“*我的電腦”>“屬性”>“高級”選項卡>“使用者配置文件設置”>*並從那裡刪除配置文件,則方法相同。

有任何想法嗎?我能想到的只是進行 AD 查找以獲取指定使用者的 SID,然後使用它來刪除正確的系統資料庫配置單元……不過,更簡單的東西會很好……

基本上,我的 HelpDesk 曾經是我們 Citrix 伺服器上的本地管理員,解決各種問題的常見方法是讓他們刪除 citrix 伺服器上的使用者配置文件並讓該使用者重新登錄 - 瞧,無論他們遇到什麼問題解決。展望未來,在新的 Citrix 環境中,他們將不再是這些框的本地管理員,但仍需要能夠刪除配置文件(刪除整個配置文件:文件夾和系統資料庫是關鍵)。謝謝。

如果您使用的是 Windows 7 或 Windows 2008 電腦,Powershell 會以非常簡單的方式完成此操作。

http://techibee.com/powershell/powershell-script-to-delete-windows-user-profiles-on-windows-7windows-2008-r2/1556

我為 Server Fault 上的一個類似問題編寫了這個 VB 腳本。它將循環瀏覽目標機器上的每個配置文件,並(一一)提示您是否要刪除配置文件。它使用 WMI Win32_UserProfile 執行此操作,因此將完全刪除。

它會詢問您目標機器的 FQDN。如果您遇到權限錯誤,請更改使用者名和密碼以反映在目標電腦上具有本地管理員權限的帳戶。

Option Explicit
On Error Resume Next

Dim strComputer
Dim objWMIService
Dim propValue
Dim objItem
Dim SWBemlocator
Dim UserName
Dim Password
Dim colItems
Dim strMessage
Dim deleteResponse

strComputer = ""
UserName = ""
Password = ""
strMessage = ""

strComputer = InputBox("Please enter the FQDN of the new computer:")

If strComputer = "" Then
   WScript.quit
End If

If Not Ping (strComputer) Then
   MsgBox "The computer (" + strComputer + ") is not responding to ping - exiting"
   WScript.quit
End if

Set SWBemlocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = SWBemlocator.ConnectServer(strComputer,"root\CIMV2",UserName,Password)
Set colItems = objWMIService.ExecQuery("Select * from Win32_UserProfile",,48)
For Each objItem in colItems
   strMessage = ""
   If not objItem.LastDownloadTime = "" Then 
       strMessage = strMessage + "LastDownloadTime: " & left(objItem.LastDownloadTime,8) + Chr(10) + Chr(13)
   End If

   If Not objItem.LastUploadTime = "" Then
       strMessage = strMessage + "LastUploadTime: " & left(objItem.LastUploadTime,8) + Chr(10) + Chr(13)
   End if

   if not objItem.LastUseTime = "" then
       strMessage = strMessage + "LastUseTime: " & left(objItem.LastUseTime,8) + Chr(10) + Chr(13)
   End If

   If Not objItem.Loaded  = "" Then
       strMessage = strMessage + "Loaded: " & objItem.Loaded + Chr(10) + Chr(13)
   End If

   If not objItem.LocalPath = "" then
       strMessage = strMessage + "LocalPath: " & objItem.LocalPath + Chr(10) + Chr(13)
   End If

   if not objItem.RefCount = "" then
       strMessage = strMessage + "RefCount: " & objItem.RefCount + Chr(10) + Chr(13)
   End If

   if not objItem.RoamingConfigured = "" then
       strMessage = strMessage + "RoamingConfigured: " & objItem.RoamingConfigured + Chr(10) + Chr(13)
   End If

   if not objItem.RoamingPath = "" then
       strMessage = strMessage + "RoamingPath: " & objItem.RoamingPath + Chr(10) + Chr(13)
   End If

   if not objItem.RoamingPreference = "" then
       strMessage = strMessage + "RoamingPreference: " & objItem.RoamingPreference + Chr(10) + Chr(13)
   End If

   if not objItem.SID = "" then
       strMessage = strMessage + "SID: " & objItem.SID + Chr(10) + Chr(13)
   End If

   if not objItem.Special = "" then
       strMessage = strMessage + "Special: " & objItem.Special + Chr(10) + Chr(13)
   End If

   if not objItem.Status = "" then
       strMessage = strMessage + "Status: " & objItem.Status + Chr(10) + Chr(13)
   End If

   strMessage = strMessage + Chr(10) + Chr(13) + Chr(10) + Chr(13) + "Do you wish to delete this profile?"

   deleteResponse = MsgBox (strMessage,35,"Profile Found")

   Select Case deleteResponse
       Case 6
               Err.Clear
               objItem.Delete_
               If Err.Number = 0 Then 
                       MsgBox("Profile " & objitem.localpath & " on " & strComputer & " deleted")
               Else
                       MsgBox("Profile " & objitem.localpath & " on " & strComputer & " NOT deleted - Is user logged in?")             
               End If
   End Select

Next

Function Ping(strHost)

   dim objPing, objRetStatus

   set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
     ("select * from Win32_PingStatus where address = '" & strHost & "'")

   for each objRetStatus in objPing
       if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode<>0 then
               Ping = False
       else
           Ping = True
       end if
   Next
End Function

使用您詳述的相同工作流程(它首先請求使用者名)不起作用。這種方法的問題是 Win32_UserProfile 不包含使用者名,僅包含 SID。當使用者登錄機器時,SID 用於決定哪個配置文件是正確的。這可以防止在 AD 中重命名使用者帳戶時出現問題。

引用自:https://serverfault.com/questions/73062