Полезные процедуры работы с AD

17.09.09

Разработка - Универсальные функции

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

ps
для работы нужны определенные права.
Функция ПолучитьСписокДоменов () Экспорт  
	Результат = Новый Массив(); 
	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();  
		КонецЦикла; 
	Исключение  
		Возврат Ложь; 
	КонецПопытки;  
	
	Возврат Истина;
КонецФункции
		

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5403    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    46296    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6840    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57349    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    8605    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22757    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. coder1cv8 3485 15.09.09 13:44 Сейчас в теме
Ничего нового для себя не увидел :)

ЗЫ: Мой вариант получения почты 1С-ного пользователя:

Функция ПолучитьMailПоПользователю(СсылкаПользователь)
Адрес="";
ПользовательИБ=ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(СсылкаПользователь.Код));
Если ПользовательИБ<>Неопределено Тогда
Если ПользовательИБ.АутентификацияОС Тогда
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
LDAP=ПолучитьCOMОбъект("LDAP://CN="+ЮзерАД.FullName+",OU=Common Users,OU=Regular Users,DC="+Домен+",DC=local");
Адрес=LDAP.Mail;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции
3. vde69 935 15.09.09 13:52 Сейчас в теме
(1) я не претендую на гениальность, просто будет ссылка куда удобно тыкать ламеров :)

а вообще у меня есть идея сделать полезный сборник и интегрировать его в конфигуратор, не знаю может и сделаю :)
AndrewVVS; DrSender; JohnyDeath; coder1cv8; +4 Ответить
5. JohnyDeath 302 15.09.09 14:16 Сейчас в теме
(3) Лучше, наверное, не конфу, а какой-нить chm.
Также удаленный ребут не помешал бы, а то каждый раз ищу в торопях )
8. vde69 935 15.09.09 14:25 Сейчас в теме
(5) в САБЖЕ есть удаленное убитие процесса, что практическое значение имеет такоеже :)

(4) я сборник хочу сделать на DBF-е с внешней DLL-ой которая бы внедрялась в память конфигуратора, и вызывалась по горячей клавише, кроме того я хочу туда внедрить механизм компановки общих модулей (с корректировкой всех вызовов), и еще подпись хешем всех функций и на этом основании проверку версий функций в конфигурации, и еще подпись авторами своих функций, и еще блекджет со шлюхами :)
16. echo77 1935 10.01.10 11:35 Сейчас в теме
(5) Удаленный ребут - это:
Код
ЗапуститьПриложение("shutdown /m "+ИмяМашины+" /r /t 0",,);
Показать полностью
19. ZERO_ 64 10.01.10 14:56 Сейчас в теме
(16)
Ну, можно еще, убить lsass.exe 8-)
2. JohnyDeath 302 15.09.09 13:46 Сейчас в теме
+
еще б "ВыполнитьКоманду" на удаленном компе.
4. coder1cv8 3485 15.09.09 14:04 Сейчас в теме
(2)+1
Добавил бы хоть пример с Create() процесса через WMI на удаленной машине! :)
(3) да, хороший сборник бы не помешал... А то одна фиксиновская библиотека была, на которую и смотреть-то страшно, ни то что использовать! ) Но я слышал 1С сподобилась наконец-то создать свою "библиотеку функций" в виде конфигурации...
6. Трактор 1274 15.09.09 14:18 Сейчас в теме
(4) >> слышал 1С сподобилась наконец-то создать свою "библиотеку функций" в виде конфигурации
Называется "Библиотека стандартных подсистем и методики разработки прикладных решений " Но я её не видел.
7. JohnyDeath 302 15.09.09 14:19 Сейчас в теме
ПолуОФФ.
А как вообще люди смотрят на PowerShell? С PowerGUI http://www.powergui.org/index.jspa (и набором скриптов и библиотек) вообще хорошо смотрится
9. coder1cv8 3485 16.09.09 12:07 Сейчас в теме
(7) Вещь интересная, но лично я не понимаю преимуществ перед тем же AutoIt... Ну да PowerShell работает с объектами .Net, но AutoIt зато компилируется в exe-шники!
Вот кроме этой интеграции с .Net и похвастаться то нечем! Простой доступ к WMI? Так и через COM там ничего сложного нету... К тому же любителям командной строки, можно wmic для этих целей юзать...
В общем, для себя, как человека не знакомого с Net Framework, не вижу задач в которых PowerShell лучше др. инструментов...
ЗЫ: IDE для AutoIt нет нормальной, это грустно...
11. JohnyDeath 302 17.09.09 13:01 Сейчас в теме
(9) PowerShell в новых виндах стоит по умолчанию, поэтому не надо устанавливать сторонние программки. Ну и то, что PowerShell не компилирует exe - не большой минус ИМХО
12. coder1cv8 3485 17.09.09 15:32 Сейчас в теме
(11) У меня вот ХР SP2, нужно установить целых две программы: сам PowerShell и Net Framework...
Но вообще-то я PowerShell не ругаю, хочу заметить! Наверняка удобный инструмент для тех кто активно использует Net Framework... Ну и мелкие фишки понравились, типа вывода результата в html...
10. vde69 935 16.09.09 12:25 Сейчас в теме
мне понравилось StarUML жаль его не прикрутить к 1с
13. sound 538 21.09.09 23:21 Сейчас в теме
еще туда же про искченджь (прости господи) надо функций понапихать
14. Арчибальд 2709 01.10.09 16:53 Сейчас в теме
Попытаюсь ответить на вапрос, заданный у конкурента.
1. Выложено в выходные. Пока народ ко вторнику проснулся...
2. РАБОТАТЬ с АД мало кому нужно. А структуру знать хочется...
3. Букав поменьше бы надо...
4. Народ изголодался, пока сайт стоял.
15. Istur 1475 10.01.10 08:45 Сейчас в теме
Если кого тема интересует более широко, то читайте книгу Андрея Михайлова "Системное программирование".
18. Моха 10.01.10 14:03 Сейчас в теме
(15) Блин :) , не заметил твой пост :).
17. Моха 10.01.10 14:03 Сейчас в теме
В тему.
Есть еще книжка Михайлова по системному программированию в 1С. Я ее мельком смотрел только. Но по ходу и туда можно тыкать :).
20. Тихоход 01.10.14 17:29 Сейчас в теме
Домен.Код подскажите пожалуйста как получить?
21. M_Volkov 5 04.11.20 16:57 Сейчас в теме
Статья замечательная. Я 1С-ник, в AD не волоку. Но здесь не хватает функции ПолучитьСписокПользователейДомена(СокрЛП(ИмяДомена)) без групп. В 1С у пользователя в Аутентификация ОС прописано только \\ИмяДомена\ИмяПользователяОС, и запись эта может стать устаревшей. Например, имена домена или пользователя изменились. Хотелось бы это проверять при запуске пользователя.
Если не трудно, напишите функцию ПолучитьСписокПользователейДомена(СокрЛП(ИмяДомена))
22. M_Volkov 5 04.11.20 18:59 Сейчас в теме
У (1) заметил:
ПользовательОС=СтрЗаменить(ПользовательИБ.ПользовательОС,"\","/");
Попытка
ЮзерАД=ПолучитьCOMОбъект("WinNT:"+ПользовательОС+",user");
Если ЮзерАД получен, то ПользовательОС с \\ИмяДомена\ИмяПользователяОС существует, иначе (Исключение) нет.
23. mefalcon 38 06.02.25 12:20 Сейчас в теме
{ОбщийМодуль.РаботаСДоменом.Модуль(107,21)}: Переменная не определена (Таблица)
Для Каждого Стр из <<?>>Таблица Цикл (Проверка: Сервер)
{ОбщийМодуль.РаботаСДоменом.Модуль(110,56)}: Переменная не определена (Домен)
query = "SEL ECT ADsPath FR OM 'LDAP://DC="+СокрЛП(<<?>>Домен.Код)+"' WHERE SAMAccountName='"+Стр.Логин+"'"; (Проверка: Сервер)
{ОбщийМодуль.РаботаСДоменом.Модуль(103,14)}: Процедура или функция с указанным именем не определена (Предупреждение)
Исключение <<?>>Предупреждение("Ошибка подключения к Active Directory!"); (Проверка: Сервер)
Для отправки сообщения требуется регистрация/авторизация