|
не получается интеграция с 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 беда = беда в квадрате? на линуксе домен делайте, и не мучьте винду бедную... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |