Имя: Пароль:
1C
1С v8
Как получить пользователей домена из 1С используя LDAP
,
0 Demetres
 
27.04.12
15:21
Добрый день! Столкнулся с такой проблемой, нужно получить пользователей домена из 1С при помощи методов провайдера LDAP, нашел кусок кода переделал его под свои нужды и всё бы хорошо, но только он не работает, выдает такую ошибку:

{Форма.Форма.Форма(193)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Provider): Таблица не существует.

Думаю что запрос составлен не верно т. к. падает в момент выполнения Execut(), если кто в теме подскажите что не так. Текст функции:

    Домен = "NameDomen";
    СуперПользователь = "SuperUzverь";

    КомандаАДО    = Новый COMОбъект("ADODB.Command");
    СоединениеАДО = Новый COMОбъект("ADODB.Connection");
    СоединениеАДО.Provider = "ADsDSOObject;User Id=" + Домен + "\"+СуперПользователь+",ou=people,ou=domain,dc="+Домен+";Password=PasswordUser;";
    СоединениеАДО.Open("Active Directory Provider");
    КомандаАДО.ActiveConnection = СоединениеАДО;
   
    ТекстЗапроса = "<LDAP://"+Домен+"/ou=users,dc="+Домен+">;(&(objectCategory=person)(objectClass=user));subtree";

   
    КомандаАДО.CommandText = ТекстЗапроса;
    КомандаАДО.Properties("Page Size").Value = 100;
    КомандаАДО.Properties("Timeout").Value = 30;
    КомандаАДО.Properties("Cache Results").Value = Ложь;
    ВыборкаАДО = КомандаАДО.Execute();
    Пока НЕ ВыборкаАДО.EOF Цикл
       
        //Как-то просматриваем и обрабатываем содержимое атрибутов
        //как это делается тоже пока не знаю
       
        ВыборкаАДО.MoveNext();
    КонецЦикла;
1 Demetres
 
27.04.12
15:32
help
2 Demetres
 
27.04.12
15:43
Ещё Выше
3 Demetres
 
27.04.12
15:54
Опять вверх
4 ДенисЧ
 
27.04.12
16:01
А книгу Михайлова читал?
5 pumbaEO
 
27.04.12
16:14
6 Demetres
 
27.04.12
16:15
(4) не читал что за чудо книга такая?
(5) спасибо сейчас посмотрю
7 pumbaEO
 
27.04.12
16:15
http://support.microsoft.com/kb/187529/ru

Чем обидел google, что он тебе не отвечает, разговаривать с тобой не хочет?
8 Demetres
 
27.04.12
16:20
(5) книгу Михалыча читал там про LDAP нету
(7) буду изучать
9 Demetres
 
27.04.12
16:32
Пробовал по разному переделывать текст запроса но всё время натыкаюсь на ошибку:
Произошла исключительная ситуация (Provider): Таблица не существует.
10 pumbaEO
 
27.04.12
16:34
начнем с малого: права?
11 Demetres
 
27.04.12
16:38
(10) права администратора домена
12 akaBrr
 
27.04.12
16:39
Работающий пример

conn = ПолучитьCOMОбъект("","ADODB.Connection");
conn.Open("Provider=ADSDSOObject;User Id="+Аутентификация.Логин+"@main.local;Password="+Аутентификация.Пароль+";");
query = "SELECT ADsPath FROM 'LDAP://"+Константы.Домен.Получить()+"' WHERE objectClass='"+ТипОбъекта+"'";    
rs = conn.Execute(query);
   
Пока НЕ rs.EOF() Цикл
           
 obj = ПолучитьCOMОбъект(rs.Fields(0).Value);
           
 НС = СписокОбъектов.Добавить();

 НС.ГУИД = obj.GUID;

 НС.Путь = rs.Fields(0).Value;
           
 rs.MoveNext();
           
КонецЦикла;
13 Demetres
 
27.04.12
16:44
(12) ТипОбъекта это что и чему может равнятся
14 akaBrr
 
27.04.12
16:46
(13) Например - "user"
15 akaBrr
 
27.04.12
16:48
А еще может быть "group"
16 akaBrr
 
27.04.12
16:49
17 Demetres
 
27.04.12
16:50
(14) пробовал * и user опять туже ошибку пишет "Произошла исключительная ситуация (Provider): Таблица не существует."
18 akaBrr
 
27.04.12
16:52
user в кавычках "'"?
19 Demetres
 
27.04.12
16:58
(18) вот так писал WHERE objectClass='"+"user"+"'";
20 Fram
 
27.04.12
17:02
у меня когда то (давно не использовал) вот такой код работал:

Set obj = GetObject("LDAP://DC=ru/DC=audatex/DC=office/CN=Users")

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = FSO.CreateTextFile("c:\111\123.txt")

for each o in obj
   TextStream.WriteLine o.ADsPath
next

TextStream.Close
21 Fram
 
27.04.12
17:02
Это vbscript, если что
22 Demetres
 
27.04.12
17:05
(20) а кто в курсе что означает вот эта строка "DC=ru"
23 Fram
 
27.04.12
17:08
(22)
   OU - Organization Unit - организационный блок (организационная единица или подразделение), которая содержит такие объекты, как пользователи, контакты, группы и др.
   CN - Common Name - общее (относительное) имя. Пользователь, контакт, группа или другой объект, который как правило не имеет дочерних объектов.
   DC - Domain Component – компонент доменного имени.
24 smaharbA
 
27.04.12
17:10
у объектов переменное количество свойств и методов
25 smaharbA
 
27.04.12
17:13
болван ка

Функция ПолучитьОбертку()
   ХТМЛ = Новый 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;
КонецФункции    // ПолучитьОбертку(Это)

Функция Получить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);
КонецПроцедуры
26 akaBrr
 
27.04.12
17:16
(25) сообщения жгут, как и Вася Пупкин 2
27 smaharbA
 
27.04.12
17:16
болван ка два

Функция ПолучитьОбертку()
   ХТМЛ = Новый 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";
   Отбор=";(&(objectClass=organizationalUnit)(name=Сбыт));AdsPath;subTree";
   ТекстЗапроса=ТекстЗапроса+Отбор;

   Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.Open(Провайдер);
   Записи=Соединение.Execute(ТекстЗапроса);
   Пока Записи.EOF=0 Цикл
       Состояние(Записи.Fields(0).Value);
       КолонкаТЗ=ТЗ.Колонки.Найти("ADSPath");
       Если КолонкаТЗ=Неопределено Тогда
           КолонкаТЗ=ТЗ.Колонки.Добавить("ADSPath");
       КонецЕсли;
       НоваяСтрока=ТЗ.Добавить();
       НоваяСтрока.Установить(ТЗ.Колонки.Индекс(КолонкаТЗ),Записи.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");
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
28 Fram
 
27.04.12
17:17
Да... в системных скриптах ты крут! :)
29 akaBrr
 
27.04.12
17:17
(19) попробуй сделать без отбора по классам, убери "+"' WHERE objectClass='"+ТипОбъекта+"'";"
30 Demetres
 
27.04.12
17:18
А кто-нибудь может у себя попробовать мой код в посте (0), работает он или нет
31 Demetres
 
27.04.12
17:24
(29) таже ошибка "Произошла исключительная ситуация (Provider): Таблица не существует."
query = "SELECT ADsPath FROM 'LDAP://"+Константы.Домен.Получить()+"'";
32 CyberNut
 
27.04.12
17:28
Вот когда-то делал: http://infostart.ru/public/95857/
Может быть поможет.
33 akaBrr
 
27.04.12
17:29
(31) Домен "NameDomen" существует?
34 Demetres
 
27.04.12
17:32
(32) если можено на почту не дает бесплатно скачать "soldatenko_da"+"собака"+"gw.tander.ru"
35 Demetres
 
27.04.12
17:33
(33) я пробовал и так:
query = "SELECT ADsPath FROM 'LDAP://"+"имяДомена"+"'";
36 akaBrr
 
27.04.12
17:34
(35) погоди, после "LDAP://" нельзя писать, что в голову взбредет
37 Demetres
 
27.04.12
17:36
(36) я и пишу имя домена, а как надо?
38 akaBrr
 
27.04.12
17:36
(35)Вот у Абрахамса домен "avangard.karat-e.ru", а у тебя какой?
39 CyberNut
 
27.04.12
17:40
(34) отправил
40 Demetres
 
27.04.12
17:41
(38) не пойму почему "avangard.karat-e.ru" а не просто "avangard"? Я пишу "ИмяДомена" а не "имяДомена.ru" у меня же не сайт. Может глупость написал если что не казните сильно
41 akaBrr
 
27.04.12
17:44
(40) ну так напиши имя домена, ничего мы с ним не сделаем
42 Demetres
 
27.04.12
17:54
(39) а если использовать: RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE"); пишет что:
Ошибка получения объекта COM: Указанный домен не существует или к нему невозможно подключиться.
(41) "MyDomain" надо писать "MyDomain.ru"
43 Demetres
 
27.04.12
17:54
"MyDomain.ru" хотя я так тоже пробовал писать
44 Demetres
 
27.04.12
18:11
Кто-нибудь может проверить у себя работоспособность кода в первом посте может я просто данные пользователя неправильно заполняю или домена
45 Demetres
 
27.04.12
18:32
up
46 Fram
 
27.04.12
18:45
(42) Похоже это netbios имя домена. А dns имя какое? Может RootDSE.local?
47 Fram
 
27.04.12
18:48
nslookup RootDSE что выдает?
48 Demetres
 
27.04.12
18:58
(47) так пишет что:
{Форма.Форма.Форма(61)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
   RootDSE = ПолучитьCOMОбъект("LDAP://nslookup RootDSE");
по причине:
Ошибка получения объекта COM: Сервер неработоспособен.

А как посмотреть DNS имя сервера?
49 Fram
 
27.04.12
19:00
(48) :) nslookup в командной строке надо было писать
50 Demetres
 
27.04.12
19:09
Пишет что не может найти сервер для IP и пишет сам адрес. Только странно этот адрес не такой как мне системщики наши дали
51 Fram
 
27.04.12
19:14
короче, 99% что с твоего компа этот домен недоступен
52 Demetres
 
27.04.12
19:18
(51) странно но при помощи утилит я могу редактировать учетные записи пользователей
53 Demetres
 
27.04.12
19:38
вверх
54 smaharbA
 
27.04.12
19:40
(40) нужно полное фкун имя домена, у тебя ведь не нт3.51, а как минимум вин2000
55 Demetres
 
27.04.12
19:42
(54) да у меня windows 2003 стоит, но я не знаю как получить это полное имя, подскажите пожалуйста
56 smaharbA
 
27.04.12
19:49
хотя бы так примерно, если компьютер входит в домен

АДСИ=СоздатьОбъект("ADSystemInfo");
Сообщить(АДСИ.DomainDNSName);
57 Demetres
 
27.04.12
19:59
(56) теперь написал {Форма.Форма.Форма(521)}: Ошибка при получении значения атрибута контекста (DomainDNSName)
   Сообщить(АДСИ.DomainDNSName);
по причине:
Произошла исключительная ситуация (0x8007054b)

Завтра у сис. админов буду требовать DNS имя домена
58 Demetres
 
28.04.12
08:19
(56) не может быть что команда RootDSE недоступна из-за того что у меня не AD а ADSI? Хотя провайдер LDAP доступен и там и там
59 Demetres
 
28.04.12
08:51
в TOP
60 Demetres
 
28.04.12
09:01
Люди помогите, кто может у себя проверить код для работы с LDAP?
61 Demetres
 
28.04.12
09:25
Человеки помогите, кто может у себя проверить код для работы с LDAP?
62 Demetres
 
28.04.12
09:41
вверх
63 Demetres
 
28.04.12
09:59
Проходит набор добровольцев на использование кода для работы в LDAP, записываемся не стесняемся :)
64 pumbaEO
 
28.04.12
10:06
http://jxplorer.org/downloads/users.html сначала подключись, проверь, а потом добровольцев набирай.
65 Demetres
 
28.04.12
10:20
(64) я использую LDAP admin с помощь него я могу просматривать учетные записи пользователей и т.д. а код в первом посте выдает ошибку, по этому и ищу кто сможет у себя протестить код, поможешь?
66 Demetres
 
28.04.12
10:39
Эх сорвался :)
67 Demetres
 
28.04.12
12:14
67
68 Demetres
 
28.04.12
12:33
Люди поделитесь светлыми идеями
69 smaharbA
 
28.04.12
12:39
код абсолютно рабочий, может требовать авторизацию
70 smaharbA
 
28.04.12
13:01
перед рутдсе можно задать имя домена, но если компьютер с которого выполняется входит в этот домен, то не имеет смысла
71 smaharbA
 
28.04.12
13:10

Функция ПолучитьОбертку()
   ХТМЛ = Новый 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;
КонецФункции    // ПолучитьОбертку(Это)

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

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

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

   Соединение = Новый COMОбъект("ADODB.Connection");
   Соединение.Open(Провайдер);
   Записи=Соединение.Execute(ТекстЗапроса);
   Пока Записи.EOF=0 Цикл
       Состояние(Записи.Fields(0).Value);
       КолонкаТЗ=ТЗ.Колонки.Найти("ADSPath");
       Если КолонкаТЗ=Неопределено Тогда
           КолонкаТЗ=ТЗ.Колонки.Добавить("ADSPath");
       КонецЕсли;
       НоваяСтрока=ТЗ.Добавить();
       НоваяСтрока.Установить(ТЗ.Колонки.Индекс(КолонкаТЗ),Записи.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");
   ТЗ.ВыбратьСтроку();
КонецПроцедуры
72 smaharbA
 
28.04.12
13:11
есть косяки, но не имеет значения
73 Demetres
 
28.04.12
13:44
(69) это про мой код или про тот что в (71)
74 Demetres
 
28.04.12
14:14
(72) что за косяк
75 Demetres
 
28.04.12
15:05
(72) Шо за косяк и хде?
76 Demetres
 
28.04.12
17:08
up
77 smaharbA
 
28.04.12
17:49
уже сказано - так или иначе либо твой компьютер, либо твоя программа должны знать
1. полное имя домена
2. адрес контроллера домена
3. имя и пароль пользователя домена с достаточными правами (если программа запущена не от пользователя домена)
78 Demetres
 
28.04.12
17:50
(77) спасибо
79 Demetres
 
28.04.12
17:59
Всем спасибо за помощь
2 + 2 = 3.9999999999999999999999999999999...