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

Posted

技术标签:

【中文标题】通过 C# 确定本地组的成员【英文标题】:Determining members of local groups via C# 【发布时间】:2010-09-07 21:48:57 【问题描述】:

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

【问题讨论】:

Enumerate Windows user group members on remote system using c# 的可能重复项 【参考方案1】:

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

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

【讨论】:

本地组是服务器本地的;它们不存储在 AD 中。虽然他们可能包括 AD 用户和/或组作为成员。 这个答案显示了一种枚举 AD 用户而不是本地计算机组的方法。【参考方案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);

我想我会使用这种方法,不过感谢您的建议! :-)

【讨论】:

【参考方案3】:

也许这可以通过 WMI 完成?

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我很好奇 System.DirectoryServices.AccountManagement 是否是完全托管的。我使用了 System.DirectoryServices.ActiveDirectory,它是 COM 互操作的包装器,它导致了许多令人头疼的问题......

【讨论】:

【参考方案6】:

这可能会有所帮助。我必须开发一个应用程序,我们要在其中对 Active Directory 进行身份验证,并检查用户所在的组字符串。

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

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

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;
    

【讨论】:

以上是关于通过 C# 确定本地组的成员的主要内容,如果未能解决你的问题,请参考以下文章

使用 c# 枚举远程系统上的 Windows 用户组成员

确定Vista中本地Administrators组的名称

在 C# 中强制转换基数组的派生成员

网络层IGMP协议

组播之IGMP(2)

11.在Windows系统中内置组中啥组的成员有权限管理用户帐户