Часто встречаю вопросы касаемые программного создания и настройки прав пользователей.
В этот статье я приведу примеры для Обычного и Управляемого приложений, которые программно создают пользователя в конфигураторе и в режиме Предприятие (справочник пользователи) и установку Групп пользователей.
В приложении к статье обработки, код которых приведен ниже: Скачать обработки
Обработки были написаны под УТ, но, при необходимости, вы можете их легко доработать под другие конфигурации.
Управляемое приложение: В конфигурациях на управляемом интерфейсе (Такси) изменили подход к ведению пользователей. Если вы добавляете не программно, то добавлять нужно из режима Предприятия - тогда пользователь ИБ у вас сам создатся. И если раньше, в обычном приложении, достаточно будет добавить польз в конфигураторе - и при заходе в Предприятие, этот польз сам создавался в спр Пользователи, то с управляемым приложением такой фокус не прокатит - система не даст зайти под пользователем ИБ, которого нет в справочнике Пользователи.
! В типовых конфигурациях для работы с пользователями активно используется БСП !
В общем модуле Пользователи используется программный интерфейс процедур и функций НовоеОписаниеПользователяИБ , ПрочитатьПользователяИБ , ЗаписатьПользователяИБ иУдалитьПользователяИБ .
Код создания нового пользователя с использованием БСП:
Код 1C v 8.3 &НаСервере
Функция КопированиеВсехНастроек(ПользовательСсылка,ПользовательПриемник)
Пользователь = Обработки.НастройкиПользователей.ИмяПользователяИБ(ПользовательСсылка);
Приемники = Новый Массив;
ТаблицаПользователей = Новый ТаблицаЗначений;
ТаблицаПользователей.Колонки.Добавить("Пользователь");
ТаблицаПользователей = Обработки.НастройкиПользователей.ПользователиДляКопирования(ПользовательСсылка, ТаблицаПользователей,
ТипЗнч(ПользовательСсылка) = Тип("СправочникСсылка.ВнешниеПользователи"));
Для Каждого СтрокаТаблицы Из ТаблицаПользователей Цикл
Приемники.Добавить(ПользовательПриемник);
КонецЦикла;
КопируемыеНастройки = Новый Массив;
КопируемыеНастройки.Добавить("НастройкиОтчетов");
КопируемыеНастройки.Добавить("НастройкиВнешнегоВида");
КопируемыеНастройки.Добавить("ПерсональныеНастройки");
КопируемыеНастройки.Добавить("Избранное");
КопируемыеНастройки.Добавить("НастройкиПечати");
КопируемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки");
НастройкиСкопированы = Обработки.НастройкиПользователей.
КопированиеНастроекПользователей(ПользовательСсылка, Приемники, КопируемыеНастройки);
Возврат НастройкиСкопированы;
КонецФункции
Функция СоздатьНовыйУровеньДоступа(ФИО)
Рез = Справочники.CRM_УровниДоступа.НайтиПоНаименованию(ФИО);
Если Рез = Неопределено ИЛИ Рез = Справочники.CRM_УровниДоступа.ПустаяСсылка() Тогда
НовыйОбъект = Справочники.CRM_УровниДоступа.СоздатьЭлемент();
НовыйОбъект.Наименование = ФИО;
НовыйОбъект.Записать();
возврат НовыйОбъект.Ссылка;
КонецЕсли;
КонецФункции
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(Объект.ФИОСоздаваемогоПользователя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Наименование));
ОписаниеПользователяИБ = Пользователи.НовоеОписаниеПользователяИБ();
ПользовательИБСуществует = Ложь;
ДоступКИнформационнойБазеРазрешен = Ложь;
// Заполнение начальных значений свойств пользователяИБ.
Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора = Ложь;
Иначе
ОписаниеПользователяИБ.ПоказыватьВСпискеВыбора =
НЕ Константы.ИспользоватьВнешнихПользователей.Получить();
КонецЕсли;
ОписаниеПользователяИБ.АутентификацияСтандартная = Истина;
ОписаниеПользователяИБ.Роли = Новый Массив;
ПрочитанныеСвойства = Неопределено;
Если Пользователи.ПрочитатьПользователяИБ(
ПользовательНастроек.ИдентификаторПользователяИБ,ПрочитанныеСвойства
) Тогда
// Установка связи пользователем ИБ.
//ДоступКИнформационнойБазеРазрешен = Истина;
// Копирование свойств и ролей пользователяИБ.
ЗаполнитьЗначенияСвойств(
ОписаниеПользователяИБ,
ПрочитанныеСвойства,
"АутентификацияOpenID,
|АутентификацияСтандартная,
|ЗапрещеноИзменятьПароль,
|ПоказыватьВСпискеВыбора,
|АутентификацияОС,
|РежимЗапуска,
|Язык,
|Роли");
КонецЕсли;
ОписаниеПользователяИБ.Вставить("Действие", "Записать");
ОписаниеПользователяИБ.Вставить("Имя", Объект.ФИОСоздаваемогоПользователя);
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = Объект.ФИОСоздаваемогоПользователя;
НовыйПользователь.ТекущееПодразделение = ПользовательНастроек.ТекущееПодразделение;
НовыйПользователь.CRM_УровеньДоступа = СоздатьНовыйУровеньДоступа(Объект.ФИОСоздаваемогоПользователя);
НовыйПользователь.Недействителен = ложь;
НовыйПользователь.ДополнительныеСвойства.Вставить(
"ОписаниеПользователяИБ", ОписаниеПользователяИБ);
НовыйПользователь.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Состав.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыДоступаПользователи.Ссылка
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|ГДЕ
| ГруппыДоступаПользователи.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыДоступаПользователи.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.Пользователи.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
КопированиеВсехНастроек(ПользовательНастроек,НовыйПользователь.Ссылка);
Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьПользователя(Команда)
СоздатьПользователяНаСервере();
КонецПроцедуры
&НаСервере
Процедура СоздатьПользователяНаСервере()
Если НЕ ЗначениеЗаполнено(Объект.ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;
// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(Объект.ШаблонПользователяДляСозданияНового, Ложь);
КонецПроцедуры
&НаСервере
Процедура СкопироватьНастройкиНаСервере(ИзменяемыйПользователь,ШаблонПользователяДляКопирования)
//Копируем роли пользователя
тИзменяемыйПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ИзменяемыйПользователь.Наименование));
тШаблонПользователяДляКопирования = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ШаблонПользователяДляКопирования.Наименование));
//Очищаем роли
тИзменяемыйПользователь.Роли.Очистить();
// Копируем
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если тШаблонПользователяДляКопирования.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
тИзменяемыйПользователь.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла;
тИзменяемыйПользователь.Записать();
//Копируем настройки БСП
КопированиеВсехНастроек(ШаблонПользователяДляКопирования,ИзменяемыйПользователь);
КонецПроцедуры
&НаКлиенте
Процедура СкопироватьНастройки(Команда)
СкопироватьНастройкиНаСервере(Объект.ИзменяемыйПользователь, Объект.ШаблонПользователяДляКопирования);
КонецПроцедуры
Обычное приложение: В обычном все проще:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если НЕ ЗначениеЗаполнено(ШаблонПользователяДляСозданияНового) Тогда
Возврат;
КонецЕсли;
// настройки устанавливаются на форму
ОбновитьДанныеПользователяИБ(ШаблонПользователяДляСозданияНового, Ложь);
КонецПроцедуры
Процедура ОбновитьДанныеПользователяИБ(ПользовательНастроек, Знач ОтображатьИмя = Истина)
Если ПользовательНастроек = Неопределено Тогда
Возврат;
КонецЕсли;
ПроверкаНаСуществующегоПользователя = ПользователиИнформационнойБазы.НайтиПоИмени(ФИОСоздаваемогоПользователя);
Если ПроверкаНаСуществующегоПользователя = Неопределено Тогда
Пользователь_Шаблон = ПользователиИнформационнойБазы.НайтиПоИмени(сокрлп(ПользовательНастроек.Код));
ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя();
ПользовательИБ.Имя = ФИОСоздаваемогоПользователя;
ПользовательИБ.АутентификацияСтандартная = Истина;
ПользовательИБ.Пароль = ПарольСоздаваемогоПользователя;
ПользовательИБ.ПолноеИмя = ФИОСоздаваемогоПользователя;
ПользовательИБ.ПоказыватьВСпискеВыбора = Истина;
ПользовательИБ.ОсновнойИнтерфейс = Пользователь_Шаблон.ОсновнойИнтерфейс;
ПользовательИБ.Язык = Пользователь_Шаблон.Язык;
СписокДоступныхРолейПользователяИБ = Новый СписокЗначений;
Для Каждого мРоль Из Метаданные.Роли Цикл
СтрокаСписокаДоступныхРолей = СписокДоступныхРолейПользователяИБ.Добавить();
СтрокаСписокаДоступныхРолей.Представление = мРоль.Представление();
СтрокаСписокаДоступныхРолей.Значение = мРоль;
КонецЦикла;
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
Если Пользователь_Шаблон.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение) Тогда
ПользовательИБ.Роли.Добавить(СтрокаСпискаДоступныхРолей.Значение);
КонецЕсли;
КонецЦикла;
ПользовательИБ.Записать();
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
//НовыйПользователь.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
НовыйПользователь.Код = ФИОСоздаваемогоПользователя;
НовыйПользователь.Наименование = ФИОСоздаваемогоПользователя;
НовыйПользователь.Родитель = ПользовательНастроек.Родитель;
НовыйПользователь.Подразделение = ПользовательНастроек.Подразделение;
НовыйПользователь.Категория = ПользовательНастроек.Категория;
НовыйПользователь.Руководитель = ПользовательНастроек.Руководитель;
НовыйПользователь.Действует = ПользовательНастроек.Действует;
НовыйПользователь.Записать();
НаборПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборПользователя.Отбор.Пользователь.Установить(ПользовательНастроек);
НаборПользователя.Прочитать();
НаборНовогоПользователя = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
НаборНовогоПользователя.Отбор.Пользователь.Установить(НовыйПользователь.Ссылка);
Для Каждого СтрокаНастроек из НаборПользователя Цикл
НоваяСтрокаНастроек = НаборНовогоПользователя.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаНастроек,СтрокаНастроек);
НоваяСтрокаНастроек.Пользователь = НовыйПользователь.Ссылка;
Если Найти(СтрокаНастроек.Настройка.Наименование,"Основной ответственный") Тогда
НоваяСтрокаНастроек.Значение = НовыйПользователь.Ссылка;
КонецЕсли;
КонецЦикла;
Если НаборНовогоПользователя.Количество()>0 Тогда
НаборНовогоПользователя.Записать();
КонецЕсли;
сообщить("Создан пользователь "+ФИОСоздаваемогоПользователя);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыПользователейПользователиГруппы.Ссылка
|ИЗ
| Справочник.ГруппыПользователей.ПользователиГруппы КАК ГруппыПользователейПользователиГруппы
|ГДЕ
| ГруппыПользователейПользователиГруппы.Пользователь =Пользователь
|
|СГРУППИРОВАТЬ ПО
| ГруппыПользователейПользователиГруппы.Ссылка";
Запрос.УстановитьПараметр("Пользователь", ПользовательНастроек);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
объ = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НоваяСтрока = объ.ПользователиГруппы.Добавить();
НоваяСтрока.Пользователь = НовыйПользователь.Ссылка;
объ.Записать();
КонецЦикла;
Иначе
сообщить("Указанное ФИО Пользователя уже используется !!! ");
КонецЕсли;
КонецПроцедуры
еще пример:
Код 1C v 8.х Функция ДобавитьПользователя(ИмяПользователя, ДоменноеИмя, ПользовательАктивен, АутентификацияОС, Авторизация1СПредприятия, МассивРолей) Экспорт
// Попробуем найти сотрудника
Пользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
// Теперь попробум найти сотрудника по пользователю ос
Если Пользователь = Неопределено Тогда
Для Каждого ТекущийПользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Если ТекущийПользователь.ПользовательОС = ДоменноеИмя Тогда
Пользователь = ТекущийПользователь;
Прервать;
Конецесли;
КонецЦикла;
КонецЕсли;
//
// Если мы не нашли сотрудника, то создадим его
Если Пользователь = Неопределено Тогда
Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя();
КонецЕсли;
//
// Записываем свойства
Пользователь.АутентификацияОС = АутентификацияОС;
Пользователь.АутентификацияСтандартная = Авторизация1СПредприятия;
Пользователь.ЗапрещеноИзменятьПароль = Истина;
Пользователь.Имя = ИмяПользователя;
Пользователь.ПолноеИмя = ИмяПользователя;
Пользователь.ПоказыватьВСпискеВыбора = Ложь;
Пользователь.ПользовательОС = ДоменноеИмя;
// Сначала очистим все текущие роли
Пользователь.Роли.Очистить();
// Теперь найдем переданный массив ролей в справочнике профилей
// и добавим все роли указанные в профиле. Все очень сложно, да
МассивИменРолей = Новый Массив();
Для Каждого Роль Из МассивРолей.Role Цикл
МассивИменРолей.Добавить(Роль);
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ
| ПрофилиГруппДоступаРоли.Роль.Имя КАК Имя
|ИЗ
| Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|ГДЕ
| ПрофилиГруппДоступаРоли.Ссылка.Наименование В(&МассивИменРолей)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("МассивИменРолей", МассивИменРолей);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого Роль Из Результат Цикл
НайденнаяРоль = Метаданные.Роли.Найти(Роль.Имя);
Если НайденнаяРоль <> Неопределено Тогда
Пользователь.Роли.Добавить(НайденнаяРоль);
КонецЕсли;
КонецЦикла;
// Записываем!
Пользователь.Записать();
// Теперь посмотрим нужно ли деактивировать пользователя
Если Не ПользовательАктивен Тогда
ДективироватьПользователя(Пользователь);
КонецЕсли;
// Запишем еще и справочник пользователя
ЗаполнитьСправочникПользователя(Пользователь);
Возврат Истина;
КонецФункции
// Процедура заполняет помимо прочего справочник пользователя
Процедура ЗаполнитьСправочникПользователя(ПользовательИБ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| ИСТИНА КАК ЕстьПользователь,
| Пользователи.Ссылка КАК Пользователь
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ =ИдентификаторПользователяИБ
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЛОЖЬ,
| NULL";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
Результат = Запрос.Выполнить().Выгрузить()[0];
ОписаниеПользователя = Пользователи.НовоеОписаниеПользователяИБ();
Если Результат.ЕстьПользователь Тогда
ПользовательОбъект = Результат.Пользователь.ПолучитьОбъект();
Иначе
ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
ПользовательОбъект.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор;
ПользовательОбъект.Наименование = ПользовательИБ.Имя;
ОписаниеПользователя.Вставить("Действие", "Записать");
ПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователя);
КонецЕсли;
ЗаполнитьЗначенияСвойств(ОписаниеПользователя, ПользовательИБ);
Для Каждого Элемент Из ОписаниеПользователя Цикл
ПользовательОбъект.ДополнительныеСвойства.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
ПользовательОбъект.ДополнительныеСвойства.Удалить("Роли");
ПользовательОбъект.Записать();
КонецПроцедуры
В 1С есть возможность обратиться к принтеру по имени перед печатью, однако при работе через терминал к названию принтера добавляется (перенаправлено N), где N постоянно меняется. Решение следующее:
Код 1C v 8.2 УП
&НаКлиенте
Функция ИмяПринтераRDP(ИмяПринтера)
Shell = Новый COMОбъект("Wscript.Shell");
Task = Shell.Exec("query session");
РезультатЗапроса = Task.StdOut.ReadAll();
РезультатЗапроса = Декодер(РезультатЗапроса, "windows-1251", "cp866");
Task.Terminate();
Shell = Неопределено;
Network = Новый COMОбъект("WScript.Network");
ПользовательОС = Network.UserName();
Network = Неопределено;
НомерСеанса = RegExpGetFirstMatch("rdp-tcp\S+\s+" + ПользовательОС + "\s+(\d+)", РезультатЗапроса);
Возврат ИмяПринтера + " (перенаправлено " + НомерСеанса + ")";
КонецФункции
Функция Декодер(Стр, Вход, Выход)
Stream = Новый COMОбъект("Adodb.Stream");
Stream.Type = 2;
Stream.Mode = 3;
Stream.Charset = Вход;
Stream.Open();
Stream.WriteText(Стр);
Stream.Position = 0;
Stream.Charset = Выход;
Результат = Stream.ReadText(-1);
Stream.Close();
Возврат Результат;
КонецФункции
Функция RegExpGetFirstMatch(Маска, Строка, МногострочныйРежим = Истина, ГлобальныйПоиск = Истина, БезУчетаРегистра = Истина)
RegExp = Новый COMОбъект("VBScript.RegExp");
// Параметры
RegExp.Multiline = МногострочныйРежим;
RegExp.Global = ГлобальныйПоиск;
RegExp.IgnoreCase = БезУчетаРегистра;
RegExp.Pattern = Маска;
Matches = RegExp.Execute(Строка);
Если Matches.Count = 1 тогда
Возврат Matches.Item(0).SubMatches.Item(0);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Надоели просить меня запостить рабочие модули работы с AD, вот запостил, в качестве бонуса убийца любого процесса в памяти любого компа.
p.s. для работы нужны определенные права.
Автор:
vde69
Код 1C v 8.х Функция ПолучитьСписокДоменов () Экспорт
Результат = Новый Массив();
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);
КонецЦикла;
Исключение
Результат.Очистить();
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПользовательВГруппеДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
Массив = ПолучитьСписокПользователейВГруппеДомена (СокрЛП(ИмяДомена), ИмяГруппы);
Для каждого элМассив из Массив Цикл
Если ВРег(элМассив) = ВРег(СокрЛП(ИмяПользователя)) Тогда // пользователь уже в группе
Результат = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ДобавитьПользователяВГруппуДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка
element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Add(element_user.ADsPath); element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция УдалитьПользователяИзГруппыДомена (ИмяДомена, ИмяГруппы, ИмяПользователя) Экспорт
Результат = Ложь;
element_user = "";
element_group = "";
Попытка element_user = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяПользователя + ", user");
element_group = ПолучитьCOMОбъект("WinNT://" + ИмяДомена + "/" + ИмяГруппы + ", group");
element_group.Remove(element_user.ADsPath);
element_group.SetInfo();
Результат = Истина;
Исключение
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
Процедура ЗаполнитьПочтовыеАдресаИзAD()
Попытка
conn = ПолучитьCOMОбъект("","ADODB.Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");
Исключение Предупреждение("Ошибка подключения к Active Directory!");
Возврат;
КонецПопытки;
Для Каждого Стр из Таблица Цикл
Если НЕ ПустаяСтрока(Стр.Логин) Тогда
Попытка
query = "SEL ECT ADsPath FR OM 'LDAP://DC="+СокрЛП(Домен.Код)+"' WHERE SAMAccountName='"+Стр.Логин+"'";
rs = conn.Execute(query);
Пока НЕ rs.EOF() Цикл
obj = ПолучитьCOMОбъект(rs.Fields(0).Value);
Если obj.Class="user" Тогда
Стр.НоваяПочта=СокрЛП(obj.EmailAddress);
Если Стр.НоваяПочта<>Стр.СтараяПочта Тогда
Стр.Установить=Истина;
КонецЕсли;
КонецЕсли;
rs.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка получения почты для логина :"+Стр.Логин);
КонецПопытки;
КонецЕсли;
КонецЦикла;
conn.Close();
КонецПроцедуры
Функция УдалитьПроцесс (ИмяКомпьютера, НазваниеПроцесса, Логин, Пароль) Экспорт
Попытка COM = Новый COMОбъект ("WbemScripting.SWbemLocator");
Серв = COM.ConnectServer(СокрЛп(ИмяКомпьютера), "\root\cimv2", СокрЛП(Логин), СокрЛП(Пароль));
СписокПроцессов = Серв.execQuery("Sel ect * fr om Win32_Process Where Name = '"+СокрЛП(НазваниеПроцесса)+"'");
Для каждого item Из СписокПроцессов Цикл
item.Terminate();
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Код 1C v 8.х // coder1cv8 - Мой вариант получения почты 1С-ного пользователя:
Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес="";
ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));
Если ПользовательИБ<>Неопределено Тогда
Если ПользовательИБ.АутентификацияОС Тогда
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
LDAP=ПолучитьCOMОбъект("LDAP://CN="+ЮзерАД.FullName+",OU=Common Users,OU=Regular Users,DC="+Домен+",DC=local");
Адрес=LDAP.Mail;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции