Работа с 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 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

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

8400 7140 руб.

20.08.2024    7785    57    22    

66

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 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, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

16800 руб.

06.12.2023    8846    42    5    

73

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10434    36    25    

61

SALE! 35%

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

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3120 руб.

14.01.2013    187996    1140    0    

912

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

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

14400 руб.

29.04.2020    32674    106    152    

73

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    72792    626    45    

84

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

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

4200 руб.

10.11.2015    62820    94    59    

79

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

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

3000 руб.

21.07.2022    9835    7    4    

15
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. poyson 07.05.14 09:24 Сейчас в теме
Большое спасибо. Будем пробовать....
2. EvgeniuXP 07.05.14 23:56 Сейчас в теме
права на папки можно через командную строку установить - сам не раз так делал, только какая команда сейчас не вспомню, т.к. делал лет 5 назад...
3. ksuman 22 11.05.14 06:18 Сейчас в теме
Наш суд общественности - самый гуманный суд в мире!
Может хватит морочить людям голову задачами, не имеющими практического значения.
Все эти операции: удалить, добавить, назначить права - отлично делаются специальными инструментами администрирования.
Единственное что могло бы пригодиться, это вычисление: входит ли текущий пользователь в указанную группу AD и, получение списка доступных групп AD для назначения прав своим внутренним объектам 1С.
frying; Алексей_mir2mb; +2 2 Ответить
4. migele 162 11.05.14 12:36 Сейчас в теме
(3) ksuman,
Ну на счет практического использования это Ваше сугубо субъективное мнение.
Алгоритмы используются на вполне боевой системе провижининга. А специальными инструментами администрирования попробуйте пакетно создать 100 пользователей AD, 100 пользователей 1с в 30 различных базах и привязать их к соответствующим учеткам.
ExtraCOM; cherkass; user927056; +3 Ответить
9. Mi4man 175 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 175 27.05.14 16:41 Сейчас в теме
(10) brr, что-то я пробовал, но никак не получалось. Эх...
12. brr 184 27.05.14 16:55 Сейчас в теме
(11) Mi4man, а ГУИД именно такое имел представление? Пример: b4e1e1853a15ac4b8106db44b0051411.
13. Mi4man 175 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 952 15.05.14 12:30 Сейчас в теме
Нужно в 1С.ЗУП для физических лиц формировать сетевое имя пользователя, e-mail, а потом уже глобальная задача: создавать пользователя в AD.

Вот вопрос: я сформирую для физ лица сетевое имя - мне же нужно проверить, что такого пользователя еще нет в AD. Как это сделать?
8. Mi4man 175 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 1401 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 1314 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 1314 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 97 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.
Оставьте свое сообщение