Не мудрено, что следить за всем и вся порой нет времени или возможности.
Или хотя бы взять простой пример - в Вашей организации несколько сотен сотрудников, работающих за персональным компьютером. Сотрудники имеют свойство увольняться и приходить новые - так уж у нас в стране по нынешним временам заведено. Когда приходит новый сотрудник или увольняется кто-либо, то порой не всегда об этом сообщают в IT-отдел. А ещё хуже, когда при приходе нового сотрудника просто передают учётные данные старого сотрудника новому и он спокойно начинает работать не под своими учётными данными - этот момент конечно же тяжелее выявить вручную, ну а вот на счёт увольнения старых - это по проще. Можно написать скрипт, который будет отслеживать старые записи учётных записей компьютеров и пользователей в AD и сообщать об этом админу.
Но, прежде чем к делу, расскажу я о том, какую небольшую реорганизацию в AD я произвёл и скрипт я писал, учитывая эту реорганизацию. Итак по порядку:
Создаём в AD подразделение или контейнер RemovedUsers (для скрипта не имеет роли cn или ou контейнер!).
Внутри этого контейнера я создаю ещё ряд контейнеров. Самый главный - это Dekret (сюда я размещаю заблокированные учётки сотрудниц, которые ушли в декретный отпуск) и, контейнер с нынешним годом (например 2013), и это ещё не самое главное - внутри этого контейнера 2013 я создал ещё 12 контейнеров, которые назвал - 01, 02, 03, .... 12, т.е. по месяцам. И соответственно туда буду скидывать заблокированные учётки.
И последнее, что нам потребуется - это контейнер для сервисных учёток ServiceUsers (для тех, кто не в теме - это такие учётки, которыми пользуются разные программы, например, программа Cobian, которая умеет делать бэкапы требует для своей работы учётную запись с правами как минимум - оператор архива).
Ну а теперь ближе к делу. Создаём скрипт. Для того, чтобы определить неактивные учётные данные существует множество средств. Можно вообще упростить себе жизнь и написать обычный батник вида:
dsquery user -limit 0 -inactive 24 -uci > users.txt
Кому-то и этого скрипта хватит, но лично я любитель автоматизации. Я привык приходить с утра на работу и за чашечкой кофе посмотреть свою почту, в которой у меня всегда валяются новые отчёты по работе разных скриптов и программ, поэтому я и в этот раз решил один раз позаморачиваться, а потом, как уже ни раз упоминал, курить бамбук!
Мой скрипт я научил не трогать в AD два контейнера - RemovedUsers и ServiceUsers, ну а также отправлять отчёты по почте, в случае нахождения неактивных учёток. При выборе способа обращения к AD я решил остановиться на командной строке, так как меня больше устроили выходные данные, а самое главное - это меньше кода в итоге получается, а информативности больше.
И самое интересно то, что у меня уже есть готовый Скрипт автоматически выкидывающий пользователей из терминальной сессии, который я просто переточил под другие задачи и получил скрипт, следящий за неативными пользователями в AD.
Сам скрипт Old_in_AD.vbs:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Скрипт следит за неактивными пользователями и компьютерами в Active Directory '
' Скрипт не трогает учётки из контейнера сервисных учёток - ServiceUsers '
' Скрипт не трогает учётки из контейнера заблокированных учёток - RemovedUsers '
' Скрипт написал Анчуров Олег Владимирович в 2013 году. '
' Скрипт взят с сайта: http://ithelp.moy.su '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim WshShell, objScriptExec
Dim Msg, UK, CK, intU, intC, Zapros, a
Dim objEmail
intU = 24 ' Количество недель неактивности пользователя
intC = 12 ' Количество недель неактивности компьютера
UK = 0
CK = 0
Set WshShell = CreateObject("Wscript.Shell")
Zapros = "dsquery user -limit 0 -inactive " & CStr(intU) & " -uci"
Set objScriptExec = WshShell.Exec(Zapros)
Dim Line, Line2
Dim SE
SE = chr(13) & chr(10)
Msg = "ПРОТОКОЛ РАБОТЫ СКРИПТА, ОТЫСКИВАЮЩЕГО НЕАКТИВНЫЕ УЧЁТНЫЕ ЗАПИСИ" & se
Msg = Msg & "ПОЛЬЗОВАТЕЛЕЙ И КОМПЬЮТЕРОВ В ACTIVE DIRECTORY" & se & se
Msg = Msg & "Неактивные пользователи (минимум недель: " & CStr(intU) & "):" & se
Do Until objScriptExec.StdOut.AtEndOfStream
Line = objScriptExec.StdOut.ReadLine
Line = Replace(Line,chr(34),"")
Line = Replace(Line,"CN=","")
Line2 = ""
'Производим перекодировку текста из Dos в ANSI:
For i = 1 to Len(Line)
a = Asc(Mid(Line,i,1))
If a < 128 then Line2 = Line2 & chr(a)
If a > 127 and a < 176 then Line2 = Line2 & chr(a + 64)
If a > 175 and a < 224 then Line2 = Line2 & chr(a)
If a > 223 and a < 240 then Line2 = Line2 & chr(a + 16)
If a = 240 then Line2 = Line2 & chr(168)
If a = 241 then Line2 = Line2 & chr(184)
If a > 241 then Line2 = Line2 & chr(a)
Next
Line = Line2
Line = Replace(Line,",",", ")
Line = Replace(Line,",",":",1,1)
Line = Replace(Line,"="," = ")
a = 0
a = a + InStr(Line,"ServiceUsers") 'Этот контейнер не трогаем!
a = a + InStr(Line,"RemovedUsers") 'Этот контейнер не трогаем!
If a = 0 then
Msg = Msg & Line & se
Uk = Uk + 1
End If
Loop
Msg = Msg & "Всего найдено неактивных пользователей: " & CStr(UK) & se & se
Zapros = "dsquery computer -limit 0 -inactive " & CStr(intC) & " -uci"
Set objScriptExec = WshShell.Exec(Zapros)
Msg = Msg & "Неактивные компьютеры (минимум недель: " & CStr(intC) & "):" & se
Do Until objScriptExec.StdOut.AtEndOfStream
Line = objScriptExec.StdOut.ReadLine
Line = Replace(Line,chr(34),"")
Line = Replace(Line,"CN=","")
Line2 = ""
'Производим перекодировку текста из Dos в ANSI:
For i = 1 to Len(Line)
a = Asc(Mid(Line,i,1))
If a < 128 then Line2 = Line2 & chr(a)
If a > 127 and a < 176 then Line2 = Line2 & chr(a + 64)
If a > 175 and a < 224 then Line2 = Line2 & chr(a)
If a > 223 and a < 240 then Line2 = Line2 & chr(a + 16)
If a = 240 then Line2 = Line2 & chr(168)
If a = 241 then Line2 = Line2 & chr(184)
If a > 241 then Line2 = Line2 & chr(a)
Next
Line = Line2
Line = Replace(Line,",",", ")
Line = Replace(Line,",",":",1,1)
Line = Replace(Line,"="," = ")
a = 0
a = a + InStr(Line,"ServiceUsers") 'Этот контейнер не трогаем!
a = a + InStr(Line,"RemovedUsers") 'Этот контейнер не трогаем!
If a = 0 then
Msg = Msg & Line & se
Ck = Ck + 1
End If
Loop
Msg = Msg & "Всего найдено неактивных компьютеров: " & CStr(CK) & se & se
Msg = Msg & "Время/дата отработки скрипта: " & CStr(Time) & "/" & CStr(Date) & se
If UK + CK > 0 then ' Если есть что-либо важное для админа, то шлём ему привет по электронке!
Const EmailFrom = "bot@firma.ru" ' от кого будет отправляться e-mail
Const EmailPassword = "SuperPuperPassword" ' пароль от e-mail отправителя
Const strSmtpServer = "smtp.firma.ru" ' smtp сервер
Const EmailTo = "admin@firma.ru" ' Кому будет отправляться e-mail
Set objEmail = CreateObject("CDO.Message")
objEmail.From = EmailFrom
objEmail.To = EmailTo
objEmail.Subject = "Отчёт по работе скрипта Old_in_AD" ' Тема письма
objEmail.Textbody = MSG
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = EmailFrom
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = EmailPassword
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
Set objEmail = Nothing ' Чистим память.
End If
Set objScriptExec = Nothing
Set WshShell = Nothing
Чуть не забыл. Скрипт я этот повесил на одном из контроллеров домена и создал на нём задачу с периодичностью раз в месяц.
Желаю приятной работы! Жизнь админа должна быть проще!