Фиксация изменений в DirectoryEntry, возвращенном из использования блока внутри функции - PullRequest
0 голосов
/ 23 января 2012

Я собираюсь показать свое незнание о том, как использование операторов работает в c #, я думаю.

Я пытаюсь написать функцию, которая получает уникальные идентификаторы для пользователя в активном каталоге и возвращает этого пользователя.Затем я хочу внести изменения в пользователя и зафиксировать их.

Я подозреваю, что это не работает, потому что я возвращаюсь в блоке использования.

Вот основная идея:

public static DirectoryEntry GetADUser( string prop1Value, string prop2Value )
{
    using( var rootDE = new DirectoryEntry(LDAPPath, User, Password))
    {
        using( var searcher = new DirectorySearcher(rootDE))
        {
            searcher.Filter = string.Format("(&(prop1={0})(prop2={1}))", prop1Value, prop2Value);
            var user = searcher.FindOne().GetDirectoryEntry();

            return user;
        }
    }
}

//...

var user = GetADUser("val1","val2");

user.Properties["prop3"].Value = "Spagetti";
user.CommitChanges();

Будет ли это работать?Не похоже, что активный каталог показывает изменения, которые я делаю таким образом.Я не получаю никаких исключений при вызове изменений коммита.

Это связано с: Можно ли делать возврат изнутри, используя блоки и Что происходит, когда returnвызывается из блока 'using'? .

Если это не сработает таким образом, как плохо это получится, если я переписываю эту функцию без использования блоков?

Ответы [ 2 ]

0 голосов
/ 23 января 2012

объявляет вашего пользователя как SearchResult за пределами блоков using, затем назначает его в блоке using (var searcher ....), а затем помещает ваш оператор return после окончания использования блока

* 1003 т.е. *

SearchResult user = null;
using( var rootDE = new DirectoryEntry(LDAPPath, User, Password))
{
    using( var searcher = new DirectorySearcher(rootDE))
    {
        searcher.Filter = string.Format("(&(prop1={0})(prop2={1}))", prop1Value, prop2Value);
        var user = searcher.FindOne().GetDirectoryEntry();


    }
}
return user;

Вы также можете немного упростить вещи, изменив поисковик с помощью блока

using (var searcher = new DirectorySearcher(rootDD, string.Format("(&(prop1={0})(prop2={1}))", prop1Value, prop2Value))
{
    user = searcher.FindOne();
}
0 голосов
/ 23 января 2012

Не надо жестко кодировать значение Spagetti также если user.Properties ["prop3"]. Значение дает и ошибка попробуйте

 (string)user.Properties["prop3"] = some variable if it's type is a string or 
  user.Properties["prop3"].Value = someVariable.ToString() 

если целое число приведено к целому числу, имеет ли это смысл ..? вы не сможете получить доступ к пользователю, если он не находится внутри использования в отношении фиксации .. поэтому переместите фиксацию внутри использования ..

...