Запросить роли пользователя в AD, если вызывающий абонент не находится в домене - PullRequest
6 голосов
/ 04 февраля 2009

Я хотел бы получить членство в группе пользователя в ActiveDirectory, не входя в домен. Когда я запускаю это внутри домена, все хорошо.

var context = new PrincipalContext(ContextType.Domain);
var principal = UserPrincipal.FindByIdentity(context, IdentityType.Name, "administrator");

foreach (var authorizationGroup in principal.GetAuthorizationGroups())
{
    Console.WriteLine(authorizationGroup.Name);
}

Однако, когда я запускаю за пределами домена, я должен указать PrincipalContext в следующем:

var context = new PrincipalContext(ContextType.Domain, "10.0.1.255", "DC=test,DC=ad,DC=be", "administrator", "password");

Когда я запускаю этот код, я получаю исключение при выполнении principal.GetAuthorizationGroups(). Исключение, которое я получаю:

System.DirectoryServices.AccountManagement.PrincipalOperationException: Information about the domain could not be retrieved (1355).
at System.DirectoryServices.AccountManagement.Utils.GetDcName(String computerName, String domainName, String siteName, Int32 flags)
at System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo()
at System.DirectoryServices.AccountManagement.ADStoreCtx.get_DnsDomainName()
at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p)
at System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper()
at System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups()

Ответы [ 3 ]

2 голосов
/ 05 апреля 2013

Мне просто пришлось столкнуться с той же проблемой. Я надеюсь, что это поможет кому-то еще.

/*Argument*/
string username;



/*Global settings*/
string ADHost = "dc.a.b.c"; /*Or ip address*/
string ADUsername = "username";
string ADPassword = "password";
string ADDomain = "a.b.c";
string ADContainer = "DC=A,DC=B,DC=C"; /*I have a function to do the translation*/
/*Global settings*/

var list = new List<string>();

var path = "LDAP://" + ADHost + "/" + ADContainer;
var deDomain = new DirectoryEntry(path, ADUsername, ADPassword);
var ds = new DirectorySearcher(deDomain, "(&(objectClass=User)(sAMAccountName=" + username + "))");

ds.SearchScope = SearchScope.Subtree; /*Cascade*/
ds.ReferralChasing = ReferralChasingOption.All; /*Follow redirection*/

var usr = ds.FindOne();
if (null != usr)
{
    var deUsr = new DirectoryEntry(usr.Path, ADUsername, ADPassword);

    foreach (string groupDN in deUsr.Properties["memberOf"])
    {
        string[] parts = groupDN.Replace("CN=", "").Split(',');
        list.Add(parts[0]);
    }
}
1 голос
/ 04 февраля 2009

Похоже на проблему с DNS.

Локатор DC работает, выполняя DNS-запросы для записей SRV, чтобы найти соответствующий DC на вашем текущем сайте. Если этого нет в DNS, локатор DC потерпит неудачу, что происходит в вашей трассировке стека.

0 голосов
/ 04 февраля 2009

Возможно, я сейчас не могу это проверить.

Я попробовал следующее: я использую отличный Active DirectoryExplorer от sysinternals. При входе с теми же учетными данными: 10.0.1.255, "administrator", "password"

Теперь я могу видеть группы пользователей без проблем как

["memberOf"] = "CN=TestGroup,CN=Users,DC=test,DC=ad,DC=be"
...