2009-02-04 5 views
6

도메인에 속하지 않고 Active Directory에서 사용자의 그룹 회원 자격을 얻고 싶습니다. 이것을 도메인 내부에서 실행하면 모든 것이 잘됩니다. 내가 도메인 외부 실행하면발신자가 도메인에없는 경우 AD에서 사용자의 역할을 요청하십시오.

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() 

답변

1

DNS 문제인 것 같습니다.

DC 로케이터는 SRV 레코드에 대한 DNS 쿼리를 수행하여 현재 사이트에서 적절한 DC를 찾습니다. 그 물건이 DNS에 없으면 DC 로케이터가 실패하고 스택 트레이스에서 발생합니다.

+0

이 문제가 발생했습니다. "nslookup yourdomain"을 실행하면 DC로 해결됩니다. – T3hc13h

0

지금은 확인할 수없는 경우가 있습니다.

나는 다음을 시도했다 : 나는 sysinternals의 우수한 Active DirectoryExplorer를 사용한다. 동일한 자격 증명으로 로그인 할 때 : 10.0.1.255, "administrator", "password"

을 지금은 그냥 같은 문제를 해결했다

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

으로 문제없이 사용자의 그룹을 볼 수 있습니다. 나는이 도움이 다른 누군가에게 도움이되기를 바랍니다.

/*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]); 
    } 
}