有人有可以删除特定本地 Windows 配置文件的脚本吗?

有人有可以删除特定本地 Windows 配置文件的脚本吗?

我正在寻找 Powershell(首选)脚本或 .CMD 或 .VBS 来删除具体的工作站 (WinXP) 或终端服务器 (2000、'03 或 '08) 上的用户配置文件。我了解 delprof 实用程序的所有信息... 它只允许您根据一段时间的不活动进行删除。我想要一个脚本来:

  • 提示管理员输入用户名
  • 删除该用户名的个人资料
    • 并删除整个配置文件 - 注册表配置单元(不仅仅是 Documents and Settings 内的文件夹结构)。
    • 就像你去我的电脑>属性>高级选项卡>用户配置文件设置>并从那里删除了个人资料。

有什么想法吗?我能想到的就是进行 AD 查找以获取指定用户的 SID,然后使用它删除正确的注册表配置单元...不过,更简单的做法会更好...

基本上,我的帮助台曾经是我们 Citrix 服务器上的本地管理员,解决各种问题的常见方法是删除 citrix 服务器上的用户配置文件,然后让该用户重新登录 - 瞧,他们遇到的任何问题都解决了。今后,在新的 Citrix 环境中,他们将不再是这些机器上的本地管理员,但仍然需要能够删除配置文件(删除整个配置文件:文件夹和注册表配置单元是关键)。谢谢。

答案1

如果您使用的是 Windows 7 或 Windows 2008 计算机,Powershell 可以以非常简单的方式完成此操作。

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

答案2

我为 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 中重命名用户帐户时出现问题。

答案3

tsprofilecleaner 是一个免费的 GUI,可以从服务器列表中删除配置文件: 链接文本

答案4

相反,我们认为没有足够的理由在 Citrix 服务器上保留任何配置文件(它们无论如何都会漫游,任何实际数据都会被重定向)所以我们设置了在用户注销时删除配置文件的策略。感谢大家的建议。

相关内容