通过C#确定本地组的成员
我想知道是否有人知道如何通过C#以编程方式获取远程服务器上本地组的成员身份。这需要管理员权限吗?如果可以,是否有任何方法可以确认(或者不确认)这些组的当前登录用户身份?
解决方案
回答
也许这可以通过WMI来完成?
回答
如何:(几乎)通过Cis在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更干净的实现。 Dominick Baier的博客中涉及几个简单的操作,包括检查组的成员资格:-
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来枚举组成员。我在system.directoryservices.accountmanagement内容中对身份验证存在真正的问题。 YMMV,当然。
回答
我很好奇System.DirectoryServices.AccountManagement是否已完全管理。我用过System.DirectoryServices.ActiveDirectory,它是COM Interop的包装器,导致了很多麻烦……
回答
这可能会有所帮助。我必须开发一个应用程序,在该应用程序中我们要针对活动目录进行身份验证,还要检查用户所在的组字符串。
由于几个原因,我们不想使用Windows身份验证,而是拥有我们自己的基于表单的身份验证。我在下面开发了例程,以首先对用户进行身份验证,其次检查用户所属的所有组。也许有帮助。该例程使用LogonUser进行身份验证,然后获取该用户的类似于数字guid的组ID(SID)的列表,并将每个ID转换为人类可读形式。
希望这会有所帮助,我不得不从各种不同的Google搜索中综合使用这种方法。
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; } }