Показать полную графическую версию : [решено] Автоматическое удаление пользователей в системе на состоящей в АД
Daemonstar
27-05-2013, 13:41
Доброго времени суток.
Столкнулся с задачей автоматизировать удаление не используемых системных пользователей на серверах Win Srv 2003 не входящих в АД.
Нашел несколько решений (скриптов) для контроллера домена, для удаления доменных пользователей, а вот для локальных ничего не могу найти.
Буду очень признателен всем кто хотя бы подскажет вектор - куда копать.
Спасибо!
1. Зачем надо именно автоматизировать, почему не ручками? У Вас там что — тасуются ежедневно десятки учётных записей?
2. Укажите отличительные признаки «не используемых» от «используемых».
3. Что означает «системных» в словосочетании «системных пользователей»? Чем они отличаются от прочих?
astomper7
27-05-2013, 16:22
Что означает «системных» в словосочетании «системных пользователей»? »
Скорее всего, имелись в виду пользователи удаленного рабочего стола.
Daemonstar
27-05-2013, 16:43
Добрый день! Спасибо за ответ.
1. Прошу прощения за "корявоизложение", дело в том что как бы это парадоксально не звучало , есть этому некий сакраментальный смысл )) но таких машин порядка дюжины, и они согласно этому смыслу в домен не входят.
2. Для характеристики не используемых учетных записей я приведу пример:
Пришел сотрудник на работу , выдали ему логин/пасс , работа человека не устроила , он уволился через неделю, по истечению N дней от последней авторизации я хочу получить список тех которые не логинились за этот период (N дней), либо без списка а сразу лочу их.
3. «системных пользователей»? Чем они отличаются от прочих? - тем что они пользователи ОС, не СУБД не ВЕБ а именно ОС.
В добавок к выше написанному , хочу приложить официальное решение от Microsoft, но оно работает только на контроллере домена :'(
http://support.microsoft.com/kb/197478
если подсовываю имя хоста в скрипте, получаю нулевой результат.
Daemonstar, ясно. Вопрос звучит так: «Как удалить учётные записи неактивных в течение определённого времени локальных пользователей?». По-простому — примерно так (удалять не будем, только отключать):
Option Explicit
Dim strComputer
Dim objIADsContainer
Dim objIADsUser
Dim dtLastLogon
For Each strComputer In Array("Machine01", "Machine02", "MachineN")
WScript.Echo "[" & strComputer & "]:"
Set objIADsContainer = GetObject("WinNT://" & strComputer & ",computer")
objIADsContainer.Filter = Array("user")
For Each objIADsUser In objIADsContainer
On Error Resume Next
dtLastLogon = CDate(objIADsUser.LastLogin)
If Err.Number = 0 Then
On Error Goto 0
If DateDiff("d", dtLastLogon, Now()) > 90 Then
WScript.Echo " " & objIADsUser.Name & vbTab & dtLastLogon
objIADsUser.AccountDisabled = True
objIADsUser.SetInfo
End If
End If
On Error Goto 0
Next
Next
WScript.Quit 0
Прилагаю также ссылку: Delprof2 - User Profile Deletion Tool • Helge Klein (http://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/).
Daemonstar
28-05-2013, 10:01
Огромное спасибо, Iska! Вы мне очень помогли!
как вариант:
http://fs.exonix.ru/2008/inactive.png
далее выделить всех, правый клик - Disable, Move
Скрин из 2008 R2, но для 2003 вроде так же было.
Daemonstar
28-05-2013, 12:27
Daemonstar, ясно. Вопрос звучит так: «Как удалить учётные записи неактивных в течение определённого времени локальных пользователей?». По-простому — примерно так (удалять не будем, только отключать): »
Вы просто волшебник, но если вас не затруднит, не могли бы дописать user exception_list, то есть как добавить массив пользователей , которых лочить не нужно?
exo, машины не в домене.
добавить массив пользователей , которых лочить не нужно? »
Попробуйте так (не проверялось!):
Option Explicit
Dim objDictExcludeUsers
Dim strComputer
Dim objIADsContainer
Dim objIADsUser
Dim dtLastLogon
Set objDictExcludeUsers = WScript.CreateObject("Scripting.Dictionary")
With objDictExcludeUsers
.Add "Иванов", ""
.Add "Петров", ""
.Add "Сидоров", ""
End With
For Each strComputer In Array("Machine01", "Machine02", "MachineN")
WScript.Echo "[" & strComputer & "]:"
Set objIADsContainer = GetObject("WinNT://" & strComputer & ",computer")
objIADsContainer.Filter = Array("user")
For Each objIADsUser In objIADsContainer
On Error Resume Next
dtLastLogon = CDate(objIADsUser.LastLogin)
If Err.Number = 0 Then
On Error Goto 0
If DateDiff("d", dtLastLogon, Now()) > 90 Then
If Not objDictExcludeUsers.Exists(objIADsUser.Name) Then
WScript.Echo " " & objIADsUser.Name & vbTab & dtLastLogon
objIADsUser.AccountDisabled = True
objIADsUser.SetInfo
End If
End If
End If
On Error Goto 0
Next
Next
Set objDictExcludeUsers = Nothing
WScript.Quit 0
Daemonstar
28-05-2013, 14:53
Попробуйте так (не проверялось!): »
Вы просто гений vbs! :)
Огромное спасибо, работает как часы :)
Daemonstar
28-05-2013, 16:05
Добавлено логирование и мейл нотификация.
Set wshShell = WScript.CreateObject( "WScript.Shell" )
Dim strComputer
Dim objIADsContainer
Dim objIADsUser
Dim dtLastLogon
Dim objDictExcludeUsers
dateStamp = Now()
Set objDictExcludeUsers = WScript.CreateObject("Scripting.Dictionary")
With objDictExcludeUsers
.Add "excludе_login1", ""
.Add "exclude_login2", ""
.Add "exclude_login3", ""
.Add "login4", ""
End With
Set ObjFSO = CreateObject("Scripting.FileSystemObject")
Set objLog = objFSO.CreateTextFile("C:\blocked_users_log.txt")
objLog.WriteLine (cstr(dateStamp))
StrComputer = wshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
Set objIADsContainer = GetObject("WinNT://" & strComputer & ",computer")
objIADsContainer.Filter = Array("user")
For Each objIADsUser In objIADsContainer
On Error Resume Next
dtLastLogon = CDate(objIADsUser.LastLogin)
If Err.Number = 0 Then
On Error Goto 0
If DateDiff("d", dtLastLogon, Now()) > 90 And (objIADsUser.AccountDisabled = False) Then
If Not objDictExcludeUsers.Exists(objIADsUser.Name) Then
objLog.WriteLine "Blocked account: " & objIADsUser.Name & " Last login: " & dtLastLogon & vbNewLine
objIADsUser.AccountDisabled = True
objIADsUser.SetInfo
End If
End If
End If
Next
objLog.Close
On Error Goto 0
Set S = CreateObject("Wscript.Shell")
set FSO=createobject("scripting.filesystemobject")
Call SendPost("smtp.server.com","to_email1@example.com, to_email2@example.com","from_email@example.com","Accounts blocked on "&StrComputer,"")
Function SendPost(strSMTP_Server,strTo,strFrom,strSubject,strBody)
Set iMsg=CreateObject("CDO.Message")
Set iConf=CreateObject("CDO.Configuration")
Set Flds=iConf.Fields
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing")=2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate")=0
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")="blabla"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")="xXx"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.example.com"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25
Flds.Update
iMsg.Configuration=iConf
iMsg.To=strTo
iMsg.From=strFrom
iMsg.Subject=strSubject
iMsg.TextBody=strBody
'iMsg.AddAttachment "C:\blocked_users_log.txt"
Const FileToBeUsed = "C:\blocked_users_log.txt"
Set objLog = objFSO.OpenTextFile(FileToBeUsed)
'** The ReadAll method reads the entire file into the variable BodyText
iMsg.Textbody = objLog.ReadAll
'** Close the file
objLog.Close
'** Clear variables
Set objLog = Nothing
iMsg.Send
End Function
Set iMsg=Nothing
Set iConf=Nothing
Set Flds=Nothing
WScript.Quit 0
Daemonstar, добавьте ещё оформление кода тэгом [code] (http://forum.oszone.net/misc.php?do=bbcode#code).
DmitriiV
29-05-2013, 07:36
Для работы со списком исключений (в данном случае) можно обойтись только строковыми функциями. Я обычно делаю так:
strExclude = "Иванова;Петров;Сидоров;"
strUser = "Иванов"
If InStr(1, strExclude, strUser & ";", vbTextCompare) = 0 Then
WScript.Echo "Не является исключением."
Else
WScript.Echo "Является исключением."
End If
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.