在C#中从AD获取主要groupName的最简单方法是什么?

时间:2010-04-30 13:54:31

标签: c# active-directory

我目前正在使用PrincipalContext和UserPrincipal来返回用户的主要groupid。

如何获取此ID并找到实际的群组名称?

此外,我的代码可以正常分配用户的主要组,但是一旦我将它们分配给组,我就无法将其从域用户中删除,这是我更改之前的默认主要组。在尝试删除域用户组之前,我已调用Save()

我的要求声明我必须将用户添加到AD然后分配其主要组,然后将其作为域用户的成员删除。

3 个答案:

答案 0 :(得分:2)

终于搞定了

 PrincipalContext principalContext = this.principalFactory.CreateActiveDirectoryManagementContext(locationType);
        UserPrincipal userPrincipal = this.principalFactory.CreateUserPrincipal(principalContext, userName);

        string primaryGroupId = userPrincipal.GetPrimaryGroupId();

        PrincipalSearchResult<Principal> results =
            userPrincipal.GetAuthorizationGroups();

        foreach (Principal principal in from principal in results
                                        let sid = principal.Sid.ToString()
                                        let test = sid.Split('-').ToList()
                                        let count = test.Count
                                        where test[count - 1].Equals(primaryGroupId)
                                        select principal)
        {
            return principal.Name;
        }

        return string.Empty;

答案 1 :(得分:1)

没有看到你的代码,很难确定,但听起来你几乎就在那里!几年前我有类似的任务,这blog article对我很有帮助。这篇Scripting Guy文章更详细地讨论了这些步骤。

我不知道你是否可以使用System.DirectoryServices.AccountManagement这样做。使用该命名空间,Microsoft使一些常见的AD任务更容易,但如果这是其中之一,我会感到惊讶。

关于删除“域用户”组分配,在更改主要组之前,这是不可能的。

这是未经测试的伪代码,但我认为这样的事情会起作用。

// get the group
DirectoryEntry groupToAdd = new DirectoryEntry("LDAP://" + groupDistinguishedName);
// add the member
groupToAdd.Properties["member"].Add(userDistinguishedName);
// commit and close
groupToAdd.CommitChanges();
groupToAdd.Close();

您说您已经知道如何分配主要组,因此一旦完成并提交了主要组,您就可以删除“域用户”成员资格。

//Get the domain users
DirectoryEntry domainUsers = new DirectoryEntry("LDAP://" + domainUserDistinguishedName);
// Remove the user from the domain user group
domainUsers.Properties["member"].Remove(userDistinguishedName);
//Commit the changes
domainUsers.CommitChanges();
domainUsers.Close();

作为参考,这是C#overview中的一个不错的AD。希望这有帮助!

答案 2 :(得分:0)

此外,如果PowerShell是一个选项,this看起来几乎完全符合您的要求。