|   |   | 
| 
 | Запрос 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 | 
        (20) да нифига :)
 https://msdn.microsoft.com/en-us/library/ms679021(v=vs.85).aspx | |||
| 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) Ну гуид в ввиде констаны в запросе.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |