Могу ли я получить определенного пользователя по некоторому атрибуту, не зная OU в Active Directory (AD)? - PullRequest
2 голосов
/ 23 февраля 2012

Мне нужно, чтобы конкретный пользователь знал только поле "sAMAAccountName".

Дело в том, что этот конкретный пользователь может находиться во многих группах:

OU=ThirdParty
    OU=Company1
        CN=User1   
        CN=User2 
        CN=User3 
    OU=Company2
        CN=User1 
        CN=User2 
        CN=User3 

Есть лиспособ заставить пользователя не знать его группы, используя только один атрибут, который он имеет?

Мой код:

DirectorySearcher search = new DirectorySearcher(_path);
search.Filter = "(&(objectCategory=person)(objectClass=User))";
StringBuilder groupNames = new StringBuilder();
try
{
    SearchResultCollection result = search.FindAll();
    .....
}

Спасибо!

РЕДАКТИРОВАТЬ:

Хорошо, я получил это, используя этот код:

DirectorySearcher search = new DirectorySearcher(_entry, "(sAMAccountName=" + userCode + ")");

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

Если вы переключитесь на System.DirectoryServices.AccountManagement, то обнаружите, что API-интерфейсы на самом деле намного проще.

Например:

    public something FindUserByUserName( string UserName )
    {
        using ( var searcher = 
            new PrincipalSearcher( new UserPrincipal( ConfigurationContext ) { Name = UserName } ) )
        {
            var item = searcher.FindOne();

            // do whatever you want with the found object and return it
        }
    }

, где ConfigurationContext - это свойствокоторый возвращает PrincipalContext (учетные данные для подключения к AD, что-то вроде «строки подключения»)

1 голос
/ 23 февраля 2012

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

using (var identity = new WindowsIdentity(username))
{
    var user = new WindowsPrincipal(identity);

    if (user.IsInRole("Some Role Name"))
        return true;

    return false;
}

РЕДАКТИРОВАТЬ .Они показывают, что получают запрашиваемое поле, но я не уверен, что код для получения сотрудника будет применяться к вам, поскольку это относится к InfoPath: http://msdn.microsoft.com/en-us/library/bb952744(v=office.12).aspx

0 голосов
/ 24 февраля 2012

Попробуйте это:

public static List<string> GetADUserInfo(string login)
{
    //Using Hosting.HostingEnvironment.Impersonate()
    List<string> info = new List<string>();
    PrincipalContext infPC = new PrincipalContext(ContextType.Domain, "domain", "login", "password");
    UserPrincipal infUP = new UserPrincipal(infPC);
    PrincipalSearcher infPS = new PrincipalSearcher();
    UserPrincipal foundUP;

    infUP.SamAccountName = login;
    infPS.QueryFilter = infUP;
    foundUP = infPS.FindOne();

    if (foundUP != null) {
        info.Add(foundUP.SamAccountName.ToLower);
        info.Add(foundUP.GivenName);
        info.Add(foundUP.Surname);
        info.Add(foundUP.EmailAddress.ToLower);
        return info;
    }

    return null;
}
...