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

我想知道是否有人知道如何通过C#以编程方式获得远程服务器上本地组的成员资格。 这是否需要pipe理员权限? 如果有,是否有任何方法来确认当前login的用户的成员(或不)这些组?

Howto:(几乎)通过C#的Active Directory中的所有内容都非常有帮助,还包括如何迭代组中的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

他们所做的示例应用程序:

替代文字

在.net 3.5中有一个叫做System.DirectoryServices.AccountManagement的新程序集,它比System.DirectoryServices提供了一个更清晰的实现。 多米尼克·拜尔博客介绍了几个简单的操作,包括检查一个组的成员:

 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); } 

我想我会用这个方法,但是谢谢你的建议! 🙂

也许这是可以通过WMI完成的事情?

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

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

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

出于几个原因,我们不想使用Windows身份验证,而是拥有自己的基于表单的身份验证。 我开发了下面的例程来首先验证用户,然后检查用户所属的所有组。 也许这可能有帮助。 该例程使用LogonUser进行身份验证,然后获取该用户的数字guid-like组标识(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; } }