2009-07-24 52 views
4

我正在研究管理Active Directory中的用戶帳戶的應用程序。儘可能使用System.DirectoryServices.AccountManagement命名空間,但我無法弄清楚如何確定用戶的主要組。當我嘗試刪除作爲用戶主要組的組時,我收到一個異常。這裏是我當前的代碼:你能在C#中找到Active Directory用戶的主要組嗎?

private void removeFromGroup(UserPrincipal userPrincipal, GroupPrincipal groupPrincipal) { 
    TODO: Check to see if this Group is the user's primary group. 
    groupPrincipal.Members.Remove(userPrincipal); 
    groupPrincipal.Save(); 
} 

是否有一種方式來獲得用戶的主要組的名稱,所以我可以嘗試刪除該組用戶之前做一些驗證?

回答

0

用戶主要組的RID存儲在用戶對象的'primaryGroupID'屬性中。您必須獲取給定用戶(或用戶其他API)的DirectoryEntry才能檢索此值。獲得該值後,您必須將其轉換爲主組的SID,然後從中獲取該組。

有是有這方面的更多細節,以及與如何找到主組,在這裏VB代碼知識庫文章:http://support.microsoft.com/kb/297951

5

這是一個相當混亂和參與業務 - 但是這個代碼片斷是從我BeaverTail ADSI瀏覽器,我在C#寫完全(在NET 1.1天),是衆所周知的工作 - 不漂亮,但功能:

private string GetPrimaryGroup(DirectoryEntry aEntry, DirectoryEntry aDomainEntry) 
{ 
    int primaryGroupID = (int)aEntry.Properties["primaryGroupID"].Value; 
    byte[] objectSid = (byte[])aEntry.Properties["objectSid"].Value; 

    StringBuilder escapedGroupSid = new StringBuilder(); 

    // Copy over everything but the last four bytes(sub-authority) 
    // Doing so gives us the RID of the domain 
    for(uint i = 0; i < objectSid.Length - 4; i++) 
    { 
     escapedGroupSid.AppendFormat("\\{0:x2}", objectSid[i]); 
    } 

    //Add the primaryGroupID to the escape string to build the SID of the primaryGroup 
    for(uint i = 0; i < 4; i++) 
    { 
     escapedGroupSid.AppendFormat("\\{0:x2}", (primaryGroupID & 0xFF)); 
     primaryGroupID >>= 8; 
    } 

    //Search the directory for a group with this SID 
    DirectorySearcher searcher = new DirectorySearcher(); 
    if(aDomainEntry != null) 
    { 
     searcher.SearchRoot = aDomainEntry; 
    } 

    searcher.Filter = "(&(objectCategory=Group)(objectSID=" + escapedGroupSid.ToString() + "))"; 
    searcher.PropertiesToLoad.Add("distinguishedName"); 

    return searcher.FindOne().Properties["distinguishedName"][0].ToString(); 
} 

希望這有助於。

馬克

+1

哇。醜,但它的作品:) +1 – Simon 2010-04-09 02:47:11

-2
 using (PrincipalContext context = XXX) 
     { //get the group 
       using (GroupPrincipal groupPrincipal = 
         GroupPrincipal.FindByIdentity(context,IdentityType.SamAccountName, group)) 
       { 
        if (groupPrincipal != null) 
        { 
         //get the user 
         using (UserPrincipal userPrincipal = 
        UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName)) 
         { 
          if (userPrincipal != null) 
          { 
           returnValue = userPrincipal.IsMemberOf(groupPrincipal); 
          } 
         } 
        } 
       } 

     } 
相關問題