C# 通过C确定本地组的成员#
我想知道是否有人知道如何通过C#以编程方式获得远程服务器上本地组的成员资格。这需要管理员权限吗?如果是这样的话,有没有办法确认当前登录用户是否是这些组的成员?也许这是可以通过WMI来完成的?非常有用,还包括如何在组中迭代广告成员的说明C# 通过C确定本地组的成员#,c#,.net,windows,networking,C#,.net,Windows,Networking,我想知道是否有人知道如何通过C#以编程方式获得远程服务器上本地组的成员资格。这需要管理员权限吗?如果是这样的话,有没有办法确认当前登录用户是否是这些组的成员?也许这是可以通过WMI来完成的?非常有用,还包括如何在组中迭代广告成员的说明 public ArrayList Groups(string userDn, bool recursive) { ArrayList groupMemberships = new ArrayList(); return AttributeValue
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方法,可以使用本文中的信息,但它使用非托管代码:
他们制作的示例应用程序:
在.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枚举组成员的应用程序。我在system.directoryservices.accountmanagement中的身份验证方面遇到了实际问题。当然是YMMV。我想知道System.DirectoryServices.AccountManagement是否得到完全管理。我使用过System.DirectoryServices.ActiveDirectory,它是COM互操作的包装,这导致了许多麻烦…这可能会有所帮助。我必须开发一个应用程序,我们要根据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;
}
}
本地组是服务器的本地组;它们不存储在AD中。尽管它们可能包括AD用户和/或组作为成员。此答案显示了枚举AD用户而不是本地计算机组的一种方法。可能存在重复的