Adaptersoft : Пакетное создание пользователей

обработка для пакетного создания пользователей в 1С и в ActiveDirectory. На универсальность не претендую, делал под задачу, но вроде должна работать и в типовых конфигурациях.

Может брать список из Екселя. Поля подхватываются по наименованию, диапазон задавать не надо — сам найдет.

В AD пользователи создаются через провайдер LDAP (ADSI).

Если в 1С задавать аутентификацию ОС, то сначала запустите с галкой «Создать в терминале», а потом второй раз с галкой «создать в 1С». Потому что пакетом юзвери в AD создаются медленно и поэтому не сразу находятся.

При повторном запуске пользователи пересоздаются. И в AD и в 1С.

 


Обработка устарела, вернее выросла в конфигурацию ServiceDesk1C

 

 

 

 

22 Comments

  1. GSoft

    эх.. такую бы на семерке

    Reply
  2. Fuego

    RostovoblgazService — А это зачем? 🙂

    Reply
  3. adapter

    (1) LDAP думаю можно и на 7.7. поюзать, Ексель тоже. А вот создать юзверей в конфигураторе не выйдет.

    (2) это название группы в моем AD. Если у вас все в корне — оставьте пустым

    Reply
  4. Abadonna

    (3) 7.7. поюзать, Ексель тоже. А вот создать юзверей в конфигураторе не выйдет.

    В 7.7 юзвери в конфигураторе (вернее, в конфигурации) никогда и не создавались. А для тех, кто знает структуру users.usr, насоздавать юзверей — как два байта отослать 😉

    Reply
  5. Fuego
    Код
    Процедура СоздатьПользователя(Имя, Аккаунт, НачальныйПароль)
    
       ADS_UF_NORMAL_ACCOUNT = 512;
    
       Попытка
          DSE = ПолучитьCOMОбъект("LDAP://rootDSE");
          
           мПользователи = ПолучитьCOMОбъект("LDAP://CN=Users," +  DSE.Get("defaultNamingContext"));
                            
           мНовыйПользователь = мПользователи.Create("user", "CN=" + Имя);
             
           мНовыйПользователь.Put("sAMAccountName", Аккаунт);
    
           мНовыйПользователь.SetInfo();
    
           мНовыйПользователь.SetPassword(НачальныйПароль);
    
           мНовыйПользователь.Put("pwdLastSet", 0);
    
          мНовыйПользователь.Put("userAccountControl", ADS_UF_NORMAL_ACCOUNT);
          
           мНовыйПользователь.SetInfo();
       Исключение
          Сообщить(ОписаниеОшибки());
       КонецПопытки;
    КонецПроцедуры

    Показать полностью

    Reply
  6. Fuego

    И в догонку ещё одну процедурку:

    Код
    Процедура СоздатьПользователя_в_1С_с_АутентификациейОС(ИмяУчетнойЗаписи, Аккаунт)
       Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяУчетнойЗаписи);
       Если Пользователь <> Неопределено Тогда
          Если Пользователь.АутентификацияОС И Пользователь.ПользовательОС = Аккаунт Тогда
             Сообщить("Пользователь «"+ИмяУчетнойЗаписи+"» уже существует и имеет аутентификацию ОС");
             Возврат;
          КонецЕсли;
       Иначе
          Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
       КонецЕсли;
       Пользователь.АутентификацияОС = Истина;
       Пользователь.ПользовательОС = Аккаунт;
       Пользователь.Имя = ИмяУчетнойЗаписи;
       Пользователь.ПолноеИмя = ИмяУчетнойЗаписи;
       Попытка
           Пользователь.Записать();
       Исключение
          Сообщить(ОписаниеОшибки());
       КонецПопытки;
    КонецПроцедуры

    Показать полностью

    Reply
  7. sound

    А чтоб самому не париться с users.usr и «байты не отсылать», можно как вариант

    для создания юзверей в 7-ке UsersDef.dll поюзать, так еще прошу будет

    Reply
  8. sound

    Извиняюсь, хотел написать «так еще проще будет»

    ЗЫ: еще б уж тогда до кучи добавить чтоб у этих же юзеров заодно и почта на exchange прописывалась, чтоб админы ваще не работали 🙂

    Reply
  9. kgw@list.ru

    Подскажите, а если нет домена тогда как?

    Reply
  10. adapter

    через LDAP можно и локальных пользователей создавать. В мануале по ADSI описано. Выложить?

    Reply
  11. Zlodey

    В Висте 64 бита не работает, ругается:

    {Форма.Форма(218)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: Указанный домен не существует или к нему невозможно подключиться.

    objRootLDAP = ПолучитьCOMОбъект(«LDAP://rootDSE»);

    //домен для авторизации ОС

    objRootLDAP = ПолучитьCOMОбъект(«LDAP://rootDSE»); —- вот тут

    strDC = objRootLDAP.Get(«defaultNamingContext»); //получаем имя домена формата LDAP

    Домен = СтрЗаменить(strDC, «,DC=ru», «»);

    Домен = СтрЗаменить(Домен, «DC=», «\»);

    Reply
  12. adapter

    видимо дело не в Висте, а в том что у вас домена нет

    Reply
  13. BaronDevil

    Выложите пожалуйста обработку с учетом того что нет домена. Большое спасибо)

    Reply
  14. Jacki

    а можно поподробнее объяснить следующий момент:

    // для работы в AD от имени другого пользователя, не текущего
    //Set objContainer = objRootLDAP.OpenDSObject(«LDAP://» + strOU + strDC, «admin», «пароль», 0)
    

    не понял как это использовать 😳

    если просто вставлять в код

    strOU = «Admins»;
    strDC = «DC=test,DC=lan»;
    objRootLDAP = ПолучитьCOMОбъект(«LDAP://» + strDC);
    Set objContainer = objRootLDAP.OpenDSObject(«LDAP://» + strOU + strDC, «admin», «123», 0);

    то выдаётся сообщение об ошибке «Неопознанный оператор SET <<?>>objContainer»

    если без SET:

    strOU = «Admins»;
    strDC = «DC=test,DC=lan»;
    objRootLDAP = ПолучитьCOMОбъект(«LDAP://» + strDC);
    objContainer = objRootLDAP.OpenDSObject(«LDAP://» + strOU + strDC, «admin», «123», 0);

    то ругается «Метод объекта не обнаружен (OpenDSObject)»

    Заранее спасибо!

    Reply
  15. adapter

    я конечно структуры ваших доменов не знаю, но думаю что вы напутали в этой строчке:

    strDC = «DC=test,DC=lan»;

    посмотрите как вам возвращается ваш домен по умолчанию в

    objRootLDAP = ПолучитьCOMОбъект(«LDAP://rootDSE»)

    Reply
  16. Jacki
    objRootLDAP = ПолучитьCOMОбъект(«LDAP://rootDSE»);
    strDC = objRootLDAP.Get(«defaultNamingContext»);

    strDC = «DC=test,DC=lan»

    сам домен имеет вид test.lan

    Reply
  17. Jacki

    разобрался, чтобы получить доступ от имени другого пользователя

    SuperUser = «admin»;
    SuperUserPWD = «123»;
    strOU = «OU=Admins,»;
    objRootLDAP = ПолучитьCOMОбъект(«LDAP://rootDSE»);
    strDC = objRootLDAP.Get(«defaultNamingContext»);
    DS = ПолучитьCOMОбъект(«LDAP:»);
    objContainer = DS.OpenDSObject(«LDAP://» + strOU + strDC, SuperUser, SuperUserPwd, 0);
    

    Показать

    ещё раз спасибо за обработку и помощь! 😉

    Reply
  18. adapter

    обработка устарела. с конца 2008 года (когда я ее выкладывал) уже много воды утекло. переписал прилично, так что список изменений уже и весь не воспроизведу. Теперь обработка на 8.2 и в составе конфигурации ServiceDesk1С. На демке этот модуль кажется открыт — смотрите, колупайте кому надо.

    На вскидку:

    — может работать без домена (кто то просил)

    — определяет права и группы из АД. Можно по умолчанию настроить для каждой базы или потом докинуть прав существующим пользователям AD

    — расширенный поиск по АД — (по логину, части ФИО и пр.)

    — все переписано под библиотеку универсальных запросов к AD (в составе конфы)

    — может интегрироваться с любым сервисом, в том числе и не 1С. Процесс автоматизирован

    Ну и впринципе сама обработка практических задач решает мало. Надо базу, чтоб хранила настройки, созданные учетки, управляла ими и пр. Ну собсно потому и ServiceDesk.

    А обработка — просто пример кода, «кирпичик»

    Reply
  19. Jacki

    (18) При попытке создать пользователя спотыкаюсь на установке пароля для пользователя

    {Обработка.СозданиеПользователей.Форма.Форма.Форма(417)}: Ошибка при вызове метода контекста (SetPassword)

    objUser.SetPassword(strPWD);

    по причине:

    Произошла исключительная ситуация (0x80072030)

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

    пароль соответствует политике безопасности

    objUser.userAccountControl = 65536;

    objUser.pwdLastSet = 0;

    strPWD = «7EdfmR!»;

    objUser.SetPassword(strPWD);

    как думаете — в чём могут быть грабли?

    P.S.: на 8.1 то же самое возвращает такую ошибку

    {Форма.Форма(392)}: Ошибка при вызове метода контекста (SetPassword): Произошла исключительная ситуация (Active Directory): Один или более входных параметров неправильны

    objUser.SetPassword(strPWD);

    по причине:

    Произошла исключительная ситуация (Active Directory): Один или более входных параметров неправильны

    Reply
  20. Jacki

    После многочисленных прогонов открылся интересный нюанс — с вероятностью 1/15 — 1/20 пароль таки задаётся…

    Определённо проблемы на контроллере домена.

    Reply
  21. Massimo

    Спасибо за обработку, пригадилась

    Reply
  22. Гость

    Спасибо за обработку, пригодилась

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *