Приветствую Вас ГостьСуббота, 27.04.2024, 03:06

В помощь админу


Каталог статей

Главная » Статьи » Windows » Active Directory

Старые записи в AD
Не мудрено, что следить за всем и вся порой нет времени или возможности.
Или хотя бы взять простой пример - в Вашей организации несколько сотен сотрудников, работающих за персональным компьютером. Сотрудники имеют свойство увольняться и приходить новые - так уж у нас в стране по нынешним временам заведено. Когда приходит новый сотрудник или увольняется кто-либо, то порой не всегда об этом сообщают в IT-отдел. А ещё хуже, когда при приходе нового сотрудника просто передают учётные данные старого сотрудника новому и он спокойно начинает работать не под своими учётными данными - этот момент конечно же тяжелее выявить вручную, ну а вот на счёт увольнения старых - это по проще. Можно написать скрипт, который будет отслеживать старые записи учётных записей компьютеров и пользователей в AD и сообщать об этом админу.
Но, прежде чем к делу, расскажу я о том, какую небольшую реорганизацию в AD я произвёл и скрипт я писал, учитывая эту реорганизацию. Итак по порядку:
  1. Создаём в AD подразделение или контейнер RemovedUsers (для скрипта не имеет роли cn или ou контейнер!).
  2. Внутри этого контейнера я создаю ещё ряд контейнеров. Самый главный - это Dekret (сюда я размещаю заблокированные учётки сотрудниц, которые ушли в декретный отпуск) и, контейнер с нынешним годом (например 2013), и это ещё не самое главное - внутри этого контейнера 2013 я создал ещё 12 контейнеров, которые назвал - 01, 02, 03, .... 12, т.е. по месяцам. И соответственно туда буду скидывать заблокированные учётки.
  3. И последнее, что нам потребуется - это контейнер для сервисных учёток ServiceUsers (для тех, кто не в теме - это такие учётки, которыми пользуются разные программы, например, программа Cobian, которая умеет делать бэкапы требует для своей работы учётную запись с правами как минимум - оператор архива).
Ну а теперь ближе к делу. Создаём скрипт. Для того, чтобы определить неактивные учётные данные существует множество средств. Можно вообще упростить себе жизнь и написать обычный батник вида:
 
dsquery user -limit 0 -inactive 24 -uci > users.txt
dsquery computer -limit 0 -inactive 12 -uci > cmp.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


Чуть не забыл. Скрипт я этот повесил на одном из контроллеров домена и создал на нём задачу с периодичностью раз в месяц.
Желаю приятной работы! Жизнь админа должна быть проще!
Категория: Active Directory | Добавил: isz (06.10.2013)
Просмотров: 3326 | Теги: устаревшие записи, ad, Active Directory, vbs, Скрипт, старые записи, vbscript | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Active Directory [12]
DHCP [1]
Windows [13]
Wins [1]
Групповая политика [3]
Программы [2]
Резервное копирование [6]
Сеть [5]
Скрипты [31]
Терминальный сервер [7]
Почта [7]
Реестр [2]
Реестр Windows
Командная строка [7]
CMD: Командная строка Windows
Поиск
Форма входа
Наш опрос
Оцените мой сайт
Всего ответов: 147
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика