Имя: Пароль:
1C
 
Active directory..
0 Лохматые Уши
 
29.07.08
09:20
Салют! Мне необходимо получить спиок всех пользователей из Active Directory. Наверняка уже есть подобная реализация получения такого списка из 1с 8. Но я не нашел. Поделитесь пожалуйста. Или принцип, как это реализовать.
1 vde69
 
29.07.08
09:22
Функция ПолучитьСписокДоменов () Экспорт
   Результат = Новый Массив();
   objNameSpace = "";
                   
   Попытка
       objNameSpace = ПолучитьCOMОбъект("WinNT:");
       м = Новый Массив();
       м.Добавить("domain"); // Computer User Group GlobalGroup domain
       м2 = Новый COMSafeArray(м, "VT_VARIANT");
       objNameSpace.Filter = м2;
       Для каждого item Из objNameSpace Цикл
           Результат.Добавить(item.Name);
       КонецЦикла;
   Исключение
       Результат.Очистить();
   КонецПопытки;
   
   Возврат Результат;
КонецФункции

Функция ПолучитьСписокГруппВДомене (ИмяДомена, ТипГрупп = "GlobalGroup") Экспорт
   Результат = Новый Массив();
   objNameSpace = "";
   
   Попытка
       objNameSpace = ПолучитьCOMОбъект("WinNT://"+СокрЛП(ИмяДомена));
       м = Новый Массив();
       м.Добавить(ТипГрупп); // Computer User Group GlobalGroup domain
       м2 = Новый COMSafeArray(м, "VT_VARIANT");
       objNameSpace.Filter = м2;
       Для каждого item Из objNameSpace Цикл
           Результат.Добавить(item.Name);
       КонецЦикла;
   Исключение
       Результат.Очистить();
   КонецПопытки;
   
   Возврат Результат;
КонецФункции

Функция ПолучитьСписокПользователейВГруппеДомена (ИмяДомена, ИмяГруппы) Экспорт
   Результат = Новый Массив();
   objNameSpace = "";
   
   Попытка
       objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена) + "/" + СокрЛП(ИмяГруппы) + ", Group");
       Для каждого item Из objNameSpace.Members() Цикл
           Результат.Добавить(item.Name);
       КонецЦикла;
   Исключение
       Результат.Очистить();
   КонецПопытки;
   
   Возврат Результат;
КонецФункции

Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
   Результат = Ложь;
   
   Массив = ПолучитьСписокПользователейВГруппеДомена (СокрЛП(ИмяДомена), ИмяГруппы);

   Для каждого элМассив из Массив Цикл
       Если ВРег(элМассив) = ВРег(СокрЛП(ИмяПользователя)) Тогда
           // пользователь уже в группе
           Результат = Истина;    
           Прервать;
       КонецЕсли;
   КонецЦикла;
   
   Возврат Результат;
КонецФункции
2 Лохматые Уши
 
29.07.08
09:24
Вах!
СПАСИБО!
Буду проверять.
3 Лохматые Уши
 
29.07.08
10:43
Функция ПолучитьСписокПользователейВГруппеДомена(ИмяДомена, ИмяГруппы) Экспорт
   Результат = Новый Массив();
   objNameSpace = "";
   
   Попытка
       Если ИмяГруппы <> "" Тогда
       objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена) + "/" + СокрЛП(ИмяГруппы) + ", Group")
       Иначе
       objNameSpace = ПолучитьCOMОбъект("WinNT://" + СокрЛП(ИмяДомена))    
       КонецЕсли;    
       Для Каждого item Из objNameSpace.Members() Цикл
           Результат.Добавить(item.Name)
       КонецЦикла
   Исключение
       Результат.Очистить()
   КонецПопытки;
   
   Возврат Результат
КонецФункции

Все работает, но вот незадача - как получить список всех пользователей, не указывая конкретно группу. Пробовал пустую строку передавать, вообще ничего не передавать, рузультат один - пустота.
4 smaharbA
 
29.07.08
10:45
net user /domain
5 smaharbA
 
29.07.08
10:48
семерка

Функция ПолучитьОбъект(Путь="winmgmts:",ШаблонИсп=1)
   Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
   Скрипт.language="vbscript";
   Возврат Скрипт.Eval("GetObject("""+Путь+""")");
КонецФункции    // ПолучитьОбъект

Функция GetObject(Путь="winmgmts:")
   Возврат ПолучитьОбъект(Путь);
КонецФункции    // GetObject
//*******************************************

Процедура ПриОткрытии()
   СтатусВозврата(0);
   Если Форма.МодальныйРежим()=0 Тогда
       Параметр=Форма.Параметр;
       ОткрытьФормуМодально("Обработка.__СписокПользователейСистемы",Параметр);
       Возврат;
   КонецЕсли;
   Сеть=СоздатьОбъект("WScript.Network");
   ПользовательСистемы=Сеть.UserName;
   Домен=Сеть.UserDomain;
   Если ПустоеЗначение(Форма.Параметр)=1 Тогда
       Форма.Параметр=СоздатьОбъект("СписокЗначений");
       Форма.Параметр.ДобавитьЗначение(СокрЛП(Домен),СокрЛП(ПользовательСистемы));
       Возврат;
   Иначе
       ТЗ=СоздатьОбъект("ТаблицаЗначений");
       ТЗ.НоваяКолонка("Имя");
       ТЗ.НоваяКолонка("ПолноеИмя");
       ТЗ.НоваяКолонка("Выкл");
       ДоменОбъект = ПолучитьОбъект(Шаблон("WinNT://[Домен],domain"));
       СкриптВБ=СоздатьОбъект("MSScriptControl.ScriptControl");
       СкриптВБ.language="vbscript";
       Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
       Скрипт.language="javascript";
       СкриптВБ.AddObject("Domain",ДоменОбъект);
       СкриптВБ.ExecuteStatement("Domain.Filter = Array(""User"")");
       Скрипт.AddObject("ДоменОбъект",ДоменОбъект);
       ПользователиСистемы=Скрипт.Eval("new Enumerator(ДоменОбъект)");
       Пока ПользователиСистемы.atEnd(0)=0 Цикл
           Попытка
               Если ПользователиСистемы.item(0).AccountDisabled=0 Тогда
                   ТЗ.НоваяСтрока();
                   ТЗ.Имя = ПользователиСистемы.item(0).Name;
                   ТЗ.ПолноеИмя = ПользователиСистемы.item(0).FullName;
                   ТЗ.Выкл = ПользователиСистемы.item(0).AccountDisabled;
               КонецЕсли;
           Исключение
               Сообщить(ОписаниеОшибки());
           КонецПопытки;
           ПользователиСистемы.moveNext(0);
       КонецЦикла;
       Форма.Параметр=ТЗ;
   КонецЕсли;
КонецПроцедуры    // ПриОткрытии
6 Лохматые Уши
 
29.07.08
10:54
Ок, загрузился). Не список-я.