Назад | Перейти на главную страницу

У кого-нибудь есть сценарий для удаления определенного локального профиля Windows?

Я ищу сценарий Powershell (предпочтительно) или .CMD или .VBS, чтобы удалить конкретный профиль пользователя на рабочей станции (WinXP) или терминальном сервере (2000, '03 или '08). Я знаю все об утилите delprof ... Она позволяет удалять только в зависимости от периода бездействия. Я хочу, чтобы сценарий:

Любые идеи? Все, о чем я могу думать, это выполнить поиск в AD, чтобы получить SID указанного пользователя, а затем использовать его для удаления правильного куста реестра ... хотя было бы неплохо что-то попроще ...

По сути, мой HelpDesk был локальными администраторами на наших серверах Citrix, и обычным решением для различных проблем было удаление профиля пользователя на сервере (ах) Citrix и повторное вход в систему этого пользователя - вуаля, какая бы проблема у них ни была. решено. В будущем в новой среде Citrix они больше не будут локальными администраторами в этих ящиках, но по-прежнему должны иметь возможность удалять профили (ключевым моментом является удаление всего профиля: папка и реестр). Спасибо.

Я написал этот сценарий VB для аналогичного вопроса о сбое сервера. Он будет циклически перебирать каждый профиль на целевой машине и запрашивать (один за другим), хотите ли вы удалить профиль. Он делает это с помощью WMI Win32_UserProfile, так что это будет чистое удаление.

Он запросит у вас полное доменное имя целевой машины. Если вы получаете ошибки разрешений, измените имя пользователя и пароль, чтобы отразить учетную запись, имеющую права локального администратора на целевой машине.

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.

Я думаю, что консалтинговая компания Cntrl + Alt + Del в Австралии разработала инструмент, который может вам помочь. Это называется REMPROF, и с помощью этой команды вы можете просто удалить один профиль с сервера. Конечно, вам нужно будет подставить фактическое имя пользователя в команду:

remprof USERNAME

Я не верю, что вы можете запустить это удаленно с другого сервера, и, к сожалению, вы не можете запустить это без прав администратора. Я не верю, что ваша служба поддержки сможет управлять пользователями и профилями пользователей на любом сервере, не будучи членом группы локальных администраторов.

В любом случае вы можете загрузить REMPROF и многие другие полезные инструменты с веб-сайта Cntrl + Alt + Del Consultancy здесь:

http://www.ctrl-alt-del.com.au/CAD_TSUtils.htm

Надеюсь, это поможет.

Алисия

tsprofilecleaner - это бесплатный графический интерфейс, который может удалить профиль из списка серверов: текст ссылки

Powershell делает это довольно просто, если вы используете компьютер с Windows 7 или Windows 2008.

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

Вместо этого мы решили, что нет достаточно веских причин для хранения каких-либо профилей на серверах Citrix (они все равно перемещаются с перенаправлением любых реальных данных), поэтому мы установили политику для удаления профиля при выходе пользователя из системы. спасибо всем за предложения.

Мы используем User Profile Hive Cleanup Service + небольшой скрипт, который удаляет весь профиль USER при запуске сервера. Работаю хорошо

Вы можете использовать delprof или remprof для удаления профиля. Вы можете создать сценарий из этих команд или использовать tsprofcleaner.

Улей пользователей находится в их пользовательском каталоге (NTUSER.DAT), поэтому удаление каталога с rmdir /s /q {username} должно хватить. Единственная часть, которая не будет удалена, находится в списке профилей в реестре. HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList но все, что это делает, - это сопоставлять SID с местоположением профиля.

Если пользователь входит в систему, а каталог не существует, он будет создан снова.

К сожалению, без повышения их статуса администраторов они не смогут удалять профили пользователей.

Пакетный файл:

set /p USERTODEL=Enter the username to delete: 
set USERTODEL=C:\Users\%USERTODEL%
if exist "%USERTODEL%" rmdir /s /q %USERTODEL%