Имя: Пароль:
1C
1С v8
не получается интеграция с Activ Directory
,
0 TieXe
 
29.12.11
18:28
У меня вот такая проблема с кодом с помощью которого я хочу переносить физ.лиц с 1С в  Activ Directory


Вот код:
==================================================­=======

Функция Получить_COMОбъект(Путь="")
Скрипт=Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Возврат Скрипт.Eval("GetObject('"+Путь+"')");
КонецФункции // Получить_COMОбъект(Путь="")




Процедура ПриНачалеРаботыСистемы()


 
Пользователь="Администратор";
Пароль="123456";
ДСО=Получить_COMОбъект("LDAP:");
ОУ=ДСО.OpenDSObject("LDAP://crm4/ OU=Администраторы, dc=crm, dc=com", Пользователь, Пароль,1);
Пользователь = ОУ.Create("User", "cn=test1c");
Пользователь.Put("sAMAccountName", "test1c");
Пользователь.SetInfo();
Предупреждение("Интеграция c Active Directory прошла успешно");



КонецПроцедуры

==================================================­
//полный адрес моего учебного сервера crm4.crm.com


При запуске 1С предприятия выдает ошибку:
####################################################################
{МодульПриложения(92)}: Ошибка при вызове метода контекста (OpenDSObject): Произошла исключительная ситуация (0x8007052e)
ОУ=ДСО.OpenDSObject("LDAP://crm4/ OU=Администраторы, dc=crm, dc=com", Пользователь, Пароль,1);
по причине:
Произошла исключительная ситуация (0x8007052e)
####################################################################

Подскажите пожалуйста как исправить?
И если можно предоставьте полный код с комментариями, так как я не программист 1С
1 vde69
 
29.12.11
18:31
LDAP - очень капризный провайдер, ему нужны права, при отсутсвие прав совершенно не понятно чего происходит... (то пустую выборку вернет, то ошибку непонятную)

я пользуюсь WINNT провайдером, он хоть и старенький но куда понятнее, поиском поищи я постил процеруры работы
2 szhukov
 
29.12.11
18:33
(1)+1
С правами проблема точно всегда, если конечно не от админа домена исполняется :)
Долго разбираться не стал, когда надо было, запрос почему-то работал без проблем на сервере, но не хотел выдавать данные если запускался с локальной машины. Поскольку операция была одноразовая, то просто выполнил на сервере.
3 TieXe
 
30.12.11
15:08
Изменил LDAP на  WINNT

ДСО=Получить_COMОбъект("WINNT:");
ОУ=ДСО.OpenDSObject("WINNT://crm4/ OU=Администраторы, dc=crm, dc=com", Пользователь, Пароль,1);

Теперь такая ошибка:

{МодульПриложения(72)}: Ошибка при вызове метода контекста (Eval): Произошла исключительная ситуация (0x80004005)
Возврат Скрипт.Eval("GetObject('"+Путь+"')");
по причине:
Произошла исключительная ситуация (0x80004005)
4 vmv
 
30.12.11
15:31
ладно поделюсь кусочком функционала - весь не дам, жаден да и сам доходил

//
// ADODB_Connection.Properties:
//
// "Password"            ,
// "User ID"             ,
// "Encrypt Password"     ,
// "Integrated Security" ,
// "Data Source"         ,
// "Location"            ,
// "Extended Properties" ,
// "Connect Timeout"     ,
// "Prompt"    Строка       ,
// "Window Handle"       ,
// "Mode"                ,
// "Bind Flags"          ,    
// "ADSI Flag"           ,    
//
// Получить свойства ADODB_Connection.Properties можно так
//
// Для каждого item Из ADODB_Connection.Properties Цикл  
//   мItemNameProperties.Добавить(item.Name);  
// КонецЦикла;
//
// Замечание:
// На форме авторизации есть страница "СтраницаДоступ" где можно указать доменные логин/пароль по которым возможно соединение по LDAP к AD.
// Эта страница доступна только для пользователя с полными правами, при модификации логина/пароля этого пользователя - модифицированные данные
// запишутся в константы LDAP_Disable_Anonymous, SuperUser, SuperUserPWD.
//
Функция ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter) Экспорт

   // Настройка соединения  <ADODB.Connection>
   ADODB_Connection = Новый COMОбъект("ADODB.Connection");
   ADODB_Connection.Provider = "ADsDSOObject";
   Если LDAP_Disable_Anonymous Тогда
       ADS_SECURE_AUTHENTICATION = 1;                                            // Позволяет читать данные, когда не разрешен анонимный доступ
       ADODB_Connection.Properties("User ID"  ).Value = AD_Domain_DC+"\"+Константы.SuperUser.Получить();
       ADODB_Connection.Properties("Password" ).Value = Константы.SuperUserPWD.Получить();
       ADODB_Connection.Properties("ADSI Flag").Value = ADS_SECURE_AUTHENTICATION;
   Иначе
       ; // Ничего не делаем, т.к. провайдер LDAP при анонимном доступе не требует логин/пароль по которым возможно соединение по LDAP
   КонецЕсли;
   ADODB_Connection.Open("Active Directory Provider");
   
   // Наcтройка свойств <ADODB.Command>
   // ADS_SCOPE_SUBTREE = 2
   ADODB_Command    = Новый COMОбъект("ADODB.Command");
   ADODB_Command.ActiveConnection =ADODB_Connection;
   ADODB_Command.Properties("Page Size").Value     = 1000;
   ADODB_Command.Properties("Timeout").Value       = 30;
   ADODB_Command.Properties("Cache Results").Value = Ложь;
   //ADODB_Command.Properties("Searchscope") = ADS_SCOPE_SUBTREE;
   
   // Инициализация строки атрибутов для передачи в запрос по AD
   Count_Attributes = AD_Array_Name_Attributes.Количество(); String_Attributes = "";
   Для Инд = 0 По AD_Array_Name_Attributes.ВГраница() Цикл
       String_Attributes = String_Attributes + AD_Array_Name_Attributes[Инд] + ?(Инд + 1 = Count_Attributes, "", ",");
   КонецЦикла;
   
   // Формирование текста запроса ADODB_Command
   CommandText = "<LDAP://" +LDAP_StartingPoint+ ">;" +LDAP_Filter+ ";" +String_Attributes+ ";subtree";    
   
   // Выполнение запроса ADODB_Command
   ADODB_Command.CommandText = CommandText;
   Попытка
       Selection_ADODB = ADODB_Command.Execute();
   Исключение
       Предупреждение(ОписаниеОшибки() + Символы.ПС + " Администратору приложения необходимо установить параметры доступа по LDAP", 120);
       Возврат Новый ТаблицаЗначений;
   КонецПопытки;
   
   // Создание колонок таблицы в которую будут помещены результаты запроса
   Тз = Новый ТаблицаЗначений;
   Для Каждого ЭлементМассива Из AD_Array_Name_Attributes Цикл
       Тз.Колонки.Добавить(ЭлементМассива);
   КонецЦикла;

   // Заполнение таблицы по результатам запроса
   Пока Не Selection_ADODB.EOF Цикл
       НоваяСтрока = Тз.Добавить();
       Для Каждого ЭлементМассива Из AD_Array_Name_Attributes Цикл
           НоваяСтрока[ЭлементМассива] = Selection_ADODB.Fields(ЭлементМассива).Value;
       КонецЦикла;
       Selection_ADODB.MoveNext();
   КонецЦикла;
   
   // Закрытие соединений
   Selection_ADODB.Close();
   ADODB_Connection.Close();
   
   Возврат Тз;
   
КонецФункции
5 vmv
 
30.12.11
15:32
(3) WINNT устаревший провайдер, увы. его лучше уже не юзать
6 vde69
 
30.12.11
15:56
Функция ПолучитьСписокДоменов () Экспорт  
   Результат = Новый Массив();
   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();  
       КонецЦикла;
   Исключение  
       Возврат Ложь;
   КонецПопытки;  
   
   Возврат Истина;
КонецФункции
7 TieXe
 
30.12.11
15:59
Ребята, а можете дать готовый код который будет достаточно просто скопировать, заменив в нем лишь имя сервера и может еще пару параметров?

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

Потому что я в программировании 1С вообще не разбираюсь, пол дня искал куда вообще в 1с код вписывают=)
8 vde69
 
30.12.11
16:04
(7) дали аж 2 готовый кода,

как мне кажется у тебя проблеммы в том что ты пытаешся запустить этот код на сервере, а там нужно с правами COM для 1с колупатся
9 vmv
 
30.12.11
16:11
(7) в 5 тебе нужно только правильно передать параметры в метод, да константы заменить на значения и всю, выгребаещь в тз все что нужно.

это может быть не только юзер, но и юнит ад, группа ад.
просто нужно включить мозг и понимать логику ад)

вот уже почти готовый вызов, объяснгять дальше бесполезно, тут толшько правильно затулить свои данные. в примере все липовые

//
// Комментарии в методе приведены для примера, когда у нас ADUnits.Количество()=2, где: ADUnits[0]="1C" и ADUnits[0]="NA",
// имя выбранного домена "consalt.ru" и имя(доменный логин) пользователя "Test1C" .
// Первый юнит  - это корень AD для приложений 1С соответствующего домена;
// Воторой юнит - это ветка в первом юните относительно приложения "NA" (Необоротные активы);
//
// Отметим, что пользователи могут зайти в приложение оносительно любого домена, но при выполнении следующих условий...
// 1. В выбранном домене пользователь существует и подтвердил свой пароль;
// 2. В выбранном домене есть юниты 1C>>NA>> и >> "Группы входимости"
// 3. Пользователь член хотя бы одной из этих групп;
// 4. Для хотя бы одной из найденных для пользователя групп AD в юнитах 1C>>NA>> сопоставлена Роль1С.
//
// Комментарии в теле метода даны оносительно данных представленого тут примера.
//
Функция ПолучитьДанныеПользователя_AD_In_LDAP(Логин)
   
   // Получим булево значение: сервер LDAP запрещает анонимный доступ
   LDAP_Disable_Anonymous = Константы.LDAP_Disable_Anonymous.Получить();
   
   // Получим имена выбранного пользователем домена и логина(в форме они могут быть набраны как \\CONSALT, CONSALT.RU, \\CONSALT\TEST1C).
   AD_Domain_DC                = AD_Параметры.Получить("AD_Domain_DC");                // "CONSALT"
   AD_Domain_distinguishedName = AD_Параметры.Получить("AD_Domain_distinguishedName"); // "DC=consalt,DC=ru"
   AD_User_sAMAccountName      = AD_Client.Получить_AD_User_sAMAccountName(Логин);     // "TEST1C"
   
   // Получим массив имен атрибутов доменного пользователя, значения которых необходимо получить.
   AD_Array_Name_Attributes = Новый Массив;                
   AD_Array_Name_Attributes.Добавить("distinguishedName");  // Отличительное (характерное) имя пользователя, например, "CN=Иван И. Иванов,OU=Служба АСУ,OU=УТСиАСУ,DC=consalt,DC=ru"
   AD_Array_Name_Attributes.Добавить("cn");                 // Наименование доменного пользователя, как он "видит" себя в ОС.
   
   // Получим LDAP_StartingPoint провайдера LDAP.
   LDAP_StartingPoint = AD_Domain_distinguishedName;
   
   // Получим фильтр для позиционирования на запись пользователя в AD по выбранному логину.
   LDAP_Filter = "(&(objectCategory=person)(objectClass=user)(sAMAccountName="+AD_User_sAMAccountName+"))";  // objectCategory и objectClass ускорят чтение
   
   // Получим данные из AD
   ТзДанныеАД = AD_Client.ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter);
   Если ТзДанныеАД.Количество() = 0 Тогда
       AD_Параметры.Вставить("УспешнаяАвторизация", Ложь);
       Возврат Ложь;
   КонецЕсли;
   
   // Вставим полученные данные в соответствие как строковые параметры, которое "видит" ЭтаФорма и методы глобальных модулей на "Клиенте/Сервере".  
   AD_User_distinguishedName = ТзДанныеАД[0].distinguishedName;
   AD_Параметры.Вставить("AD_User_distinguishedName", AD_User_distinguishedName);
   AD_Параметры.Вставить("AD_User_Сn"               , ТзДанныеАД[0].cn);  
   AD_Параметры.Вставить("ИмяПользователяИБ"        , AD_Domain_DC+"\"+AD_User_sAMAccountName);
   
   // Получим массив имен атрибутов групп, значения которых необходимо получить из прочитанных групп AD.
   AD_Array_Name_Attributes = Новый Массив;
   AD_Array_Name_Attributes.Добавить("cn");
   
   // Получим характерное имя сокращенной формы строки связывания провайдера LDAP для чтения групп входимости доменного пользователя.
   LDAP_StartingPoint = AD_Client.ПолучитьADUnits(Истина, Истина)+ "," + LDAP_StartingPoint;  // "OU=NA,OU=1C,DC=consalt,DC=ru"
   
   // Получим фильтр для позиционирования на группы пользователя в иерархии LDAP_StartingPoint  
   LDAP_Filter = "(&(objectCategory=group)(member="+AD_User_distinguishedName+"))";
   
   // Получим данные из AD
   ТзДанныеАД = AD_Client.ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter);
   
   // Вставим полученные данные в соответствие как ТаблицуЗначений.
   // В дальнейшем эти параметры с клиента передаются на сервер для модификации прав/ролей ПользователяИБ. При передаче на сервер нужно удалять мутабельные параметры.
   // Таким образом, значение по ключу "AD_User_Groups" нужно выделять в отдельный массив примитивных типов и удалять как элемент соответствия из AD_Параметры.
   // Но тут(на клиенте) мы получаем его в таблицу значений, т.к. теоретически мы может читать из AD какие угодно атрибуты, добавив элементы в AD_Array_Name_Attributes.
   AD_Параметры.Вставить("AD_User_Groups", ТзДанныеАД);
   
   Возврат Истина;   // Возврат необходим для проверки SuperUser в случае запрета анонимного доступа.
   
КонецФункции
10 vmv
 
30.12.11
16:13
+(7) и этот код весьма далек от программирования в 1С.

в ЛДАП формат фильтров по методу "польская запись", если вам это мало о чем говорит, тогда тяжко будет понять)
11 TieXe
 
30.12.11
16:27
Выдает ошибку:


МодульПриложения(99,26)}: Переменная не определена (AD_Client)
   LDAP_StartingPoint = <<?>>AD_Client.ПолучитьADUnits(Истина, Истина)+ "," + LDAP_StartingPoint;  // "OU=NA,OU=1C,DC=crm,DC=com"
{МодульПриложения(108,18)}: Переменная не определена (AD_Client)
   ТзДанныеАД = <<?>>AD_Client.ПолучитьДанныеПользователя_AD_In_LDAP(LDAP_Disable_Anonymous, AD_Domain_DC, AD_Array_Name_Attributes, LDAP_StartingPoint, LDAP_Filter);
12 vmv
 
30.12.11
16:30
AD_Client это общий клиентский модуль

это же мой общий кусок функционала для работы с АД, думаешь я его буду держать в дохлой форме)

мдя, без спеца вам эту задачу не поднять
13 vmv
 
30.12.11
16:33
LDAP_StartingPoint = <<?>>AD_Client.ПолучитьADUnits(Истина, Истина)+ "," + LDAP_StartingPoint;  // "OU=NA,OU=1C,DC=crm,DC=com"

и ниже можно закоментить, там же написано в камментах, что до этой строки мы читаем данные юзера из АД, а ниже его входимость в группы. Вот входимость в группы вам не нужна в вашей задаче.

Не бывает ничего готового на 100% в таких задачах, но можно прочесть каменты и подумать чуть-чуть)
14 vde69
 
30.12.11
16:36
(13) входимость в группу - нужна, по тому что при повторной попытки ввести пользователя в группу происходит исключение которое не так просто идентифицировать...
15 vmv
 
30.12.11
16:42
(14) показанный функционал на чтение из АД, с записью другой метод и там, естественно, другие проверки.

Там код сложнее, на этом(чтении) можно понять сам принцип связки ОДВС+ЛДАП+АД
и уже творить что хочешь. Эта троица работает стабильно на любых ОС(или ее проще заточить), все остально не факт.

например в линухах нет виннт, а лдар можно юзать)
16 TieXe
 
30.12.11
16:46
и еще вопрос, как эти функции будут запускаться? Каким событием?
17 vmv
 
30.12.11
16:57
(16) как тебе удобней так и будут: по кнопке на форме, в регламентом задании и т.д.

моя запускается при начале работы системы и проверяет если для базы установлена константа "Доменная авторизация = Истина", то в момент открытия главного окна окрывается форма запроса логина/пароля и по кнопочке "Ок"

вобщем так

//////////////////////////////////////////////////////////////////////////////////////////
// ВСТРОЕННЫЕ методы модуля приложения
//////////////////////////////////////////////////////////////////////////////////////////

Процедура ПриНачалеРаботыСистемы()
   
   РазрешенВходВСистемуПоAD();
   
КонецПроцедуры



//////////////////////////////////////////////////////////////////////////////////////////
// Вспомогательные методы модуля приложения
//////////////////////////////////////////////////////////////////////////////////////////

//----- Прочие методы по AD, работа с параметрами запуска/перезапуска приложения -------//

//
// РазрешенВходВСистемуПоAD принимает следующие значения: Ложь, Истина или Соответствие
// В случае "Соответствие" - оно содержит параметры доменного пользователя, который успешно прошел
// аутентификацию, но произвел запуск приложения НЕ со своего сеанса Windows. Поэтому производим
// принудительный перезапуск, чтобы такой пользователь автоматически, уже без запросов пароля, вошел в
// приложение со своим логином(ИмяПольвателяИБ) и со своими правами.
//
// Этот же метод используется не только при запуске приложения, но при его блокировке в уже открытом
// рабочем сеансе. Это блокировка являтся заменой стандартной блокировке 1С. Отметим, что блокировка
// 1С запрашивает пароль пользователя 1С, тогда как этот метод, запрашивает, естественно, доменный
// логин/пароль.
//
Процедура РазрешенВходВСистемуПоAD(Блокировка = Ложь) Экспорт

   РазрешенВходВСистемуПоAD = AD_Client.РазрешенВходВСистему(Блокировка);
   
   Если РазрешенВходВСистемуПоAD = Истина Тогда
       УстановитьЗаголовокСистемы(Метаданные.Синоним + ". Пользователь: " + ПолноеИмяПользователя());
   ИначеЕсли РазрешенВходВСистемуПоAD = Ложь Тогда
       ЗавершитьРаботуСистемы(Блокировка);    // Если при запуске, то Блокировка=Ложь, если блокировка приложения, то Блокировка=Истина. Т.е. при расблокировке с неудачными N попытками авторизации закрываем с сохранением данных открытых окон.
       Возврат;
   ИначеЕсли  ТипЗнч(РазрешенВходВСистемуПоAD) = Тип("Соответствие") Тогда    
       ПерезапуститьПослеДоменнойАвторизации(Блокировка, РазрешенВходВСистемуПоAD, "ПерезапуститьПослеДоменнойАвторизации");
       Возврат;
   КонецЕсли;
   
КонецПроцедуры

//
// Выполняется в случаях, если...
// 1. Пользователь логинится в приложение впервые.
// 2. Пользователь логинится в приложение с одним логином, но при доменной авторизации выбрал другой логин.
// 2-й случай отражает факт, что запуск был под сеансом Win текущего пользователя, но при авторизации выбрали
// другой логин/домен. Поэтому и происходит доменная авторизации этого "чужого" пользователя с перезапуском и
// входом с его именем пользователя и правами.
//
Процедура ПерезапуститьПослеДоменнойАвторизации(Блокировка, AD_Параметры, ПоКлючуС = "")
   
   ПараметрПутиИБ = ПреобразоватьСтрокуСоединенияККоманднойСтроке(СтрокаСоединенияИнформационнойБазы());
   
   // Ключ /N и имя входящего по нему пользователя позволяют "отключить" окно стандартной авторизации 1С,
   // но только при выполнении следующих условий...
   // 1. У Пользователя ИБ установлен флаг "Аутенфинтификация 1С:Предприятия".
   // 2. Пароль 1С Пользователя ИБ не установлен.
   // 3. У Пользователя ИБ установлен флаг "Аутенфинтификация операционнной системы".
   // 4. ПользовательОС не заблокирован в домене.
   // Отметим, что при неправильном вводе доменного пароля N раз, ПользовательОС блокируется в домене
   // средствами операционной системы. Поэтому после доменной блокровки пользователя будет "выскакивать"
   // окно авторизации 1С, т.к. в момент запуска он не проходит WA+ авторизацию. Но после открытия главного
   // окна все равно будет окрыта форма доменной авторизации, но такой пользователь не сможет войти в приложении пока
   // его не разблочит администратор домена. Т.е. если пользователь 3 или N раз неправильно ввел доменный пароль,
   // то это либо злоумышленник, либо "дурак" и все вопросы по расблокировке уходят к администратору домена.
   
   ПараметрыКС = "ENTERPRISE /WA+ " + ПараметрПутиИБ + " /N "+AD_Параметры.Получить("ИмяПользователяИБ");
   
   Если Не ПустаяСтрока(ПоКлючуС) Тогда
       ПараметрыКС = ПараметрыКС + " /C " + ПоКлючуС;  // Передача ключа /C позволяет не запрашивать повторно доменный пароль.
   КонецЕсли;
           
   ЗавершитьРаботуСистемы(Блокировка, Истина, ПараметрыКС);
   
КонецПроцедуры

Функция ПреобразоватьСтрокуСоединенияККоманднойСтроке(СтрокаСоединения)
   
   Файл = НСтр(СтрокаСоединения,"File");
   
   Если Файл <> "" Тогда
      ПараметрПутиИБ = "/F " + ?(Найти(Файл," ")<>0,""""+Файл+"""",Файл);  // Желательно чтобы полный путь к файловой базе не содержал пробелов. Например </F "D\Моя база">, может не работать. Необходимо изменить имя базы на "МояБаза". Но это спорно, может будет работать и с "кривым" именем файловой базы.
   Иначе    
      ПараметрПутиИБ = "/S " + НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref");
   КонецЕсли;

   Возврат ПараметрПутиИБ;
   
КонецФункции

ты можешь просто прикрутить на кнопку в форму своей обработки свой обработчик, можешь с выпадающим меню

"по виннт"
"по лдап"

это был бы идеальный вариант)
18 vde69
 
30.12.11
16:58
(16) для запуска этих функций нужно сказать "трах-теби-дох" и вырвать из бороды волосок. Тогда запустятся...
19 vmv
 
30.12.11
17:17
резюме: надеюсь к релизу 8.5 разработчики добавят в платформу функционал доменной авторизации для тонкого/толстого клиента, ибо сандартная ва+ авторизация, которая позволяет войти в приложение без запроса доменного пароля это шара и вопиющее нарушение безопасности)
20 vmv
 
30.12.11
17:19
ужесточим)

вопиющее нарушение закона о защите конфиденциальной информации.

Согласно этому нарушению можно подавать иски и дават срок за разработку незащищенного софта)
21 vde69
 
30.12.11
17:26
(19) не совсем так, ибо во первых есть сеансовое шифрование и проверка подлиности ведется на клиенте при обмене сертификатами.

протокол ломается, но довольно не просто...

куда большей дырой является DCOM сервер....
22 TieXe
 
30.12.11
18:11
vmv

17 - 30.12.11 - 16:57

Снова ошибка:

{МодульПриложения(91,32)}: Переменная не определена (AD_Client)
   РазрешенВходВСистемуПоAD = <<?>>AD_Client.РазрешенВходВСистему(Блокировка);
23 TieXe
 
30.12.11
18:12
(17)

{МодульПриложения(91,32)}: Переменная не определена (AD_Client)
  РазрешенВходВСистемуПоAD = <<?>>AD_Client.РазрешенВходВСистему(Блокировка);
24 vmv
 
30.12.11
20:47
бгг, я дал не весь функционал, но его вполне достаточно чтобы понять что и как работает и создать свой вариант.

на востановление своего максиммум полчаса самостоятельной работы.

выложить полностью все, значит обречь вас на бездумное копирование кода, а это очень плохо)
25 МишельЛагранж
 
01.01.12
18:35
че, опять 1с-ники придумывают себе проблемы и успешно их решают?
1 беда + 1 беда = беда в квадрате?
на линуксе домен делайте, и не мучьте винду бедную...
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс