Скрипт автоматического создания контактов из пользователей в AD
Данный скрипт автоматически создаёт контакты из пользователей в AD.
Скрипт состоит из 3х частей:
LDAP-запрос к AD для поиска новых контактов. Создание новых контактов. При этом не трогаются системные учётки.
Удаление контактов из AD. Если пользователя админ заблокирует, то контакт будет удалён.
Отправка отчёта админу о проделанной работе по электронной почте.
Для работы данного скрипта необходимы соответствующие права в 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")
' Найти все активные учетные записи.
' Коды 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"
' Выполним запрос.
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"' в этот раз нас не интересуют остальные параметры
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
Добрый день. Адаптирую ваш скрипт под 1с. При вызове метода "objContact.SetInfo" ошибка "Произошла исключительная ситуация (Active Directory): Access is denied." что логично, т.к. у пользователя под которым запущена 1с нет прав на давление записи. Как запустить от другого пользователя, у которого есть права? Пробовал объект создавать через objOU=OpenDSObject("LDAP://RootDSE", Пользователь, Пароль,1), но в таком случае ругается на метод objOU.Create, нет такого метода.
Я бы попробовал дать права на контейнер в Active Directory или можно попробовать сделать ещё 1 костыль в виде прокладки: 1С создаст какой-либо файл в определённом месте, а потом другой скрипт с сервера подхватит этот файл и сделает по нему пользователя или контакт (что по Вашему ТЗ необходимо). А вообще зачем это пытаетесь сделать?
Вообще, стоит задача наполнение адресной книги из 1с, без доп. скриптов и всяких "прокладок". Админы специально создали пользователя с полными правами для этого обмена. Так что с правами все должно быть норм.
У меня тоже происходит синхронизация контактов 1С и Active Directory, но в моём случае - я писал модуль в 1С, который обращается к Active Directory и берёт информацию о пользователях из Active Directory. Вам никто не мешает сделать модуль для 1С, который будет в обратную сторону работать. В любом случае это будет костыль в виде модуля 1С или в виде скрипта - способ реализации выбирать Вам. P.S.: если очень хочется поизвращаться, то вот ещё 1 совет - через vbs-скрипт можно подключиться к базе данных SQL и работать с ней, проверено лично, но - нужно ли это!?
К сожалению, пол года как не занимался сайтом из-за отсутствия времени. Щас потихоньку наверстываю. Если ещё имеет смысл комментарий, хотя и другим будет полезно. Лично в моём случае, когда этот скрипт уже создал все контакты, то я уже не правлю данные пользователя, потому что я не закладывал функцию обмена данными между контактом и пользователем, хотя об этом думал. Исходя из этого я делаю очень просто - все дальнейшие правки осуществляю исключительно с контактом!
С помощью java-скрипта, подцепленного к html-странице. В шапке таблицы надо просто нажимать мышкой на любой из колонок таблицы... А сам второй скрипт сортировкой не занимается
Добрый день, Олег В сгенерированном скрипте в колонке ИМЯ сотрудника отобразилась почта, в колонке Электронная почта отобразилась тоже почта, как и должно быть. Остальные колонки полупустые, т.е., возможно, скрипт выбирает другие данные с АД. Как быть?
расхождение может быть только если Вы изменили количество колонок в таблице! Скрипт не выбирает другие данные, если Вы его не исправляли под себя! просто где то ошибка в синтаксисе... киньте в обратную связь код, что у Вас получился! в свободную минутку взгляну на него...
Ответ на вопрос, поступивший через обратную связь ...У меня еще один вопрос: ваш скрипт не удаляет же данные из АД, т.к. в комментах написано "А теперь удаляем из AD контакты"? Спасибо
Ответ: Да, действительно, удаляет, но только тогда, когда Вы сами заблокируете учётную запись пользователя, которому принадлежит этот контакт. Обратите на это внимание, потому что скрипт реагирует на появление нового пользователя в AD и делает ему тут же контакт, а когда этот пользователь уволится или уйдёт в декрет, то, исходя из стандартно принятой политики безопасности, Вы по-любому заблокируете его учётную запись, а скрипт зафиксирует блокировку учётки и уничтожит контакт заблокированного пользователя! Не пугайтесь множественного числа в коментарии, потому что скрипт удалит ровно столько контактов, сколько Вы заблокируете учёток и при этом учётные записи пользователей не трогаются вовсе! Сами подумайте - зачем Вам в телефонном справочнике нужны контакты не работающих сотрудников? Поэтому мой справочник и называется автономным
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]