通过C#确定本地组的成员

时间:2008-09-05 08:39:34

标签: c# .net windows networking

我想知道是否有人知道如何通过C#以编程方式获取远程服务器上本地组的成员资格。这需要管理员权限吗?如果是这样,有没有办法确认当前登录用户的成员资格(或没有)?

6 个答案:

答案 0 :(得分:4)

Howto: (Almost) Everything In Active Directory via C#非常有帮助,还包含有关如何在群组中迭代AD成员的说明。

public ArrayList Groups(string userDn, bool recursive)
{
    ArrayList groupMemberships = new ArrayList();
    return AttributeValuesMultiString("memberOf", userDn,
        groupMemberships, recursive);
}

您还需要此功能:

public ArrayList AttributeValuesMultiString(string attributeName,
     string objectDn, ArrayList valuesCollection, bool recursive)
{
    DirectoryEntry ent = new DirectoryEntry(objectDn);
    PropertyValueCollection ValueCollection = ent.Properties[attributeName];
    IEnumerator en = ValueCollection.GetEnumerator();

    while (en.MoveNext())
    {
        if (en.Current != null)
        {
            if (!valuesCollection.Contains(en.Current.ToString()))
            {
                valuesCollection.Add(en.Current.ToString());
                if (recursive)
                {
                    AttributeValuesMultiString(attributeName, "LDAP://" +
                    en.Current.ToString(), valuesCollection, true);
                }
            }
        }
    }
    ent.Close();
    ent.Dispose();
    return valuesCollection;
}

如果你现在想要使用这个AD方法,你可以使用本文中的信息,但它使用非托管代码:

http://www.codeproject.com/KB/cs/groupandmembers.aspx

他们制作的示例应用程序:

alt text

答案 1 :(得分:2)

看来在.net 3.5中有一个名为System.DirectoryServices.AccountManagement的新程序集,它提供了比System.DirectoryServices更清晰的实现。 Dominick Baier blogs about一些简单的操作,包括检查组的成员资格: -

public static bool IsUserInGroup(string username, string groupname, ContextType type)
{
    PrincipalContext context = new PrincipalContext(type);

    UserPrincipal user = UserPrincipal.FindByIdentity(
        context,
        IdentityType.SamAccountName,
        username);
    GroupPrincipal group = GroupPrincipal.FindByIdentity(
        context, groupname);

    return user.IsMemberOf(group);
}

我想我会用这种方法,但感谢你的建议! : - )

答案 2 :(得分:0)

也许这可以通过WMI完成?

答案 3 :(得分:0)

我问了一个类似的问题,最后编写了一个answer,它使用WMI来枚举小组成员。我在system.directoryservices.accountmanagement中遇到了身份验证方面的实际问题。当然是YMMV。

答案 4 :(得分:0)

如果完全管理System.DirectoryServices.AccountManagement,我会很好奇。我使用了System.DirectoryServices.ActiveDirectory,它是COM Interop的包装器,导致了许多令人头疼的问题...

答案 5 :(得分:0)

这可能会有所帮助。我不得不开发一个应用程序,我们想要对活动目录进行身份验证,并检查用户所在的组字符串。

由于几个原因,我们不想使用Windows身份验证,而是拥有自己的基于表单的身份验证。我开发了下面的例程,首先验证用户,然后检查用户所属的所有组。也许它可能有所帮助。例程使用LogonUser进行身份验证,然后获取该用户的类似guid的组ID(SID)列表,并将每个用户转换为人类可读的表单。

希望这有所帮助,我不得不从各种不同的谷歌搜索中综合这种方法。

private int validateUserActiveDirectory()
{
    IntPtr token = IntPtr.Zero;
    int DBgroupLevel = 0;

    // make sure you're yourself -- recommended at msdn http://support.microsoft.com/kb/248187
    RevertToSelf();

    if (LogonUser(txtUserName.Value, propDomain, txtUserPass.Text, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token) != 0) {
        // ImpersonateLoggedOnUser not required for us -- we are not doing impersonated stuff, but leave it here for completeness.
        //ImpersonateLoggedOnUser(token);
        // do impersonated stuff
        // end impersonated stuff

        // ensure that we are the original user
        CloseHandle(token);
        RevertToSelf();

        System.Security.Principal.IdentityReferenceCollection groups = Context.Request.LogonUserIdentity.Groups;
        IdentityReference translatedGroup = default(IdentityReference);

        foreach (IdentityReference g in groups) {
            translatedGroup = g.Translate(typeof(NTAccount));
            if (translatedGroup.Value.ToLower().Contains("desired group")) {
                inDBGroup = true;
                return 1;
            }
        }
    }
    else {
        return 0;
    }
}