Работа с Active Directory из 1С

30.04.14

Администрирование - Информационная безопасность

Пример работы с AD из 1С

Всем доброго времени суток.
Возникла необходимость работы с AD из 1с в частности создавать пользователей, группы безопасности и организационные единицы.
Нижеприведенный код распологается во общем модуле.
Для работы используется LDAP провайдер ADSI
Пример содержимого передаваемых и возвращаемых переменных:

  • Организационная единица: "OU=TestOU,DC=domain,DC=internal"
  • Группа безопасности: "CN=TestGroup,OU=TestOU,DC=domain,DC=internal"
  • Пользователь: "CN=TestUser,OU=TestOU,DC=domain,DC=internal"

SID пользователя и группы возвращается в виде COMSafeArray. Я его преобразовывавю в читаемый вид. Он мне нужен для установки прав на каталоги и файлы.
Все функции возвращают результат выполнения Ложь/Истина. В случае возникновения ошибки описание возвращается в переменную ОписаниеОшибки.
Надо не забывать, что пользователь, от имени которого запускается 1с (или пользователь сервера приложения если процедуры будут запускаться на сервере) должен обладать соответствующими правами для работы с AD

Привожу на суд общественности результаты:

1) Cоздание организационной единицы

Функция СоздатьОрганизационнуюЕдиницу(
	ИмяОрганизационнойЕдиницы,
	ОрганизационнаяЕдиницаВладелец,
	Описание,
	
	ГруппаДелегат = "",
	ПолноеИмяОрганизационнойЕдиницы = "", //возращается путь до созданой OU
	ОписаниеОшибки = ""
	) Экспорт
	фРезультат					= Истина;
	Попытка	
		ОрганизационнаяЕдиницаВладелецОбъект	= ПолучитьCOMОбъект("LDAP://" + ОрганизационнаяЕдиницаВладелец);
		ОрганизационнаяЕдиница			= ОрганизационнаяЕдиницаВладелецОбъект.Create("OrganizationalUnit", "OU=" + ИмяОрганизационнойЕдиницы);
		ОрганизационнаяЕдиница.description	= Описание;
		Если Не ПустаяСтрока(ГруппаДелегат) Тогда
			ОрганизационнаяЕдиница.managedBy	= ГруппаДелегат;
		КонецЕсли;
		
		ОрганизационнаяЕдиница.SetInfo();
	Исключение
		фРезультат	= Ложь;
		ОписаниеОшибки	= ОписаниеОшибки();
	КонецПопытки;
	Если фРезультат Тогда
		ПолноеИмяОрганизационнойЕдиницы	= ОрганизационнаяЕдиница.distinguishedName;
	КонецЕсли;
	
	Возврат фРезультат;
КонецФункции

2) Создание группы безопасности

Функция СоздатьГруппуБезопасности(
	ИмяГруппыБезопасности,
	ОрганизационнаяЕдиницаВладелец,
	Описание,
	
	ПолноеИмяГруппыБезопасности = "",
	SID = "",
	ОписаниеОшибки = ""
	) Экспорт
	фРезультат					= Истина;
	//ADS_GROUP_TYPE_GLOBAL_GROUP        = 2;
	//ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP  = 4;
	//ADS_GROUP_TYPE_LOCAL_GROUP         = 4;
	//ADS_GROUP_TYPE_UNIVERSAL_GROUP     = 8;
	//ADS_GROUP_TYPE_SECURITY_ENABLED    = -2147483648;
	
	Попытка	
		ОрганизационнаяЕдиницаВладелецОбъект	= ПолучитьCOMОбъект("LDAP://" + ОрганизационнаяЕдиницаВладелец);
		ГруппаБезопасности			= ОрганизационнаяЕдиницаВладелецОбъект.Create("Group", "CN=" + ИмяГруппыБезопасности);
		ГруппаБезопасности.sAMAccountName	= ИмяГруппыБезопасности;
		ГруппаБезопасности.displayName		= ИмяГруппыБезопасности;
		ГруппаБезопасности.description		= Описание;
		ГруппаБезопасности.groupType		= -2147483646;//ADS_GROUP_TYPE_GLOBAL_GROUP + ADS_GROUP_TYPE_SECURITY_ENABLED; //глобальная группа
		ГруппаБезопасности.SetInfo();
	Исключение
		фРезультат	= Ложь;
		ОписаниеОшибки	= ОписаниеОшибки();
	КонецПопытки;
	
	Если фРезультат Тогда
		SID	= ПреобразоватьSID(ГруппаБезопасности.objectSid);
		ПолноеИмяГруппыБезопасности	= ГруппаБезопасности.distinguishedName;
	КонецЕсли;
	Возврат фРезультат;
КонецФункции

3) Создание пользователя

Функция СоздатьПользователя(
	Логин,
	ПарольПользователя,
	ОрганизационнаяЕдиница,
	АдресЭлектроннойПочты,
	МенятьПарольПриВходе = Истина,
	Описание,
	
	ПутьПользователяAD = "",
	SID = "",
	ОписаниеОшибки = ""
	) Экспорт
	фРезультат					= Истина;
	Попытка	
		ОрганизационнаяЕдиницаОбъект		= ПолучитьCOMОбъект("LDAP://" + ОрганизационнаяЕдиница);
		ПользовательAD						= ОрганизационнаяЕдиницаОбъект.Create("user", "CN=" + Логин);
		ПользовательAD.sAMAccountName		= Логин;
		ПользовательAD.description			= Описание;
		ПользовательAD.userPrincipalName	= Логин + "@" + Константы.НаименованиеДомена.Получить();
		Если Не ПустаяСтрока(АдресЭлектроннойПочты) Тогда
			ПользовательAD.mail					= АдресЭлектроннойПочты;
		КонецЕсли;
		Если МенятьПарольПриВходе Тогда
			ПользовательAD.pwdLastSet		= 0;
		Иначе
			ПользовательAD.pwdLastSet		= -1;
		КонецЕсли;
		
		ПользовательAD.SetInfo();
		ПользовательAD.SetPassword(ПарольПользователя);
	Исключение
		фРезультат	= Ложь;
		ОписаниеОшибки	= ОписаниеОшибки();
	КонецПопытки;

	Если фРезультат Тогда
		SID	= ПреобразоватьSID(ПользовательAD.objectSid);
		ПутьПользователяAD	= ПользовательAD.distinguishedName;
	КонецЕсли;
	
	Если фРезультат Тогда
		ПользовательAD.AccountDisabled = Ложь;
		ПользовательAD.SetInfo();
	КонецЕсли;

	Возврат фРезультат;
КонецФункции

В константе НаименованиеДомена находится название домена типа "domain.internal".

4) Добавление пользователя в группу

Функция ДобавитьПользователяВГруппу(
	ПолноеИмяГруппыБезопасности,
	ПутьПользователяAD,

	ОписаниеОшибки = ""
	) Экспорт
	фРезультат					= Истина;
	Попытка	
		ГруппаБезопасности			= ПолучитьCOMОбъект("LDAP://" + ПолноеИмяГруппыБезопасности);
		ГруппаБезопасности.Add("LDAP://" + ПутьПользователяAD);
		ГруппаБезопасности.SetInfo();
	Исключение
		фРезультат	= Ложь;
		ОписаниеОшибки	= ОписаниеОшибки();
	КонецПопытки;
	
	Возврат фРезультат;
КонецФункции

5) Удаление пользователя из группы

Функция УдалитьПользователяИзГруппы(
	ПолноеИмяГруппыБезопасности,
	ПутьПользователяAD,
	
	ОписаниеОшибки = ""
	) Экспорт
	фРезультат					= Истина;
	Попытка	
		ГруппаБезопасности			= ПолучитьCOMОбъект("LDAP://" + ПолноеИмяГруппыБезопасности);
		ГруппаБезопасности.Remove("LDAP://" + ПутьПользователяAD);
		ГруппаБезопасности.SetInfo();
	Исключение
		фРезультат	= Ложь;
		ОписаниеОшибки	= ОписаниеОшибки();
	КонецПопытки;
	
	Возврат фРезультат;
КонецФункции

6) Переобразование SID из массива в читаемый вид типа "S-1-5-21-3784850290-2022084444-2521399107-4676"

Функция ПреобразоватьSID(objectSid)
	SID	= "S-";
	
	МассивSID	= Новый Массив;
	Для Каждого ЭлементSID Из objectSid Цикл
		МассивSID.Добавить(ЭлементSID);
	КонецЦикла;
	//SID_REVISION
	SID	= SID + Строка(МассивSID[0]) + "-";
	
	КоличествоДашей	= МассивSID[1];
	
	SECURITY_NT_AUTHORITY	= 0;
	Для Инд = 0 По 5 Цикл
		SECURITY_NT_AUTHORITY	= SECURITY_NT_AUTHORITY + МассивSID[2 + Инд] * Pow(2, (5 - Инд) * 8);
	КонецЦикла;
	SID	= SID + Строка(SECURITY_NT_AUTHORITY);
	
	Для Инд = 0 По КоличествоДашей - 1 Цикл
		SID	= SID + "-";
		Даш	= 0;
		Для ИндДаш = 0 По 3 Цикл
			Даш	= Даш + МассивSID[8 + 4 * Инд + ИндДаш] * Pow(2, (ИндДаш) * 8);
		КонецЦикла;
		SID	= SID + Строка(Даш);
	КонецЦикла;
	
	Возврат SID;	
КонецФункции

7) Ну и бонусом привожу процедуру установки прав на каталог. Права ставятся с наследованием на нижестоящие объекты. Для установки используется утилита операционки (в моём случае win 2012 в Asure). При вызове (в толстом клиенте) у 1С теряется фокус. К сожалению как установить права другим способом (например WMI) я не нашел. Планирую копать в сторону PowerShell.

Функция УстановитьПраваНаКаталог(
	ПутьККаталогу,
	SIDГруппы,
	
	Описание = "") Экспорт
	фРезультат	= Истина;
	КодВозврата	= Неопределено;
	Попытка
		ЗапуститьПриложение("icacls " + ПутьККаталогу + " /grant *" + SIDГруппы + ":(CI)(OI)F", , Истина, КодВозврата) 
	Исключение
		Описание	= ОписаниеОшибки();
		фРезультат	= Ложь;
	КонецПопытки;
	
	Если фРезультат Тогда
		Если КодВозврата <> 0 Тогда
			фРезультат	= Ложь;
			Описание	= "Код возврата: " + Строка(КодВозврата);
		КонецЕсли;
	КонецЕсли;
	
	Возврат фРезультат;
КонецФункции

Список использованных ссылок:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa772203%28v=vs.85%29.aspx

http://www.script-coding.com/Python/LDAP.html

http://blogs.msdn.com/b/oldnewthing/archive/2004/03/15/89753.aspx

http://technet.microsoft.com/ru-ru/library/cc753525%28v=ws.10%29.aspx

Незаменимой вешью оказалась утилита Марка Руссиновича

Active Directory Explorer (AD Explorer)

AD Active Directory ADSI LDAP icacls

См. также

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 7140 руб.

20.08.2024    32651    199    104    

188

Инструменты администратора БД Инструментарий разработчика Роли и права Программист 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    15548    66    33    

84

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 17.06.2025, версия 1.3

19200 руб.

06.12.2023    14269    61    8    

90

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    37371    115    152    

82

Инструменты администратора БД Системный администратор 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием Платные (руб)

Конфигурация Комплексная автоматизация 1.1 (и УПП 1.3 тоже) хранит файлы и изображения в справочнике Хранилище дополнительной информации в реквизите Хранилище типа ХранилищеЗначений. Та же история с ВложениямиЭлектроннойПочты. Но при этом присоединенные файлы в Электронном документообороте хранит в томах на диске. Эта доработка позволяет использовать стандартный механизм хранения файлов, изображений и вложений электронных писем в томах на диске. При этом можно разделить тома хранения по объектам конфигурации.

4200 руб.

10.11.2015    63948    99    59    

82

Инструменты администратора БД Пользователь 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    11145    14    4    

22

Администрирование Инструменты администратора БД Удаленное управление Системный администратор 1С v8.3 1С:Зарплата и Управление Персоналом 3.x Платные (руб)

Расширение разработано для автоматизации интеграции «1С:Зарплата и управление персоналом (редакция 3.1)» с сервисом Яндекс 360 через платформу «n8n». Расширение позволяет автоматически создавать учетные записи Яндекс для новых сотрудников, обновлять данные существующих сотрудников и блокировать учетные записи уволенных сотрудников. Обмен данными осуществляется через API Яндекс 360 с использованием промежуточного сервера платформы n8n, что обеспечивает гибкость, масштабируемость и упрощение интеграционных процессов.

3600 руб.

03.04.2025    847    2    0    

2
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. poyson 07.05.14 09:24 Сейчас в теме
Большое спасибо. Будем пробовать....
2. EvgeniuXP 07.05.14 23:56 Сейчас в теме
права на папки можно через командную строку установить - сам не раз так делал, только какая команда сейчас не вспомню, т.к. делал лет 5 назад...
3. ksuman 24 11.05.14 06:18 Сейчас в теме
Наш суд общественности - самый гуманный суд в мире!
Может хватит морочить людям голову задачами, не имеющими практического значения.
Все эти операции: удалить, добавить, назначить права - отлично делаются специальными инструментами администрирования.
Единственное что могло бы пригодиться, это вычисление: входит ли текущий пользователь в указанную группу AD и, получение списка доступных групп AD для назначения прав своим внутренним объектам 1С.
user733468; frying; Алексей_mir2mb; +3 2 Ответить
4. migele 161 11.05.14 12:36 Сейчас в теме
(3) ksuman,
Ну на счет практического использования это Ваше сугубо субъективное мнение.
Алгоритмы используются на вполне боевой системе провижининга. А специальными инструментами администрирования попробуйте пакетно создать 100 пользователей AD, 100 пользователей 1с в 30 различных базах и привязать их к соответствующим учеткам.
Eillecho; ExtraCOM; cherkass; user927056; +4 Ответить
9. Mi4man 176 27.05.14 14:35 Сейчас в теме
(4) есть ли у Вас реализация поиска по ГУИДу в запросе?
10. brr 184 27.05.14 16:27 Сейчас в теме
(9) Mi4man, SELECT ADsPath FROM 'LDAP://10.0.0.254' WHERE objectGUID='\b4\e1\e1\85\3a\15\ac\4b\81\06\db\44\b0\05\14\11­'
Vasvas05; +1 Ответить
11. Mi4man 176 27.05.14 16:41 Сейчас в теме
(10) brr, что-то я пробовал, но никак не получалось. Эх...
12. brr 184 27.05.14 16:55 Сейчас в теме
(11) Mi4man, а ГУИД именно такое имел представление? Пример: b4e1e1853a15ac4b8106db44b0051411.
13. Mi4man 176 27.05.14 18:25 Сейчас в теме
(12) brr, нет, вот такое: \b4\e1\e1\85\3a\15\ac\4b\81\06\db\44\b0\05\14\11 (строка).

А надо было просто b4e1e1853a15ac4b8106db44b0051411 ?
16. brr 184 28.05.14 11:33 Сейчас в теме
(13) Mi4man, нет, просто я не понял какое представление ГУИД вы использовали
6. Gulf_Stream 12.05.14 19:56 Сейчас в теме
(3) ksuman, немного не согласен, вы видимо не администрировали АД с хотя бы 1000 пользователей. На основании этого кода очень удобно выполнять массовые действия над учетными записями. Тоже накатал под свои нужды конфу для работы с LDAP но выложить на общее обозрение не рискну ибо код там уж больно неряшлив :(
Master_Koda; +1 Ответить
39. Master_Koda 24.09.20 12:57 Сейчас в теме
(6)Добрый день. Как Вы обошли ограничение LDAP в 1000 пользователей? Кодом запроса или как пирведено в этой статье https://www.osp.ru/winitpro/2004/05/177043?
33. Neverpoint 29.10.17 05:52 Сейчас в теме
(3) Вы далеки от реального управления бизнесом. В частности у нас в 1С создают новых клиентов, карточки и они автоматом прописываются в AD который как LDAP раздает в FreePBX и еще ряд специальных услуг для клиентов пароли и юзернеймы. Вы не понимаете о чем речь
Алексей_mir2mb; +1 Ответить
5. stanru1 91 12.05.14 16:44 Сейчас в теме
Спасибо за потраченное время! Я тоже проводил похожие исследования для импорта пользователей из AD, но с созданием так и не хватило терпения разобраться :) Обязательно в будущем воспользуюсь идеями!
7. user_2010 1002 15.05.14 12:30 Сейчас в теме
Нужно в 1С.ЗУП для физических лиц формировать сетевое имя пользователя, e-mail, а потом уже глобальная задача: создавать пользователя в AD.

Вот вопрос: я сформирую для физ лица сетевое имя - мне же нужно проверить, что такого пользователя еще нет в AD. Как это сделать?
8. Mi4man 176 27.05.14 14:29 Сейчас в теме
(7) user_2010, для этого необходимо выполнить запрос

ТекстЗапроса = "SELECT ADsPath FROM 'LDAP://"+Домен+"' WHERE objectClass='User' AND userPrincipalName='"+ДоменноеИмя+"'";


Если результат пустой, то соответственно в базе нет такого юзера.
user811769; +1 Ответить
14. KroVladS 35 28.05.14 09:47 Сейчас в теме
гдеб найти примеры работы с openLDAP из под Linux?
15. harmer 1 28.05.14 09:54 Сейчас в теме
Спасибо.
Небольшое замечание: SID формируется с символами НПП.
SID    = SID + Строка(Даш);
17. It-developer 26 27.02.15 19:34 Сейчас в теме
Не получается создать пользователя. Пишет "Ошибка получения объекта COM: Сервер возвратил ссылку". Что может быть?
Вроде все по схеме
element_group = ПолучитьCOMОбъект("LDAP://OU=Папка 2,OU=Пользователи домена,OU=sim,DC=dc,DC=my_company,DC=com)");
18. jake_qwert 24 23.03.15 10:52 Сейчас в теме
А каким кодом можно изменить организационную единицу (OrganizationalUnit) у существующего пользователя? Т.е. мне нужно перенести в другую папку пользователя. Пробывал изменить distinguishedName, выдает ошибку.
19. jake_qwert 24 23.03.15 12:09 Сейчас в теме
Разобрался сам, вот так, если кому-то интересно (первая строка куда перемещаем, вторая откуда)
set cont = GetObject("LDAP://dc=dom,dc=com")
set newobj = cont.MoveHere("LDAP://cn=jeffsmith,ou=sales,dc=dom,dc=com", "cn=jeffsmith")
Danila-Master; +1 Ответить
20. i_rebel 8 10.01.16 08:37 Сейчас в теме
Как получить список групп пользователя из AD ? хочу открывать пользователя AD и видеть его группы AD? ; нужно видеть все группы и те которые присвоены данному пользователю
21. Armando 1402 11.01.16 00:33 Сейчас в теме
(20) i_rebel, код на vbs для получения своих групп:
Set objADSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objADSysInfo.UserName)
For Each objGroup in objUser.memberOf
    NameGroup = GetObject("LDAP://" & objGroup).cn
Next
23. i_rebel 8 20.01.16 12:30 Сейчас в теме
(21) Armando, мне нужно все группы, чтобы потом мог сделать интерактивно добавление или удаление из группы
22. imbaZeratul 16 15.01.16 07:31 Сейчас в теме
каким кодом можно считать данные пользователя, допустим описание, телефон и так далее
24. jake_qwert 24 10.02.16 12:50 Сейчас в теме
Все получилось всем спасибо.
25. Danila-Master 118 02.06.16 14:25 Сейчас в теме
Весь инет перерыл, так и не смог найти нормального примера/описания как переименовать пользователя в AD.
Задача такая:
В 1С сотрудник сменил ФИО, зная ее доменное имя, как поменять на новое ФИО в самом AD?
26. blackhole321 1304 02.06.16 16:25 Сейчас в теме
27. Danila-Master 118 30.06.16 11:15 Сейчас в теме
Помогите разобтаться. Почему-то не хочет работать powershell.

В 1С делаю ЗапуститьПриложение("powershell.exe -Command {Set-ADUser -Identity ""1ctest"" -Surname ""Иванов"" -GivenName ""Иван""}");
Имя учетни не меняется.
В cmd.exe пишу строку: powershell.exe -Command {Set-ADUser -Identity "1ctest" -Surname "Иванов" -GivenName "Иван"}
Так же, имя учетки не меняется.
Но если в самой консоле PowerShell'а написать строку: Set-ADUser -Identity "1ctest" -Surname "Иванов" -GivenName "Иван"
То все ништяк, Имя в учетке поменялось.

1С, cmd и консоль PowerShell запущенны от именю учетки, у которой есть права на изменение данных в домене. Так что этот момент стразу отсекаю.
28. blackhole321 1304 30.06.16 12:38 Сейчас в теме
(27) Danila-Master, в 1С код выполняется на том же компьютере, где Вы открывали консоль PowerShell? (М.б. Вы открывали консоль на своей клиентской машине, а ЗапуститьПриложение выполняли на сервере)
29. Danila-Master 118 01.07.16 06:39 Сейчас в теме
(28) blackhole321,
(М.б. Вы открывали консоль на своей клиентской машине, а ЗапуститьПриложение выполняли на сервере)

Так оно и есть и будет. Но запуск происходит от одной и той же учетки, что на моем компе, что на сервере.
Но перед тем как писать в 1С, мне нужно из командной строки добится результата. Поэтому пока делаю все на своем компе.

Столкнулся с интересной ситуацией:
В cmd пишу powrshell.exe, проваливаюсь в сам сонсоль PS.
Далее в PS пишу: Get-ADUser -Identity "1ctest"
Выдает ошибку, что команда Get-ADUser не найдена.
Как оказалось нужно подключить модуль для работы с AD.
> Import-Module ActiveDirectory
> Get-ADUser -Identity "1ctest"
о чудо, Get-ADUser выдал результат. но при этом, даже после подключения модуля, команда Set-ADUser -Identity "1ctest" -Surname "Иванов" -GivenName "Иван"
так и выполнилась. И ошибок нет.
30. Danila-Master 118 01.07.16 11:11 Сейчас в теме
В общем разобрался я :)
1. Нужно поставить PowerShell версии 4.0 (по-умолчанию у windows 7 и 2008 R2 стоит версия 2.0)
В версии 4.0 не нужно импортировать разные модули, shell сама все делает.
2. Рабочая команда в cmd: powershell.exe Set-ADUser -Identity '1ctest' -Surname 'Иванов' -GivenName 'Иван' -DisplayName 'Иванов Иван'
где
Identity - параметр поиска (в данном случае доменное имя пользователя)
Surname - Фамилия
GivenName - Имя
DisplayName - Отображаемое имя
31. Danila-Master 118 15.07.16 08:41 Сейчас в теме
Все, разобралися.
Вдруг кому пригодится, вот рабочий код:
ТекстКоманды = "powershell.exe -command ""$user = Get-ADUser -Identity '" + ДоменноеИмя + "'";
ТекстКоманды = ТекстКоманды + " ; Set-ADUser -Identity $user -Surname '" + ТРег(ФамилияEn) + "' -GivenName '" + ТРег(ИмяEn) + "' -DisplayName '" + ПолноеИмя + "'";
ТекстКоманды = ТекстКоманды + " ; Rename-ADObject -Identity $user -NewName '" + ПолноеИмя + "'""";
			
ЗапуститьПриложение(ТекстКоманды);
user859113; user811769; +2 Ответить
32. user695952_stepanyan 10.03.17 11:02 Сейчас в теме
Какой командой можно добавить роль в список ролей MemberOf ? И как получить ссылку на саму группу?
34. burstmashine 22.11.18 11:17 Сейчас в теме
Подскажите: Документ, в нет по параметром выходит список (на картинке. студент , создается пользователь в домене и пароль ). Код брал отсюда для создания пользователе. Как сделать так , чтобы при создании пользователя он проверял и выдавал предупреждение(ошибку или не создовал такого пользака) есть ли уже такой пользователь(так как студент может учится в двух разнух факультетах например.)
Прикрепленные файлы:
35. Danila-Master 118 22.11.18 14:57 Сейчас в теме
Можно так проверить:

objConnection = Новый COMОбъект("ADODB.Connection");
objConnection.Provider = "ADSDSOObject";
objConnection.Open("Active Directory Provider");
Домен1 = "dm";
Домен2 = "bc";
ДоменноеИмя = "Ivanov_Ivan";

query = "<LDAP://DC=" + Домен1 + ",DC=" + Домен2 + ">;(&(objectCategory=person)(objectClass=user)(sAMAccountName=" + ДоменноеИмя + "));name,AdsPath,sAMAccountName,mail,pwdLastSet; SubTree";

objRS = objConnection.Execute(query);

Если Не rs.EOF Тогда
	Сообщить("Пользователь существует");
КонецЕсли;

conn.Close();
Показать
36. burstmashine 26.12.18 14:54 Сейчас в теме
Ещё раз сдравствуйте, а как добавить пользователей в группу, по пункту 4 не получается .Все пользователи в группе Учащиеся, в ней группа Студенты с подпиской. я пробывал и так и сяк, что не так делаю?)
Прикрепленные файлы:
37. triviumfan 102 12.03.19 17:36 Сейчас в теме
Может вы в курсе почему стандартный метод ПользователиОС() возвращает массив структур доменов с ограничением массива пользователей в 100 элементов?
127.0.0.0; +1 Ответить
38. Vasvas05 27 02.07.19 18:26 Сейчас в теме
(0) Для автора, преобразование objectGUID в строку, может кому пригодиться
//https://support.microsoft.com/en-us/help/325649/how-to-retrieve-the-guid-of-an-object-from-the-active-directory

МассивГУИД = ПреобразоватьВМассивГУИДНаСервере(ПользовательAD.objectGUID);
        
СтрокаGUID  = СтрСоединить(МассивГУИД,"");
СтрокаGUID = ConvertHexStringGUIDToStringGUID(СтрокаGUID);

Функция ConvertHexStringGUIDToStringGUID(strOctet = "")
    
    tmpGUID = "";
    GUIDStr = "";
    
    GUIDStr = Mid(strOctet, 7, 2);
    GUIDStr = GUIDStr + Mid(strOctet,  5, 2);
    GUIDStr = GUIDStr + Mid(strOctet,  3, 2);
    GUIDStr = GUIDStr + Mid(strOctet,  1, 2);
    GUIDStr = GUIDStr + Mid(strOctet, 11, 2);
    GUIDStr = GUIDStr + Mid(strOctet,  9, 2);
    GUIDStr = GUIDStr + Mid(strOctet, 15, 2);
    GUIDStr = GUIDStr + Mid(strOctet, 13, 2);
    GUIDStr = GUIDStr + Mid(strOctet, 17, СтрДлина(strOctet));
    
     tmpGUID = "{" + Mid(GUIDStr,  1,  8) + "-" + Mid(GUIDStr,  9, 4) 
              + "-" + Mid(GUIDStr, 13,  4) + "-" + Mid(GUIDStr, 17, 4) 
              + "-" + Mid(GUIDStr, 21, 15) + "}";
              
     Возврат tmpGUID;        
КонецФункции
Показать



Функция ПреобразоватьВМассивГУИДНаСервере(objectGUID)
    
    МассивGUID    = Новый Массив;
    Для Каждого ЭлементGUID Из objectGUID Цикл
        МассивGUID.Добавить(DecToAny(ЭлементGUID,16));
    КонецЦикла;
    
    Возврат  МассивGUID;
КонецФункции

Показать



Функция DecToAny(Знач тЗначение, Знач тОснование)
   тРезультат = "";
 
   Пока тЗначение > 0 Цикл
      тРезультат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", тЗначение%тОснование + 1, 1) + тРезультат;
      тЗначение = Цел(тЗначение/тОснование) ;
   КонецЦикла;
 
   Возврат тРезультат;
КонецФункции

Показать
maksa2005; Antonio; user811769; +3 Ответить
40. yaskobar 10.02.21 11:07 Сейчас в теме
Добрый день, Михаил. Есть задача по интеграции 1С и AD. Как с Вами можно связаться?
41. Danila-Master 118 25.06.21 11:35 Сейчас в теме
Есть задача программно из 1С удалить ПК в домене.

Что сейчас сделано:
conn = Новый COMОбъект("ADODB.Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");

query = "<LDAP://DC=hq,DC=bc>;(&(objectClass=computer)(Name=" + ИмяПК + "));name,AdsPath,CN; SubTree";
rs = conn.Execute(query);

Если Не rs.EOF Тогда
	АдресПК = rs.Fields("AdsPath").value;
	Попытка
		ОбъектАД = ПолучитьCOMОбъект(АдресПК);
		ОбъектАД.Delete("computer", ОбъектАД.Name);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;	
КонецЕсли;

conn.Close();
Показать

Выпадает в исключение. В описании ошибки сказано, что в данном классе такой ПК не найден.
Не могу понять, то ли в коде ошибка, то ли еще где-то.
Может кто сталкивался, подскажите как сделать.
42. Danila-Master 118 29.06.21 09:15 Сейчас в теме
(41) отвечу сам себе ) может кому-то пригодится

conn = Новый COMОбъект("ADODB.Connection");
conn.Provider = "ADSDSOObject";
conn.Open("Active Directory Provider");

query = "<LDAP://DC=hq,DC=bc>;(&(objectClass=computer)(Name=" + ИмяПК + "));name,AdsPath,CN; SubTree";
rs = conn.Execute(query);

Если Не rs.EOF Тогда
	АдресПК = rs.Fields("AdsPath").value;
	Попытка
		ОбъектАД = ПолучитьCOMОбъект(АдресПК);
		ОбъектАД.DeleteObject(0);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецЕсли;
Показать
43. aibasoft 11 28.04.22 09:03 Сейчас в теме
Есть один момент в коде. Параметр pwdLastSet не записывается в AD если не поставить его после ПользовательAD.SetInfo();
44. Gaffer 85 18.04.24 00:11 Сейчас в теме
Было бы круто еще сделать генерацию и авто-обновление подписи в Outlook.
Оставьте свое сообщение