当我检索本地WinNT组的成员时,不知何故并没有返回所有成员。我添加了以下内容:
问题是:
- Active Directory用户
- Active Directory组
问题是:
- 添加的组发生了什么?
- 请参阅代码示例中的最后一个方法“GetMembers()”
- 这是已知问题吗?
- 是否有任何可用的解决方法?
string _domainName = @"MYDOMAIN";
string _basePath = @"WinNT://MYDOMAIN/myserver";
string _userName = @"MYDOMAIN\SvcAccount";
string _password = @"********";
void Main()
{
CreateGroup("lg_TestGroup");
AddMember("lg_TestGroup", @"m.y.username");
AddMember("lg_TestGroup", @"Test_DomainGroup");
GetMembers("lg_TestGroup");
}
// Method added for reference.
void CreateGroup(string accountName)
{
using (DirectoryEntry rootEntry = new DirectoryEntry(_basePath, _userName, _password))
{
DirectoryEntry newEntry = rootEntry.Children.Add(accountName, "group");
newEntry.CommitChanges();
}
}
// Add Active Directory member to the local group.
void AddMember(string groupAccountName, string userName)
{
string path = string.Format(@"{0}/{1}", _basePath, groupAccountName);
using (DirectoryEntry entry = new DirectoryEntry(path, _userName, _password))
{
userName = string.Format("WinNT://{0}/{1}", _domainName, userName);
entry.Invoke("Add", new object[] { userName });
entry.CommitChanges();
}
}
// Get all members of the local group.
void GetMembers(string groupAccountName)
{
string path = string.Format(@"{0}/{1}", _basePath, groupAccountName);
using (DirectoryEntry entry = new DirectoryEntry(path, _userName, _password))
{
foreach (object member in (IEnumerable) entry.Invoke("Members"))
{
using (DirectoryEntry memberEntry = new DirectoryEntry(member))
{
string accountName = memberEntry.Path.Replace(string.Format("WinNT://{0}/", _domainName), string.Format(@"{0}\", _domainName));
Console.WriteLine("- " + accountName); // No groups displayed...
}
}
}
}
更新 #1 群组成员的顺序似乎是至关重要的。一旦在 GetMembers() 中的枚举器遇到一个Active Directory group,剩余的项也不会被显示。因此,如果在这个例子中首先列出'Test_DomainGroup',GetMembers() 将不会显示任何内容。