Я ищу сценарий 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.
Вместо этого мы решили, что нет достаточно веских причин для хранения каких-либо профилей на серверах 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%