gifts2017

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

Опубликовал Дмитрий Воробьев (vde69) в раздел Программирование - Практика программирования

Надоели просить меня запостить рабочие модули работы с 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. Андрей Скляров (coder1cv8) 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;
Исключение
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Адрес;
КонецФункции
2. Евгений Мартыненков (JohnyDeath) 15.09.09 13:46
+
еще б "ВыполнитьКоманду" на удаленном компе.
3. Дмитрий Воробьев (vde69) 15.09.09 13:52
(1) я не претендую на гениальность, просто будет ссылка куда удобно тыкать ламеров :)

а вообще у меня есть идея сделать полезный сборник и интегрировать его в конфигуратор, не знаю может и сделаю :)
AndrewVVS; DrSender; JohnyDeath; coder1cv8; +4 Ответить 2
4. Андрей Скляров (coder1cv8) 15.09.09 14:04
(2)+1
Добавил бы хоть пример с Create() процесса через WMI на удаленной машине! :)
(3) да, хороший сборник бы не помешал... А то одна фиксиновская библиотека была, на которую и смотреть-то страшно, ни то что использовать! ) Но я слышал 1С сподобилась наконец-то создать свою "библиотеку функций" в виде конфигурации...
5. Евгений Мартыненков (JohnyDeath) 15.09.09 14:16
(3) Лучше, наверное, не конфу, а какой-нить chm.
Также удаленный ребут не помешал бы, а то каждый раз ищу в торопях )
6. Трактор Трактор (Трактор) 15.09.09 14:18
(4) >> слышал 1С сподобилась наконец-то создать свою "библиотеку функций" в виде конфигурации
Называется "Библиотека стандартных подсистем и методики разработки прикладных решений " Но я её не видел.
7. Евгений Мартыненков (JohnyDeath) 15.09.09 14:19
ПолуОФФ.
А как вообще люди смотрят на PowerShell? С PowerGUI http://www.powergui.org/index.jspa (и набором скриптов и библиотек) вообще хорошо смотрится
8. Дмитрий Воробьев (vde69) 15.09.09 14:25
(5) в САБЖЕ есть удаленное убитие процесса, что практическое значение имеет такоеже :)

(4) я сборник хочу сделать на DBF-е с внешней DLL-ой которая бы внедрялась в память конфигуратора, и вызывалась по горячей клавише, кроме того я хочу туда внедрить механизм компановки общих модулей (с корректировкой всех вызовов), и еще подпись хешем всех функций и на этом основании проверку версий функций в конфигурации, и еще подпись авторами своих функций, и еще блекджет со шлюхами :)
9. Андрей Скляров (coder1cv8) 16.09.09 12:07
(7) Вещь интересная, но лично я не понимаю преимуществ перед тем же AutoIt... Ну да PowerShell работает с объектами .Net, но AutoIt зато компилируется в exe-шники!
Вот кроме этой интеграции с .Net и похвастаться то нечем! Простой доступ к WMI? Так и через COM там ничего сложного нету... К тому же любителям командной строки, можно wmic для этих целей юзать...
В общем, для себя, как человека не знакомого с Net Framework, не вижу задач в которых PowerShell лучше др. инструментов...
ЗЫ: IDE для AutoIt нет нормальной, это грустно...
10. Дмитрий Воробьев (vde69) 16.09.09 12:25
мне понравилось StarUML жаль его не прикрутить к 1с
11. Евгений Мартыненков (JohnyDeath) 17.09.09 13:01
(9) PowerShell в новых виндах стоит по умолчанию, поэтому не надо устанавливать сторонние программки. Ну и то, что PowerShell не компилирует exe - не большой минус ИМХО
12. Андрей Скляров (coder1cv8) 17.09.09 15:32
(11) У меня вот ХР SP2, нужно установить целых две программы: сам PowerShell и Net Framework...
Но вообще-то я PowerShell не ругаю, хочу заметить! Наверняка удобный инструмент для тех кто активно использует Net Framework... Ну и мелкие фишки понравились, типа вывода результата в html...
13. sound sound (sound) 21.09.09 23:21
еще туда же про искченджь (прости господи) надо функций понапихать
14. Александр Рытов (Арчибальд) 01.10.09 16:53
Попытаюсь ответить на вапрос, заданный у конкурента.
1. Выложено в выходные. Пока народ ко вторнику проснулся...
2. РАБОТАТЬ с АД мало кому нужно. А структуру знать хочется...
3. Букав поменьше бы надо...
4. Народ изголодался, пока сайт стоял.
15. Станислав Турчинский (Istur) 10.01.10 08:45
Если кого тема интересует более широко, то читайте книгу Андрея Михайлова "Системное программирование".
16. Александр Крынецкий (echo77) 10.01.10 11:35
(5) Удаленный ребут - это:
Код
ЗапуститьПриложение("shutdown /m "+ИмяМашины+" /r /t 0",,);
Показать полностью
17. Моха (Моха) 10.01.10 14:03
В тему.
Есть еще книжка Михайлова по системному программированию в 1С. Я ее мельком смотрел только. Но по ходу и туда можно тыкать :).
18. Моха (Моха) 10.01.10 14:03
(15) Блин :) , не заметил твой пост :).
19. ZERO_ 10.01.10 14:56
(16)
Ну, можно еще, убить lsass.exe 8-)
20. Лена Иванова (Тихоход) 01.10.14 17:29
Домен.Код подскажите пожалуйста как получить?