Импорт пользователей из CSV в Active Directory

Иногда возникает необходимость импортировать большое количество информации о пользователях из других систем. Один из вариантов сделать это через csv файл.
Ниже VBS скрипт которым я импортировал информацию из файла. Алгоритм:
1. Получаем первую строку.
2. Ищем пользователя по полю uid.
3. Если пользователь есть, то актуализируем информацию по нему.
4. Если пользователя нет, то заводим такого пользователя.
5. Получаем следующую строку и поновой…

Код:

On Error Resume Next
Const ADS_PROPERTY_UPDATE = 2 

Const ADS_SCOPE_SUBTREE = 2
Const ForReading = 1, ForWriting = 2
Dim fso, f1, f2, Line

'функция осуществляет транслит с русского на латиницу
Function Rus2Lat(strRus) 
    Dim i 
    Dim strTemp 
    Dim strLat 
    For i = 1 To Len(strRus) 
        strTemp = Mid(strRus, i, 1)              
        Select Case strTemp 
            Case "а" 
                strLat = strLat & "a" 
            Case "А" 
                strLat = strLat & "a" 
            Case "б" 
                strLat = strLat & "b" 
            Case "Б" 
                strLat = strLat & "b" 
            Case "в" 
                strLat = strLat & "v" 
            Case "В" 
                strLat = strLat & "v" 
            Case "г" 
                strLat = strLat & "g" 
            Case "Г" 
                strLat = strLat & "g" 
            Case "д" 
                strLat = strLat & "d" 
            Case "Д" 
                strLat = strLat & "d" 
            Case "е" 
                strLat = strLat & "e" 
            Case "Е" 
                strLat = strLat & "e" 
            Case "ё" 
                strLat = strLat & "yo" 
            Case "Ё" 
                strLat = strLat & "yo" 
            Case "ж" 
                strLat = strLat & "zh" 
            Case "Ж" 
                strLat = strLat & "zh" 
            Case "з" 
                strLat = strLat & "z" 
            Case "З" 
                strLat = strLat & "z" 
            Case "и" 
                strLat = strLat & "i" 
            Case "И" 
                strLat = strLat & "i" 
            Case "й" 
                strLat = strLat & "i" 
            Case "Й" 
                strLat = strLat & "i" 
            Case "к" 
                strLat = strLat & "k" 
            Case "К" 
                strLat = strLat & "k" 
            Case "л" 
                strLat = strLat & "l" 
            Case "Л" 
                strLat = strLat & "l" 
            Case "м" 
                strLat = strLat & "m" 
            Case "М" 
                strLat = strLat & "m" 
            Case "н" 
                strLat = strLat & "n" 
            Case "Н" 
                strLat = strLat & "n" 
            Case "о" 
                strLat = strLat & "o" 
            Case "О" 
                strLat = strLat & "o" 
            Case "п" 
                strLat = strLat & "p" 
            Case "П" 
                strLat = strLat & "p" 
            Case "р" 
                strLat = strLat & "r" 
            Case "Р" 
                strLat = strLat & "r" 
            Case "с" 
                strLat = strLat & "s" 
            Case "С" 
                strLat = strLat & "s" 
            Case "т" 
                strLat = strLat & "t" 
            Case "Т" 
                strLat = strLat & "t" 
            Case "у" 
                strLat = strLat & "u" 
            Case "У" 
                strLat = strLat & "u" 
            Case "ф" 
                strLat = strLat & "f" 
            Case "Ф" 
                strLat = strLat & "f" 
            Case "х" 
                strLat = strLat & "kh" 
            Case "Х" 
                strLat = strLat & "kh" 
            Case "ц" 
                strLat = strLat & "c" 
            Case "Ц" 
                strLat = strLat & "c" 
            Case "ч" 
                strLat = strLat & "ch" 
            Case "Ч" 
                strLat = strLat & "ch" 
            Case "ш" 
                strLat = strLat & "sh" 
            Case "Ш" 
                strLat = strLat & "sh" 
            Case "щ" 
                strLat = strLat & "sch" 
            Case "Щ" 
                strLat = strLat & "sch" 
            Case "ъ" 
                strLat = strLat & "" 
            Case "Ъ" 
                strLat = strLat & "" 
            Case "ы" 
                strLat = strLat & "y" 
            Case "Ы" 
                strLat = strLat & "y" 
            Case "ь" 
                strLat = strLat & "" 
            Case "Ь" 
                strLat = strLat & "" 
            Case "э" 
                strLat = strLat & "e" 
            Case "Э" 
                strLat = strLat & "e" 
            Case "ю" 
                strLat = strLat & "yu" 
            Case "Ю" 
                strLat = strLat & "yu" 
            Case "я" 
                strLat = strLat & "ya" 
            Case "Я" 
                strLat = strLat & "ya" 
            Case Else 
                'unknown symbol 
                strLat = strLat & strTemp 
        End Select 
    Next 
    Rus2Lat = strLat 
End Function

'данной функцией получаем полный путь AD к руководителю по его идентификатору
Function getCN(chiefuid) 
    Dim i 
    Dim strTemp 
    Dim strLat 
    Set objConnection1 = CreateObject("ADODB.Connection")
	Set objCommand1 =   CreateObject("ADODB.Command")
	objConnection1.Provider = "ADsDSOObject"
	objConnection1.Open "Active Directory Provider"
	Set objCommand1.ActiveConnection = objConnection1
	objCommand1.Properties("Page Size") = 1000
	objCommand1.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
	objCommand1.CommandText = _
		"SELECT Name, distinguishedName FROM 'LDAP://dc=domen,dc=local' WHERE objectCategory='user' AND uid='"+ chiefuid +"'"  
	Set objRecordSet1 = objCommand1.Execute
    getCN = objRecordSet1.Fields("distinguishedName").Value
End Function


Function getCount(prName) 
    Dim i 
    Dim strTemp 
    Dim strLat 
    Set objConnection1 = CreateObject("ADODB.Connection")
	Set objCommand1 =   CreateObject("ADODB.Command")
	objConnection1.Provider = "ADsDSOObject"
	objConnection1.Open "Active Directory Provider"
	Set objCommand1.ActiveConnection = objConnection1
	objCommand1.Properties("Page Size") = 1000
	objCommand1.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
	objCommand1.CommandText = _
		"SELECT Name, distinguishedName FROM 'LDAP://dc=domen,dc=local' WHERE objectCategory='user' AND userPrincipalName='"+ prName +"*'"  
	Set objRecordSet1 = objCommand1.Execute
    getCount = objRecordSet1.RecordCount
End Function



Set fso = CreateObject("Scripting.FileSystemObject")
'файл из которого читаем
Set f1 = fso.OpenTextFile("list.csv", ForReading)
f1.SkipLine()
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
'objCommandProperties("Sort On") = "Name"


'MsgBox getCount("dvag")

Do While not f1.AtEndOfStream

Line = f1.ReadLine()

Line = Split(Line,";")


objCommand.CommandText = _
    "SELECT Name, distinguishedName FROM 'LDAP://dc=domen,dc=local' WHERE objectCategory='user' AND uid='"+ Line(0)+"'"  
Set objRecordSet = objCommand.Execute

' создаем пользователя MsgBox Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))

if objRecordSet.RecordCount = 1 then
'пользователь есть, меняем его свойства 
 'MsgBox objRecordSet.Fields("distinguishedName").Value
 Set objUser = GetObject ("LDAP://"+objRecordSet.Fields("distinguishedName").Value +"")
 
 if ((Line(1) <> "")) then
 objUser.Put "title", Line(1)
  objUser.SetInfo
 end if
 
 if ((Line(2) <> "")) then
 objUser.Put "department", Line(2)
  objUser.SetInfo
 end if
 
 if ((Line(3) <> "")) then
 objUser.Put "givenName", Line(3)
  objUser.SetInfo
 end if
 
 if ((Line(4) <> "")) then
 objUser.Put "sn", Line(4)
  objUser.SetInfo
 end if
 
 if ((Line(3)+" "+Line(4)) <> "") then
 objUser.Put "displayName", (Line(3)+" "+Line(4))
  objUser.SetInfo
 end if 
 
 if ((Line(5) <> "")) then
 objUser.Put "company", Line(5)
  objUser.SetInfo
 end if
 
 if ((Line(6) <> "")) then
 objUser.Put "postalCode", Line(6)
  objUser.SetInfo
 end if
 
 if ((Line(7) <> "")) then
 objUser.Put "employeeType", Line(7)
  objUser.SetInfo
 end if
 
 if ((Line(8) <> "")) then
 objUser.Put "telephoneNumber", Line(8)
  objUser.SetInfo
 end if
 
 if ((Line(9) <> "")) then
 objUser.Put "wWWHomePage", Line(9)
  objUser.SetInfo
 end if
 
 if ((Line(10) <> "")) then
 objUser.Put "streetAddress", Line(10)
  objUser.SetInfo
 end if
 
 if ((Line(11) <> "")) then
 objUser.Put "l", Line(11)
  objUser.SetInfo
 end if 
 
 if ((Line(12) <> "")) then
 objUser.Put "pager", Line(12)
  objUser.SetInfo
 end if
 
 if ((Line(13) <> "")) then
 objUser.Put "facsimileTelephoneNumber", Line(13)
  objUser.SetInfo
 end if
 
 if ((Line(14) <> "")) then
 objUser.Put "ipPhone", Line(14)
  objUser.SetInfo
 end if
 
 if ((Line(15) <> "")) then
  objUser.Put "mail", Line(15)
   objUser.SetInfo
  end if
 
 if  (Line(16) <> "") then
 objUser.Put "manager", getCN(Line(16))
 'MsgBOX Line(4)
 objUser.SetInfo
 'MsgBOX getCN(Line(16))
 end if
End if
 

if objRecordSet.RecordCount = 0 then
'пользователя нет, создаем его в тестовой организационной единице
Set objOU = GetObject("LDAP://OU=test,dc=domen,dc=local")
Set objUser = objOU.Create("User", "cn="+Line(3)+" "+Line(4))
if getCount(Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))) <> 0 then
nn = getCount(Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))) + 1
objUser.Put "sAMAccountName", Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))+nn
objUser.Put "userPrincipalName", Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))+nn+"@domain.local" 
else 
objUser.Put "sAMAccountName", Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))
objUser.Put "userPrincipalName", Mid(Rus2Lat(Line(3)), 1, 1)+Rus2Lat(Line(4))+"@domain.local"
end if 
objUser.Put "uid", Line(0)
objUser.SetInfo
objUser.Put "title", Line(1)
objUser.SetInfo
objUser.Put "department", Line(2)
objUser.SetInfo
objUser.Put "givenName", Line(3)
objUser.SetInfo
objUser.Put "sn", Line(4)
objUser.SetInfo
objUser.Put "displayName", (Line(3)+" "+Line(4))
objUser.SetInfo
if (Line(5) <> "") then
objUser.Put "company", Line(5)
objUser.SetInfo
end if
if (Line(6) <> "") then
objUser.Put "postalCode", Line(6)
objUser.SetInfo
end if
if (Line(7) <> "") then
objUser.Put "employeeType", Line(7)
objUser.SetInfo
end if 
if (Line(8) <> "") then
objUser.Put "telephoneNumber", Line(8)
objUser.SetInfo
end if
if (Line(9) <> "") then
objUser.Put "wWWHomePage", Line(9)
objUser.SetInfo
end if
if (Line(10) <> "") then 
objUser.Put "streetAddress", Line(10)
objUser.SetInfo
end if
if (Line(11) <> "") then
objUser.Put "l", Line(11)
objUser.SetInfo
end if
if (Line(12) <> "") then
objUser.Put "pager", Line(12)
objUser.SetInfo
end if
if (Line(13) <> "") then
objUser.Put "facsimileTelephoneNumber", Line(13)
objUser.SetInfo
end if
if (Line(14) <> "") then
objUser.Put "ipPhone", Line(14)
objUser.SetInfo
end if
if (Line(15) <> "") then
  objUser.Put "mail", Line(15)
  objUser.SetInfo
  end if
if (Line(16) <> "") then
 objUser.Put "manager", getCN(Line(16))
 objUser.SetInfo
 end if
objUser.SetInfo
End if

Loop


Список столбцов csv: uid;Title;Department;Name;LastName;Company;PostalCode;EmployeeType;telephoneNumber;wWWHomePage;streetAdress;l;pager;facsimileTelephoneNumber;ipPhone;mail;uid руководителя

При незначительных изменениях можно переделать под свои нужды.
  • 0
  • 27 января 2012, 16:26
  • admin

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Яндекс.Метрика