Имя: Пароль:
1C
1С v8
Запрос ADO к LDAP. Как правильно передать параметр objectGUID.
0 ELEA26
 
14.09.17
15:52
Как правильно передать параметр objectGUID

Код:
ADODB_Command = Новый COMОбъект("ADODB.Command");
ADODB_Command.ActiveConnection =Connection;
ADODB_Command.Properties("Page Size").Value     = 1000;
ADODB_Command.Properties("Timeout").Value       = 30;
ADODB_Command.Properties("Cache Results").Value = Ложь;
query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where objectGUID  = ?";
ADODB_Command.CommandType = 8;
ADODB_Command.CommandText = query;
//Parameters=ADODB_Command.Parameters;
//Parameter = ADODB_Command.CreateParameter( , 72,1, 5,ОбщиеФункции.ПреобразоватьGUIDвCOM(Гуид)); //Как только не преобразовывал этот гуид.
    //1 - Имя  (говорят именовать нельзя)
    //2 - Тип (см. в "C:\Program Files\Common Files\System\ado\adojavas.inc")
    //3 - 1=входящий, 2=исходящий (adParamInput,adParamOutput) там же в файле
    //4 - хз. Длина видимо
    //5 - значение          
//ADODB_Command.Parameters.Append(Parameter);  
rs = ADODB_Command.Execute();

Без where objectGUID  = ? - работает, но потом перебирать кучу строк - не айс. А получить по одному GUID никак не получается.
1 Ёпрст
 
14.09.17
15:54
не проще динамический запрос слепить и забить на параметр ?
2 Ёпрст
 
14.09.17
15:55
query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where objectGUID  = "+гуидтвой+"'";
3 ELEA26
 
14.09.17
16:00
(2) Вот как "гуидтвой" подставлять? Как он выглядеть должен?
Строка? С знаками {} с дефизами? Или как varbinary 0x0d836833fблабла?
Я по всякому ставил. Или с ошибками валится или пустой запрос.
4 Ёпрст
 
14.09.17
16:00
(3) подставляй так, как она хранится в ИБ.
5 Ёпрст
 
14.09.17
16:01
скорее, там будет 0x0d836833fблабла?
6 ELEA26
 
14.09.17
16:05
(4) в ИБ это реквизит строка:
{E2B589DD-DE54-475E-BCD4-DD894F6BF9EE}

Добывается ранее при создании таким же запросом. Но возвращается COM объект.
Чтобы его сохранить делаю так:
Функция ПреобразоватьGUID(COMobjectGUID) Экспорт
    objectGUID = COMobjectGUID.Выгрузить();
    GUID    = "{";
    GUID    = GUID + НЕХ(Из10В(objectGUID[3],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[2],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[1],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[0],16));
    GUID    = GUID + "-";
    GUID    = GUID + НЕХ(Из10В(objectGUID[5],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[4],16));
    GUID    = GUID + "-";
    GUID    = GUID + НЕХ(Из10В(objectGUID[7],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[6],16));
    GUID    = GUID + "-";
    GUID    = GUID + НЕХ(Из10В(objectGUID[8],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[9],16));
    GUID    = GUID + "-";    
    GUID    = GUID + НЕХ(Из10В(objectGUID[10],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[11],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[12],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[13],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[14],16));
    GUID    = GUID + НЕХ(Из10В(objectGUID[15],16));
    GUID    = GUID + "}";
    Возврат GUID;
КонецФункции


А COMobjectGUID - это:
GUIDСтр = ОбщиеФункции.ПреобразоватьGUID(rs.Fields("objectGUID").Value);

В чистом виде rs.Fields("objectGUID").Value хранить не получается.
Как из строки обратно сделать COM объект и тем более как потом вставить в запрос не понятно.
Пробовал обратно в COM так:
Функция ПреобразоватьGUIDвCOM(GUID) Экспорт
    
    НашМассив = Новый Массив;
    НашМассив.Добавить(СРЕД(GUID,8,2));
    НашМассив.Добавить(СРЕД(GUID,6,2));
    НашМассив.Добавить(СРЕД(GUID,4,2));
    НашМассив.Добавить(СРЕД(GUID,2,2));
    
    НашМассив.Добавить(СРЕД(GUID,13,2));
    НашМассив.Добавить(СРЕД(GUID,11,2));
    
    НашМассив.Добавить(СРЕД(GUID,18,2));
    НашМассив.Добавить(СРЕД(GUID,16,2));
    
    НашМассив.Добавить(СРЕД(GUID,21,2));
    НашМассив.Добавить(СРЕД(GUID,23,2));
    
    НашМассив.Добавить(СРЕД(GUID,26,2));
    НашМассив.Добавить(СРЕД(GUID,28,2));
    НашМассив.Добавить(СРЕД(GUID,30,2));
    НашМассив.Добавить(СРЕД(GUID,32,2));
    НашМассив.Добавить(СРЕД(GUID,34,2));
    НашМассив.Добавить(СРЕД(GUID,36,2));
    
    КомМассив = New COMSafeArray(НашМассив,"VT_VARIANT",16);
КонецФункции

Но тоже не катит.
7 Филиал-msk
 
14.09.17
16:06
Оно в CAST умеет?
8 ELEA26
 
14.09.17
16:06
Да, валится с ошибкой:
{ОбщийМодуль.ОбменLDAP.Модуль(287)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Provider): Произошла одна или несколько ошибок во время обработки команды.
9 ELEA26
 
14.09.17
16:07
(7) И cast и convert в условии пробовал. Тоже не получается :(
10 Филиал-msk
 
14.09.17
16:09
(9) а теперь в выборке попробуй чтобы строку получить.
11 ELEA26
 
14.09.17
16:12
(10) я в выборке пробовал. без условия, просто добавлял в выборку:

cast(objectGUID as varchar) as test
пробовал и
cast(objectGUID as uniqueidentifier) as test
и convert(varchar,objectGUID,1)
и все это в разных комбинациях.
Все время запрос падает с ошибкой из (8)
12 Ёпрст
 
14.09.17
16:14
(6) подставляй в запрос просто строкой  0x0d836833.....
13 Ёпрст
 
14.09.17
16:17
текст запроса должен быть такой в результате:

where objectGUID = 0xBFD7C8600001E2D711E2BC5E73199D7F
14 Ёпрст
 
14.09.17
16:17
ну и как получить hex из 10-ого числа, наверное , напишешь :)
15 Ёпрст
 
14.09.17
16:28
Или вот, гений тут распинался
v8: Как перевести ГУИД в число и обратно?
16 ELEA26
 
14.09.17
16:32
(13) Вот из отладчика:
SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://172.10.10.15/DC=ad,DC=domain,DC=corp' Where objectGUID = 0xDD89B5E254DE5E47DBD4DD894F6BF9EE

выпало в исключение, текст ошибки тот же:
{ОбщийМодуль.ОбменLDAP.Модуль(287)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Provider): Произошла одна или несколько ошибок во время обработки команды.
17 Ёпрст
 
14.09.17
16:49
(16) без where хотя бы работает ?
18 ELEA26
 
14.09.17
16:51
(17) да.
И даже другой запрос по логину:
query = "SELECT ADsPath,objectGUID,sAMAccountName,userPrincipalName FROM 'LDAP://"+Адрес+"/"+ОбщиеФункции.Root()+"' where UPPER(sAMAccountName) = '"+Логин+"'";
отлично работает.
sAMAccountName - строка.
А вот objectGUID - OctetString
А как с этим OctetString работать - не понимаю...
19 Ёпрст
 
14.09.17
16:54
(18) не понял, у тебя objectGUID  бинари16 или OctetString  ?
20 ELEA26
 
14.09.17
16:56
(19) да вот фиг пойми. В ActiveDirectoryExplorer - пишет, что OctetString все же.
21 Ёпрст
 
14.09.17
17:00
22 Ёпрст
 
14.09.17
17:05
И это, а нафига тебе вообще впёрся objectGUID?
Пользуй просто guid
23 ELEA26
 
14.09.17
17:07
(22) Всмысле? В LDAP есть только этот.
24 Ёпрст
 
14.09.17
17:15
(23) есть там и поле guid
25 Ёпрст
 
14.09.17
17:15
ghjdthm
26 Ёпрст
 
14.09.17
17:15
проверь
27 Ёпрст
 
14.09.17
17:24
Вот так еще, работает?

where objectGUID=\90\39\5F\B9\9A\B5\1B\4A\9E\96
\86\C6\6C\B1\8D\99
28 Ёпрст
 
14.09.17
17:27
или так ?

where objectGUID={b95f3990-b59a-4a1b-9e96-86c66cb18d99}
29 ELEA26
 
14.09.17
17:38
(27) (28) пробовал. Если
where objectGUID='{b95f3990-b59a-4a1b-9e96-86c66cb18d99}'

то не находит, а если без кавычек:
where objectGUID={b95f3990-b59a-4a1b-9e96-86c66cb18d99}

то с ошибкой выпадает.
30 mexanik_96
 
14.09.17
17:44
(29) не взлетит ибо тип октет стринг, те бинарь. нужно через обертку делать. делал c использованием с#.
31 mexanik_96
 
14.09.17
17:47
+(30)  var entry = new DirectoryEntry(strDEntry, username, password);

                if (entry != null)
                {
                    if (property == "objectGUID")
                    {
                        Guid guid = new Guid((Byte[])(Array)entry.Properties["objectGUID"][0]);

strDEntry = LDAP:\\и поехали
32 ELEA26
 
14.09.17
19:35
Все же:
where objectGUID='\90\39\5F\B9\9A\B5\1B\4A\9E\96
\86\C6\6C\B1\8D\99'

С кавычками одиночными. Но порядок байтов надо менять местами (от обычного строкового ГУИД).
1 - 4 в 4 - 1
5-6 в 6-5
7-8 в 8-7
остальные по порядку.
Хотя у меня такое ощущения, что такой вариант я пробовал.
Провозился знатно :(
33 Йохохо
 
14.09.17
19:42
а что за запись такая? '\90\39\5F\B9\9A\B5\1B\4A\9E\96
\86\C6\6C\B1\8D\99'
Синхронизация с Active Directory
34 ELEA26
 
14.09.17
20:00
(33) Ну гуид в ввиде констаны в запросе.
AdBlock убивает бесплатный контент. 1Сергей