Приветствую Вас ГостьВоскресенье, 24.11.2024, 06:17

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


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

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

Скрипт автоматического создания контактов из пользователей в AD
Данный скрипт автоматически создаёт контакты из пользователей в AD.
Скрипт состоит из 3х частей:
  1. LDAP-запрос к AD для поиска новых контактов. Создание новых контактов. При этом не трогаются системные учётки.
  2. Удаление контактов из AD. Если пользователя админ заблокирует, то контакт будет удалён.
  3. Отправка отчёта админу о проделанной работе по электронной почте.

Для работы данного скрипта необходимы соответствующие права в AD, а также наличие самих учётных записей пользователей, которые можно создавать по примеру статьи - Active Directory - создание нового пользователя.

Данный скрипт является частью проекта - Автономный телефонный справочник.

Сам скрипт написан на VBScripts и имеет расширение VBS. Скопируйте и отредактируйте текст скрипта под свои нужды! Админы должны больше отдыхать!

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Создаем список контактов из активных пользователей Active directory '
'          Системные учётные записи не трогаем по критерию:           '
'              у системной учётки нет электронной почты!              '
'   Скрипт написал Анчуров Олег Владимирович в 2013 году. Версия 3.   '
'              Скрипт взят с сайта: http://ithelp.moy.su              '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Option Explicit
On error resume next ' отключаем ошибки

' Объявляем переменные
Dim objRootDSE, strDNSDomain, strBase
Dim adoCommand, adoConnection, objRS, strFilter, strAttributes, strQuery
Dim objExcel, strName, strPhone, strMail, strOtherphone, arrOtherPhone, strMobile, strCountry, strCity, strCompany, strDepartment, strTitle
Dim strGivenName, strSN, strDisplayName, strItem
Dim objRoot, objOU, objDomain, objContact
Dim strDNS, strContainer, strContactName, strEmail
Dim UserN, UserD, UNK, UDK
UNK = 0
UDK = 0
UserN = ""
UserD = ""

' Итак, поехали
' Определяем имя домена
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")

Set adoCommand = CreateObject("ADODB.Command")
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open "Active Directory Provider"
adoCommand.ActiveConnection = adoConnection
strBase = "<LDAP://" & strDNSDomain & ">"

' Найти все активные учетные записи.
' Коды UseraccountControl тут: http://support.microsoft.com/kb/305144
' Все коды аттрибутов тут: http://www.computerperformance.co.uk/Logon/LDAP_attributes_active_directory.htm
strFilter = "(&(objectCategory=person)(objectClass=user)(|(useraccountControl=66048)(useraccountcontrol=512)))" 'useraccountcontrol=512 - включенные пользователи!
' В переменной strAttributes обязательно перечисляем список атрибутов, которые переносятся, иначе работать не будет!
strAttributes = "name,mail,telephoneNumber,otherTelephone,mobile,c,L,company,department,title,givenname,sn,displayname"

' Формируем строку запроса.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

' Выполним запрос.
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 500 ' Максимальное количество пользователей, которое получит в ответе запрос к AD!
adoCommand.Properties("Timeout") = 307
adoCommand.Properties("Cache Results") = False
Set objRS = adoCommand.Execute

' Обработаем полученные данные из запроса
While not objRS.EOF
    strName = objRS.Fields("name").Value
    strMail = objRS.Fields("mail").value
    strPhone = objRS.Fields("telephoneNumber").Value
        strPhone = Replace(strPhone,"-","") 'Откидываем тире из телефона
        strPhone = Replace(strPhone," ","") 'Откидываем пробелы из телефона   
    arrOtherPhone = objRS.Fields("otherTelephone").Value
    strMobile = objRS.Fields("mobile").Value
        strMobile = Replace(strMobile,"-","") 'Откидываем тире из телефона
        strMobile = Replace(strMobile," ","") 'Откидываем пробелы из телефона
    strCountry = objRS.Fields("c").Value
    strCity = objRS.Fields("L").Value
    strCompany = objRS.Fields("company").Value
    strDepartment = objRS.Fields("department").Value
    strTitle = objRS.Fields("title").Value
    strGivenName=objRS.Fields("givenname").Value
    strSN=objRS.Fields("sn").Value
    strDisplayName=objRS.Fields("displayname").Value
    If IsNull(arrOtherPhone) Then
        strOtherPhone = ""
    Else
        strOtherPhone = ""
        For Each strItem In arrOtherPhone
            If (strOtherPhone = "") Then
                strOtherPhone = strItem
            Else
                strItem = Replace(strItem,"-","") 'Откидываем тире из телефона
                strItem = Replace(strItem," ","") 'Откидываем пробелы из телефона   
                strOtherPhone = strOtherPhone & " " & strItem
            End If
        Next
    End If
   
    'Заполним поля, если есть электронная почта
    if strMail<>"" then
        Err.Clear
        ' Создаём контакт из пользователя. Подготовка.
        strContainer = "cn=users" 'Название контейнера, в который будем ложить контакты, созданные из пользователей.
        strContactName = "cn=" & strName 'Название контакта
        strEmail = strMail 'Адрес электронной почты

        ' Создаём запрос к Active Directory
        Set objRoot = GetObject("LDAP://rootDSE")
        strDNS = objRoot.Get("defaultNamingContext")
        Set objDomain = GetObject("LDAP://" & strDNS)

        ' Создаём контакт из пользователя.
        Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)
        Set objContact = objOU.Create("contact", strContactName)
        objContact.Put "Mail", strEmail
        if strGivenName <> "" then objContact.Put "givenname", strGivenName
        if strSN <> "" then objContact.Put "sn", strSN
        if strDisplayName <> "" then objContact.Put "displayname", strDisplayName
        if strPhone <> "" then objContact.Put "telephoneNumber", strPhone
        if strOtherPhone <> "" then objContact.Put "otherTelephone", strOtherPhone
        if strMobile <> "" then objContact.Put "mobile", strMobile
        if strCountry <> "" then objContact.Put "c", strCountry
        if strCity <> "" then objContact.Put "L", strCity
        if strCompany <> "" then objContact.Put "company", strCompany
        if strDepartment <> "" then objContact.Put "department", strDepartment
        if strTitle <> "" then objContact.Put "title", strTitle
        objContact.SetInfo 'контакт успешно создан! (в случае, если такой уже окажется, то вызовется ошибка, которая проигнорируется скриптом!)
        If Err.Number = 0 then
            UNK = UNK + 1
            UserN = UserN + strName + chr(13) + chr(10)
        end if
    end if

    objRS.MoveNext
Wend

' А теперь удаляем из AD контакты заблокированных пользователей
strFilter = "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))"' - выключенные пользователи!
' В переменной strAttributes оязательно перечисляем список атрибутов, которые переносятся, иначе работать не будет!
strAttributes = "name,mail"' в этот раз нас не интересуют остальные параметры

' Формируем строку запроса.
strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

' Выполним запрос.
adoCommand.CommandText = strQuery
adoCommand.Properties("Page Size") = 500
adoCommand.Properties("Timeout") = 307
adoCommand.Properties("Cache Results") = False
Set objRS = adoCommand.Execute
While not objRS.EOF
    strName = objRS.Fields("name").Value
    strMail = objRS.Fields("mail").value
    if strMail<>"" then
        Err.Clear
        'Удаляем контакт заблокированного пользователя
        strContainer = "cn=users" 'Название контейнера, в котором будем удалять контакты заблокированных пользователей.
        strContactName = "cn=" & chr(34) & strName & chr(34) 'Название контакта
        Set objOU = GetObject("LDAP://"& strContainer & "," & strDNS)
        a = objOU.Delete ("Contact", strContactName)
        If Err.Number = 500 then
            UDK = UDK + 1
            UserD = UserD + strName + chr(13) + chr(10)
        end if
    end if
    objRS.MoveNext
Wend

'Если были произведены автоматические манипуляции с учётками, то надо об этом сообщить админу по электронной почте

If (UNK + UDK) > 0 then
    Dim objEmail, MSG
    MSG = "ПРОТОКОЛ РАБОТЫ СКРИПТА, АВТОМАТИЧЕСКИ СОЗДАЮЩЕГО КОНТАКТЫ ИЗ ПОЛЬЗОВАТЕЛЕЙ В AD:" + chr(13) + chr(10) + chr(13) + chr(10)
    MSG = MSG + "Протокол создания контактов:" + chr(13) + chr(10)
    MSG = MSG + UserN
    MSG = MSG + "Всего создано контактов: " + CStr(UNK) + chr(13) + chr(10) + chr(13) + chr(10)
    MSG = MSG + "Протокол удаления контактов:" + chr(13) + chr(10)
    MSG = MSG + UserD
    MSG = MSG + "Всего удалено контактов: " + CStr(UDK) + chr(13) + chr(10)+ chr(13) + chr(10)
    MSG = MSG + "Время/дата отработки скрипта: " + CStr(Time) + "/" + CStr(Date) + chr(13) + chr(10)
   
    Const EmailFrom = "bot@firma.ru"         ' от кого будет отправляться e-mail
    Const EmailPassword = "SuperPassword"       ' пароль от 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 = "Отчёт по работе скрипта MailFromUsers" ' Тема письма
    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 objRS = Nothing
Set adoCommand = Nothing
Set adoConnection = Nothing
Set objOU = Nothing
WScript.Quit

 

Жизнь админа должна быть проще!


Навигация по проекту

Автономный телефонный справочник

Назад Вперёд
Категория: Active Directory | Добавил: isz (15.09.2013)
Просмотров: 9506 | Комментарии: 13 | Теги: vbs, контакт, Автономный телефонный справочник, Скрипт, ad, Active Directory, vbscript | Рейтинг: 0.0/0
Всего комментариев: 13
10 AlexxJ  
0
Добрый день. Адаптирую ваш скрипт под 1с. При вызове метода "objContact.SetInfo" ошибка
"Произошла исключительная ситуация (Active Directory): Access is denied."
что логично, т.к. у пользователя под которым запущена 1с нет прав на давление записи. Как запустить от другого пользователя, у которого есть права?
Пробовал объект создавать через objOU=OpenDSObject("LDAP://RootDSE", Пользователь, Пароль,1), но в таком случае ругается на метод objOU.Create, нет такого метода.

11 isz  
0
Я бы попробовал дать права на контейнер в Active Directory или можно попробовать сделать ещё 1 костыль в виде прокладки: 1С создаст какой-либо файл в определённом месте, а потом другой скрипт с сервера подхватит этот файл и сделает по нему пользователя или контакт (что по Вашему ТЗ необходимо).
А вообще зачем это пытаетесь сделать?

12 AlexxJ  
0
Вообще, стоит задача наполнение адресной книги из 1с, без доп. скриптов и всяких "прокладок". Админы специально создали пользователя с полными правами для этого обмена. Так что с правами все должно быть норм.

13 isz  
0
У меня тоже происходит синхронизация контактов 1С и Active Directory, но в моём случае - я писал модуль в 1С, который обращается к Active Directory и берёт информацию о пользователях из Active Directory. Вам никто не мешает сделать модуль для 1С, который будет в обратную сторону работать. В любом случае это будет костыль в виде модуля 1С или в виде скрипта - способ реализации выбирать Вам.
P.S.: если очень хочется поизвращаться, то вот ещё 1 совет - через vbs-скрипт можно подключиться к базе данных SQL и работать с ней, проверено лично, но - нужно ли это!?

8 ХрамычЪ  
0
а как быть с ситуацией когда скрипт уже создал контакт, затем у пользователя поменялись данные, к примеру внутренний номер?

9 isz  
0
К сожалению, пол года как не занимался сайтом из-за отсутствия времени. Щас потихоньку наверстываю.
Если ещё имеет смысл комментарий, хотя и другим будет полезно. Лично в моём случае, когда этот скрипт уже создал все контакты, то я уже не правлю данные пользователя, потому что я не закладывал функцию обмена данными между контактом и пользователем, хотя об этом думал. Исходя из этого я делаю очень просто - все дальнейшие правки осуществляю исключительно с контактом!

4 PGovorov  
0
Скрипт не создает контакты, в чем может быть проблема?

5 isz  
0
Учётная запись, от которой запускается данный скрипт, имеет права доступа на создание и удаление контактов?

6 PGovorov  
0
Скрипт отработал на отлично, когда был запущен планировщиком задач. Есть вопрос по второму скрипту, а каким образом он сортирует записи?

7 isz  
0
С помощью java-скрипта, подцепленного к html-странице. В шапке таблицы надо просто нажимать мышкой на любой из колонок таблицы...
А сам второй скрипт сортировкой не занимается

2 abik  
0
Добрый день, Олег
В сгенерированном скрипте в колонке ИМЯ сотрудника отобразилась почта, в колонке Электронная почта отобразилась тоже почта, как и должно быть. Остальные колонки полупустые, т.е., возможно, скрипт выбирает другие данные с АД. Как быть?

3 isz  
0
расхождение может быть только если Вы изменили количество колонок в таблице!
Скрипт не выбирает другие данные, если Вы его не исправляли под себя!
просто где то ошибка в синтаксисе... киньте в обратную связь код, что у Вас получился! в свободную минутку взгляну на него...

1 isz  
0
Ответ на вопрос, поступивший через обратную связь
...У меня еще один вопрос: ваш скрипт не удаляет же данные из АД, т.к. в комментах написано "А теперь удаляем из AD контакты"? Спасибо
Ответ: Да, действительно, удаляет, но только тогда, когда Вы сами заблокируете учётную запись пользователя, которому принадлежит этот контакт. Обратите на это внимание, потому что скрипт реагирует на появление нового пользователя в AD и делает ему тут же контакт, а когда этот пользователь уволится или уйдёт в декрет, то, исходя из стандартно принятой политики безопасности, Вы по-любому заблокируете его учётную запись, а скрипт зафиксирует блокировку учётки и уничтожит контакт заблокированного пользователя! Не пугайтесь множественного числа в коментарии, потому что скрипт удалит ровно столько контактов, сколько Вы заблокируете учёток и при этом учётные записи пользователей не трогаются вовсе!
Сами подумайте - зачем Вам в телефонном справочнике нужны контакты не работающих сотрудников?
Поэтому мой справочник и называется автономным

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Категории раздела
Active Directory [12]
DHCP [1]
Windows [13]
Wins [1]
Групповая политика [3]
Программы [2]
Резервное копирование [6]
Сеть [5]
Скрипты [31]
Терминальный сервер [7]
Почта [7]
Реестр [2]
Реестр Windows
Командная строка [7]
CMD: Командная строка Windows
Поиск
Форма входа
Наш опрос
Оцените мой сайт
Всего ответов: 149
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика