Имя: Пароль:
1C
1С v8
Создать пользователя в Active Directory из 1С
0 sergey198
 
19.07.11
08:51
Привет.
Посмотрел на форуме, написал:
SuperUser = "Полльзователь";
SuperUserPWD = "Пароль";
strOU = "OU=Users,"; //это группа в AD
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");  
strDC = objRootLDAP.Get("defaultNamingContext");
DS = ПолучитьCOMОбъект("LDAP:");      
objContainer = DS.OpenDSObject("LDAP://" + strOU + strDC, SuperUser, SuperUserPwd, 0);
Выдает произошла исключительная ошибка. Платформа 8.2. С чем это связано?
1 ДенисЧ
 
19.07.11
08:55
А ОписаниеОшибки() что говорит?
2 sergey198
 
19.07.11
08:58
"{Форма.Форма.Форма(115)}: Ошибка при вызове метода контекста (OpenDSObject): Произошла исключительная ситуация (0x80072030)"
3 ДенисЧ
 
19.07.11
09:03
В попытку заключи и в исключении выведи ОписаниеОшибки()
4 sergey198
 
19.07.11
09:07
SuperUser = "пользователь";
SuperUserPWD = "пароль";
strOU = "OU=Users,";
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");  
strDC = objRootLDAP.Get("defaultNamingContext");
DS = ПолучитьCOMОбъект("LDAP:");
Попытка
objContainer = DS.OpenDSObject("LDAP://" + strOU + strDC, SuperUser, SuperUserPwd, 0);
Исключение
       СодержаниеОшибки = ОписаниеОшибки();
       КонецПопытки;


СодержаниеОшибки  = Ошибка при вызове метода контекста (OpenDSObject): Произошла исключительная ситуация (0x80072030)"
5 sergey198
 
19.07.11
09:08
strOU = "OU=Users,"; //это группа в AD
Тип Users - Контейнер. Все верно вроде
6 Дикообразко
 
19.07.11
09:18
права то есть?
7 sergey198
 
19.07.11
09:19
Права есть точно.
8 Дикообразко
 
19.07.11
09:22
9 sergey198
 
19.07.11
09:34
Что посмотрел нето...
10 sergey198
 
19.07.11
09:43
Пробую так
Пользователь="пользователь";
Пароль="пароль";
ДСО=ПолучитьCOMОбъект("LDAP:");
ОУ=ДСО.OpenDSObject("LDAP://OU=Users, dc=local,dc=ud", Пользователь, Пароль,1);
Тоже самое исключительная ошибка..
11 smaharbA
 
19.07.11
09:59
Моя семерошник, меняй чо надо на ваши енумераторы, а так - рабочий на восьмерке:

Функция ПолучитьОбертку()
   ХТМЛ = Новый COMОбъект("htmlfile");
   ХТМЛ.Open("text/html");
   //<-- Подготовим нужные методы
   ХТМЛ.Write("<script type='text/javascript'>
   |var ХТМЛ;
   |Перечисление=function(x){return new Enumerator(x)}
   |МассивОбъекта=function(x,y){return new VBArray(x.Get(y.Name))}
   |МассивОбъектаВСтроку=function(x,y){return x.toArray().join(y)}
   |ТипЗначенияСтр=function(x){return typeof(x)}
   |ТипОбъектаСтр=function(x,y){return typeof(x.Get(y.Name))}
   |</script>");
   Док=ХТМЛ.documentElement.document;
   // Внедрение объекта Скрипта в самого себя, для сохранности контекста
   Док.script.ХТМЛ=ХТМЛ;
   // Все подготовке -->
   Возврат Док.script;
КонецФункции    // ПолучитьОбертку(Это)

//*******************************************
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Перем Пользователь,Пароль,Домен,Стр,Контроллер,Отбор;
   Это=ПолучитьОбертку();

   ТЗ=Новый ТаблицаЗначений;
   Домен="avangard.karat-e.ru";//Если пусто, то текущего усера
   Пользователь="администратор@avangard.karat-e.ru";
   Пароль="СуперПароль";
   ДСО=ПолучитьCOMОбъект("LDAP:");
   Корень=ДСО.OpenDSObject("LDAP://RootDSE", Пользователь, Пароль,1);
   ТекстЗапроса="<LDAP://"+Контроллер;
   Если ПустаяСтрока(Домен)=Истина Тогда
       Провайдер="Provider=ADSDSOObject;User Id="+Пользователь+"@"+Домен+";Password="+Пароль;
       ТекстЗапроса=ТекстЗапроса+Стр+">";
   Иначе
       Провайдер="Provider=ADSDSOObject;";
       ТекстЗапроса=ТекстЗапроса+Корень.Get("defaultNamingContext")+">";
   КонецЕсли;

   //Отберем только тип пользователи и только начинается логин вин200 на букову G
   Маска="*";
   Отбор=";(&(objectClass=Group)(sAMAccountName=" + Маска + "));AdsPath;subTree";
   ТекстЗапроса=ТекстЗапроса+Отбор;

   Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.Open(Провайдер);
   Записи=Соединение.Execute(ТекстЗапроса);
   Пока Записи.EOF=0 Цикл
       Состояние(Записи.Fields(0).Value);
       НоваяСтрока=ТЗ.Добавить();

       ЗаписиОбъекта=ПолучитьCOMОбъект(Записи.Fields(0).Value);
       ЗаписиОбъекта.GetInfo();
       Сч=0;
       Пока 1=1 Цикл
           Попытка
               Сч=Сч+1;
               Поле=ЗаписиОбъекта.Next();
           Исключение
               Прервать;
           КонецПопытки;
           Колонка=СтрЗаменить(Поле.Name,"-","_");
           КолонкаТЗ=ТЗ.Колонки.Найти(Колонка);
           Если КолонкаТЗ=Неопределено Тогда
               КолонкаТЗ=ТЗ.Колонки.Добавить(Колонка);
           КонецЕсли;
           Если ТипЗнч(ЗаписиОбъекта.Get(Поле.Name))=Тип("COMSafeArray") Тогда
               Попытка
                   НоваяСтрока.Установить(ТЗ.Колонки.Индекс(КолонкаТЗ),Это.МассивОбъектаВСтроку(Это.МассивОбъекта(ЗаписиОбъекта,Поле),":::"));
                   Сообщить(Это.МассивОбъектаВСтроку(Это.МассивОбъекта(ЗаписиОбъекта,Поле),"" ""));
               Исключение
                   НоваяСтрока.Установить(ТЗ.Колонки.Индекс(КолонкаТЗ),ОписаниеОшибки());
               КонецПопытки;
           Иначе
               НоваяСтрока.Установить(ТЗ.Колонки.Индекс(КолонкаТЗ),ЗаписиОбъекта.Get(Поле.Name));
           КонецЕсли;
       КонецЦикла;
       Записи.MoveNext();
   КонецЦикла;
   ПерыеКолонки="name
   |displayName
   |sAMAccountName
   |userPrincipalName
   |telephoneNumber
   |mail";
   Стр="";
   Для Сч=-СтрЧислоСтрок(ПерыеКолонки) По -1 Цикл
       Если Не ТЗ.Колонки.Найти(СтрПолучитьСтроку(ПерыеКолонки,-Сч-1))=Неопределено Тогда
           ТЗ.Колонки.Сдвинуть(СтрПолучитьСтроку(ПерыеКолонки,-Сч-1),-ТЗ.Колонки.Индекс(ТЗ.Колонки.Найти(СтрПолучитьСтроку(ПерыеКолонки,-Сч-1))));
       КонецЕсли;
   КонецЦикла;
   ТЗ.Сортировать("name");
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
12 sergey198
 
19.07.11
10:00
Понял щас попробую
13 sergey198
 
19.07.11
10:12
Список получаю..теперь надо подумать как добавить пользователя..
14 Aprobator
 
19.07.11
10:18
создание пользователя домена из 1С - ки? Офигеть, чего только из 1Сины не пытаются сделать.
15 smaharbA
 
19.07.11
10:18

Пользователь = Подразделение.Create("User", "cn=Вася Пупкин");
Пользователь.Put("sAMAccountName", "Вася_Пупкин");
Пользователь.SetInfo();
Пользователь.SetPassword("ПарольВасиПупкина");
Группа.Add(Пользователь.ADSPath);
16 sergey198
 
19.07.11
10:31
Пользователь.SetInfo();
Ругается опять..пишет исключительная ситуация
17 Aprobator
 
19.07.11
10:32
у пользователя под которым это делается права админа домена есть?
18 sergey198
 
19.07.11
10:35
Захожу в группу users нахожу себя там, смотрю "членн групп" Администратор домена присутсвует.
19 DrMabuzo
 
19.07.11
10:38
ось какая?
20 sergey198
 
19.07.11
10:39
сервер 2003
21 sergey198
 
19.07.11
10:40
objUser = objContainer.Create("User", strCN);
objUser.Put("userPrincipalName" , strSam + "@" + strDomain);
objUser.Put("sAMAccountName" ,strSam);
objUser.SetInfo(); //Вот тут вырубается непойму почему
22 DrMabuzo
 
19.07.11
10:47
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт  
   Результат = Ложь;
   element_user = "";
   element_group = "";  
   Попытка  
       element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");  
       element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");  
       element_group.Add(element_user.ADsPath);  element_group.SetInfo();  
       Результат = Истина;
   Исключение  
       Результат = Ложь;
   КонецПопытки;  
   
   Возврат Результат;
КонецФункции
23 sergey198
 
19.07.11
10:59
(22) имя домена у меня local.dc
Имя пользователя (нового) ставлю например "вася"
Имя группы "Users"
На первой попытке выдитает сразу..
24 DrMabuzo
 
19.07.11
11:04
а ты руками этого пользователя в этой группе пробовал создавать?
25 sergey198
 
19.07.11
11:04
нет щас попробую.
26 sergey198
 
19.07.11
11:07
Блин точно ,пишет..проверьте минимум символов в пароле..А где это можно посмотреть, какая длина пароля должна быть?
27 DrMabuzo
 
19.07.11
11:10
в групповых политиках можно, но только не поломай ничего
28 sergey198
 
19.07.11
11:14
минимум 7 щас попробую.
29 sergey198
 
19.07.11
11:15
а как пароль запихнуть?
30 DrMabuzo
 
19.07.11
11:18
//видимо перед
element_group.SetInfo();
//надо писать
element_user.SetPassword("ПАРРРРРООООЛЬЬЬЬЙИЩЩЕЕ");
31 aleks-id
 
19.07.11
11:20
SuperUser = "логин_админа";
SuperUserPWD = "пароль_админа";
strOU = "OU=Admins,";
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");  
strDC = objRootLDAP.Get("defaultNamingContext");
DS = ПолучитьCOMОбъект("LDAP:");      
objContainer = DS.OpenDSObject("LDAP://" + strOU + strDC, SuperUser, SuperUserPwd, 0);

а после этого уже мути с objContainer
32 sergey198
 
19.07.11
11:27
Непойму
SuperUser = "Пользователь";
SuperUserPWD = "пароль";
strOU = "CN=Bses,";
objRootLDAP = ПолучитьCOMОбъект("LDAP://rootDSE");  

strDC = objRootLDAP.Get("defaultNamingContext");
DS = ПолучитьCOMОбъект("LDAP:");      
objContainer = DS.OpenDSObject("LDAP://CN=Bosses,CN=Users,DC=local,DC=uden", SuperUser, SuperUserPwd, 0);


objUser = objContainer.Create("User", strCN);
objUser.Put("userPrincipalName" , strSam + "@" + strDomain);
objUser.Put("sAMAccountName" ,strSam);
objUser.SetInfo();//Доходит до сюда и валится.
33 smaharbA
 
19.07.11
11:29

//*******************************************
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Перем Пользователь,Пароль,Домен,Стр,Контроллер,Отбор,Подразделение,Группа;
   
   Домен="avangard.karat-e.ru";
   Пользователь="администратор@avangard.karat-e.ru";
   Пароль="СуперПарольАдминистратора";
   ДСО=ПолучитьCOMОбъект("LDAP:");
   ТекстЗапроса="<LDAP://"+Контроллер;
   Корень=ДСО.OpenDSObject("LDAP://RootDSE", Пользователь, Пароль,1);
   Провайдер="Provider=ADSDSOObject;";
   ТекстЗапроса=ТекстЗапроса+Корень.Get("defaultNamingContext")+">";

   Маска="Сбыт";//Какое есть подразделение
   Отбор=";(&(objectClass=organizationalUnit)(name=" + Маска + "));AdsPath;subTree";
   ТекстЗапросаОтбор=ТекстЗапроса+Отбор;
   Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.Open(Провайдер);
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Пока Записи.EOF=0 Цикл
       Подразделение=ДСО.OpenDSObject(Записи.Fields(0).Value, Пользователь, Пароль,1);
       Сообщить(Подразделение.AdsPath);
       Прервать;
       Записи.MoveNext();
   КонецЦикла;
   Если ПустаяСтрока(Подразделение)=Истина Тогда
       Возврат;
   КонецЕсли;
   Маска="Менеджеры";//Какая есть группа
   Отбор=";(&(objectClass=Group)(sAMAccountName=" + Маска + "));AdsPath;subTree";
   ТекстЗапросаОтбор=ТекстЗапроса+Отбор;
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Пока Записи.EOF=0 Цикл
       Группа=ДСО.OpenDSObject(Записи.Fields(0).Value, Пользователь, Пароль,1);
       Сообщить(Группа.AdsPath);
       Прервать;
       Записи.MoveNext();
   КонецЦикла;
   Пользователь = Подразделение.Create("User", "CN=Вася Пупкин II");
   Пользователь.Put("sAMAccountName", "Вася_Пупкин_II");
   Пользователь.Put("displayName", "Вася Пупкин II");
   Пользователь.Put("userPrincipalName", "Вася_Пупкин_II@"+Домен);
   Пользователь.SetInfo();
   Пользователь.SetPassword("ПарольВасиПупкина");
   Пользователь.AccountDisabled=0;
   Пользователь.SetInfo();
   Группа.Add(Пользователь.ADSPath);
   Сообщить(Пользователь.AdsPath);
КонецПроцедуры
34 sergey198
 
19.07.11
11:41
Пользователь.SetInfo();
И вылитает..что за....
35 sergey198
 
19.07.11
11:55
Все заработало!!! Спасибо.
36 smaharbA
 
19.07.11
12:15

Функция ПолучитьLDAPОбъект(Путь,Пользователь="",Пароль="")
   Если ПустаяСтрока(Пользователь)=Истина Тогда
       Возврат ПолучитьCOMОбъект(Путь);
   КонецЕсли;
   ДСО=ПолучитьCOMОбъект("LDAP:");
   Возврат ДСО.OpenDSObject("LDAP://RootDSE", Пользователь, Пароль,1);
КонецФункции


//*******************************************
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Перем Пользователь,Пароль,Домен,Стр,Контроллер,Отбор,Подразделение,Группа;
   
   Домен="avangard.karat-e.ru";
   //Пользователь="администратор@"+Домен; // Если использовать, будет авторизация
   //Пароль="СуперПарольАдминаЕслиНадо";
   ТекстЗапроса="<LDAP://"+Контроллер;
   Корень=ПолучитьLDAPОбъект("LDAP://RootDSE",Пользователь,Пароль);
   Провайдер="Provider=ADSDSOObject;";
   ТекстЗапроса=ТекстЗапроса+Корень.Get("defaultNamingContext")+">";

   Маска="Сбыт";
   Отбор=";(&(objectClass=organizationalUnit)(name=" + Маска + "));AdsPath;subTree";
   ТекстЗапросаОтбор=ТекстЗапроса+Отбор;
   Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.Open(Провайдер);
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Пока Записи.EOF=0 Цикл
       Сообщить(Записи.Fields(0).Value);
       Подразделение=ПолучитьLDAPОбъект(Записи.Fields(0).Value,Пользователь,Пароль);
       Сообщить(Подразделение.AdsPath);
       Прервать;
       Записи.MoveNext();
   КонецЦикла;
   Если ПустаяСтрока(Подразделение)=Истина Тогда
       Возврат;
   КонецЕсли;
   Маска="Менеджеры";
   Отбор=";(&(objectClass=Group)(sAMAccountName=" + Маска + "));AdsPath;subTree";
   ТекстЗапросаОтбор=ТекстЗапроса+Отбор;
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Пока Записи.EOF=0 Цикл
       Группа=ПолучитьLDAPОбъект(Записи.Fields(0).Value,Пользователь,Пароль);
       Сообщить(Группа.AdsPath);
       Прервать;
       Записи.MoveNext();
   КонецЦикла;
   Имя="Вася Пупкин II";
   ПолноеИмя=Имя;
   ОтображаемоеИмя=ПолноеИмя;
   ИмяПринципала=СтрЗаменить(Имя," ","_")+"@"+Домен;
   ИмяПредВиндуз2000=СтрЗаменить(Имя," ","_");
   Отбор=";(&(objectClass=User)(sAMAccountName=" + ИмяПредВиндуз2000 + "));AdsPath;subTree";
   ТекстЗапросаОтбор=ТекстЗапроса+Отбор;
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Если Записи.RecordCount > 0 Тогда
       Сообщить("Есть уже нафиг - " + Имя);
       Возврат;
   КонецЕсли;
   
   Пользователь = Подразделение.Create("User", "CN="+Имя);
   Пользователь.Put("sAMAccountName", ИмяПредВиндуз2000);
   Пользователь.Put("displayName", ОтображаемоеИмя);
   Пользователь.Put("name", ПолноеИмя);
   Пользователь.Put("userPrincipalName", ИмяПринципала);
   Пользователь.SetInfo();
   Пользователь.SetPassword("ПарольВасиПупкина");
   Пользователь.AccountDisabled=0;
   Пользователь.SetInfo();
   Группа.Add(Пользователь.ADSPath);
   Сообщить("Создан нафиг!!! - "+Пользователь.AdsPath);
КонецПроцедуры
37 sergey198
 
19.07.11
12:49
а как удалить если есть такая запись?
   Записи=Соединение.Execute(ТекстЗапросаОтбор);
   Если Записи.RecordCount > 0 Тогда
       Сообщить("Есть уже нафиг - " + Имя);
       
       Возврат;
   КонецЕсли;
38 sergey198
 
19.07.11
12:52
Подразделение.Delete("user", "CN="+Имя);
Понял
Закон Брукера: Даже маленькая практика стоит большой теории.