2012-03-20 2 views
1

의 구성원 인 경우. 로그인시 사용 중입니다.확인 사용자 나 사용자가 그룹의 구성원 인 경우 코드를 확인해야 그룹

내가 도메인 사용자 및 로컬 사용자 등이 있습니다. testdomain\administratoradministrator.

내가 사용하는 코드입니다 :

using (DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./" + userGroupName + ",group")) 
{ 
    foreach (object member in (IEnumerable)groupEntry.Invoke("Members")) 
    { 
     using (DirectoryEntry memberEntry = new DirectoryEntry(member)) 
     { 
      string completeName = memberEntry.Name; 
      DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry); 
      if (domainValue != null) 
      { 
       completeName = domainValue.Name + "\\" + memberEntry.Name; 
      } 
      Global.logger.Info("completeName from " + userGroupName + " = " + completeName); 
      if (userName.Equals(completeName, StringComparison.InvariantCultureIgnoreCase)) 
      { 
       Global.logger.Debug("IsUserPartOfWindowsGroup returned True with username =" + userName + " , UserGroupName = " + userGroupName); 
       return true; 
      } 
     } 
    } 
    Global.logger.Debug("IsUserPartOfWindowsGroup returned false for username =" + userName + " , UserGroupName = " + userGroupName); 
    return false; 
} 

이 코드는 작동하지만, 내가보기로

DirectoryEntry domainValue = GUIUtility.FindDomain(memberEntry); 

은 프로파일에서 많은 시간을하고있다. 이것을 처리하는 더 나은/빠른 방법이 있습니까?

public static DirectoryEntry FindDomain(DirectoryEntry memberEntry) 
{ 
    if (memberEntry.Parent != null) 
    { 
     if (memberEntry.Parent.SchemaClassName.Equals("domain", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      return memberEntry.Parent; 
     } 
    } 
    return null; 
} 

또 다른 방법 :

DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, Password); 
DirectorySearcher mySearcher = new DirectorySearcher(entry); 
mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))"; 
SearchResult result = mySearcher.FindOne(); 

Global.logger.Info("result == " + result.Path); 
foreach (string GroupPath in result.Properties["memberOf"]) 
{ 
    if (GroupPath.Contains(adminGroupName)) 
    { 
     Global.logger.Info(compUsrNameForEncryption + "exists in " + adminGroupName); 
    } 
} 
+1

우리가'GUIUtility.FindDomain'이 무엇인지 안다면 우리는 아마 더 도움이 될 수. 또한 새 (틱) System.DirectoryServices.AccountManagement] (http://msdn.microsoft.com/en-us/library/system.directoryservices.accountmanagement.aspx) 클래스는이 물건의 종류 훨씬 간단합니다. –

+0

[관련 질문 (http://stackoverflow.com/q/9603777/635634)의 코드 [내 대답 (http://stackoverflow.com/a/9604203/635634) 그 질문에 대한 것 아마 당신을 도와 밖으로. –

+0

안녕하세요 babcock .. 나는 finddomain 함수를 추가했습니다. 또한 사용자가 도메인의 일부가 아닌 경우 어떻게해야합니까? – user175084

답변

8

이 내가 무엇을 사용 꽤 가까이 :

public bool IsUserInGroup(string userName, string groupName) 
{ 
    using (var context = new PrincipalContext(ContextType.Machine)) 
    { 
     using (var searcher = new PrincipalSearcher(new UserPrincipal(context) { SamAccountName = userName })) 
     { 
      using (var user = searcher.FindOne() as UserPrincipal) 
      { 
       return user != null && user.IsMemberOf(context, IdentityType.SamAccountName, groupName); 
      } 
     } 
    } 
} 

그래도 로컬 사용자를 위해 그것을 테스트하지 않았습니다. 논리는 내 도메인에서 작동합니다. 이제 PrincipalContext(ContextType.Machine)을 변경하여 로컬 사용자를 살펴보아야합니다.

어쩌면 내가 뭔가를보고 싶어하지만 당신은 그냥 할 수 없었 System.DirectoryServices.AccountManagement

+0

이봐, 난에서 오류 nullrefrenceexception를 얻을 수 – user175084

+0

또한 모든 성의 검사를 제거 했으므로'userName'이 유효한 사용자가 아닌 경우 검사를 받게됩니다. –

+0

내 원래 코드에 일부 '사용 중'이 누락되어 있으므로 추가 한 후 필요한 위생 점검을 거쳤습니다. –

1

에 대한 참조 및 사용하여 문을 추가하는 것을 잊지 마세요 :

if(Page.User.IsInRole("GROUP NAME")) 
{ 
    // user is in group. do your thing 
} 
else 
{ 
    // user isn't in group 
} 

작품을 나를 위해 내가 '할 때 ASP.NET에서 Active Directory 인증을하고 있습니다.

EDIT : 여기에서는 Page.User.IsInRole을 사용하여 설명하는 link()이다. Windows 인증을 사용하지 않으면 Windows 인증이 제대로 작동하지 않습니다.

EDIT2가 :이 Windows 인증이 사용되지 않기 때문에 이것은 내가 어떻게 할 것입니다 :

DirectoryEntry de = new DirectoryEntry(LDAP Address,user,password); 
DirectorySearcher searcher = new DirectorySearcher(de); 
searcher.Filter = string.Format("(SAMAccountName={0})", user); 
SearchResult result = searcher.FindOne(); 
bool isInGroup = false; 
if (result != null) 
{ 
    DirectoryEntry person = result.GetDirectoryEntry(); 
    PropertyValueCollection groups = person.Properties["memberOf"]; 
    foreach (string g in groups) 
    { 
     if(g.Equals(groupName)) 
     { 
      isInGroup = true; 
      break; 
     } 
    } 
} 
return isInGroup; 
+0

당신은 맞을지 모르지만 저는 ASP.NET 개발자가 아닙니다. OP는 로컬 사용자/그룹과 함께 작동하는 솔루션을 찾고 있다고 말했지만 솔루션이 그 다음에 작동하면 대답이 가장 적합 할 것입니다. –

+0

@ M.Babcock OP가 Windows 인증을 사용하는 한 다음 작동합니다. 그렇지 않다면, 당신의 대답은 갈 방법입니다 – Jetti

+0

난 창문 인증을 사용하지 .. 그리고 이것은 클래스에 정의되어 있습니다 .. 그래서 페이지 실 거예요 .. 감사합니다 – user175084

관련 문제