Фильтр запросов ArgumentException при попытке расширения субъекта OU - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь создать расширение принципала для организационного подразделения, используя этот код ниже

[DirectoryRdnPrefix("OU")]
[DirectoryObjectClass("organizationalUnit")]
public class OrganizationalUnitPrincipal : Principal
{
    public OrganizationalUnitPrincipal(PrincipalContext Context_p)
    {
        PropertyInfo contextRaw = this.GetType().BaseType.GetProperty("ContextRaw",
            BindingFlags.Instance | BindingFlags.NonPublic);
        contextRaw.SetValue(this, Context_p, null);
    }
}

Но выдает следующую ошибку:

System.ArgumentException: Persisted Principal objects cannot be used as query filters.

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

Может ли это работать или нет?

Я хочу добиться того же, что показано на этой странице http://msdn.microsoft.com/en-us/site/bb384372

1 Ответ

0 голосов
/ 09 декабря 2011

С теоретической точки зрения я думаю, что то, что вы хотите сделать, не имеет смысла.Это объясняется в статье, которую вы указываете, но это не так ясно.Концепция Principal основана на Directory Schema, которые описывают объекты, которые вы можете добавить в ActiveDirectory.

Классы Principal, AuthenticablePrincipal, UserPrincipal, ComputerPrincipal и GroupPrincipal можно расширить для создания пользовательскихобъекты, расширяющие объектную модель .

Но в LDAP в целом, как и в Active-Directory, класс organizationalUnit не является подклассом класса user, а просто подклассом класса top.

Другими словами: с концептуальной точки зрения вы можете заметить, что Principal является своего рода пользователем (Да, с точки зрения Microsoft, компьютеры являются пользователями, они открывают сессии в домене, как пользователи), иorganizationalUnit является своего рода организационным блоком (как каталог в файловой системе), поэтому второй не расширяет первый.


Отредактировано

Вот подклассDirectoryEntry, которые делают то, что вы хотите:

class ClsOrganizationalUnit : DirectoryEntry
{
  private DirectoryEntry de;

  public string Description
  {
    get { return (string)de.Properties["description"][0]; }
    set { de.Properties["description"].Value = value;
          de.CommitChanges();
        }
  }

  public ClsOrganizationalUnit(string dn, string username, string password)
  {
    de = new DirectoryEntry(dn, username, password);
  }


}

class Program
{
  static void Main(string[] args)
  {
    ClsOrganizationalUnit ou = new ClsOrganizationalUnit("LDAP://192.168.183.100:389/ou=Monou,dc=dom,dc=fr", "jpb", "pwd");

    /* Set the attribute */
    ou.Description = "The description you want";
    Console.WriteLine("Here is your OU description : {0}", ou.Description);

    /* Remove the attribute */
    ou.Description = null;
  }
}
...