.net 是否从Active Directory获取所有用户?
我有以下代码:.net 是否从Active Directory获取所有用户?,.net,active-directory,.net,Active Directory,我有以下代码: DirectoryEntry directoryEntry = default(DirectoryEntry); // Binding object. DirectoryEntry objGroupEntry = default(DirectoryEntry); // Group Results. DirectorySearcher objSearchADAM = default(Director
DirectoryEntry directoryEntry = default(DirectoryEntry);
// Binding object.
DirectoryEntry objGroupEntry = default(DirectoryEntry);
// Group Results.
DirectorySearcher objSearchADAM = default(DirectorySearcher);
// Search object.
SearchResultCollection objSearchResults = default(SearchResultCollection);
// Binding path.
ActiveDirectory result = new ActiveDirectory();
ActiveDirectoryItem treeNode;
string adServer = ADTestProject.Properties.Settings.Default.Server;
string adDomain = ADTestProject.Properties.Settings.Default.Domain;
string adUsername = ADTestProject.Properties.Settings.Default.AdiminUsername;
string password = ADTestProject.Properties.Settings.Default.Password;
string[] dc = adDomain.Split('.');
string dcAdDomain = string.Empty;
foreach (string item in dc)
{
if (dc[dc.Length - 1].Equals(item))
dcAdDomain = dcAdDomain + "DC=" + item;
else
dcAdDomain = dcAdDomain + "DC=" + item + ",";
}
// Get the AD LDS object.
if (pathToAD.Length > 0)
directoryEntry = new DirectoryEntry("LDAP://" + adServer + "/CN=Users," + dcAdDomain, adUsername, password);
else
directoryEntry = new DirectoryEntry();
DirectorySearcher ds = new DirectorySearcher(directoryEntry);
ds.SearchScope = SearchScope.Subtree;
ds.Filter = "(&(objectClass=group))";
objSearchResults = ds.FindAll();
然后这个:
if (objSearchResults.Count != 0)
{
foreach (SearchResult objResult in objSearchResults)
{
objGroupEntry = objResult.GetDirectoryEntry();
result.ActiveDirectoryTree.Add(new ActiveDirectoryItem()
{ Id = objGroupEntry.Guid,
ParentId = objGroupEntry.Parent.Guid,
AccountName = objGroupEntry.Name,
Type = ActiveDirectoryType.Group,
PickableNode = false
});
foreach (object child in objGroupEntry.Properties["member"])
{
treeNode = new ActiveDirectoryItem();
var path = child.ToString().Replace;
using (var memberEntry = new DirectoryEntry(path))
{
if (memberEntry.Username != null && memberEntry.SchemaEntry.Name.CompareTo("group") != 0
&& memberEntry.Properties.Contains("sAMAccountName") && memberEntry.Properties.Contains("objectSid"))
{
treeNode.Id = Guid.NewGuid();
treeNode.ParentId = objGroupEntry.Guid;
treeNode.AccountName = memberEntry.Properties["sAMAccountName"][0].ToString();
treeNode.Type = ActiveDirectoryType.User;
treeNode.PickableNode = true;
treeNode.FullName = memberEntry.Properties["Name"][0].ToString();
byte[] sidBytes = (byte[])memberEntry.Properties["objectSid"][0];
treeNode.ObjectSid = new System.Security.Principal.SecurityIdentifier(sidBytes, 0).ToString();
result.ActiveDirectoryTree.Add(treeNode);
}
}
}
}
}
Child.ToString可能如下所示:
CN=S-1-5-18,CN=ForeignSecurityPrincipals,DC=MyDomain,DC=local
问题是memberEntry在其属性上有很多异常?为什么?
例外情况如下:
“memberEntry.Name”引发了类型为的异常
“System.Runtime.InteropServices.COMException”字符串
{System.Runtime.InteropServices.COMException}-未指定错误
-2147467259
Stacktrace:在
System.DirectoryServices.DirectoryEntry.Bind(布尔throwIfFail)位于System.DirectoryServices.DirectoryEntry.Bind()处 System.DirectoryServices.DirectoryEntry.get_Name()
这可能是一个复制品 但是,尽管如此,还是有一篇文章描述了许多有用的信息
关于广告的查询这可能是 但是,尽管如此,还是有一篇文章描述了许多有用的信息
与OP聊天后,我们确定问题出在
目录条目中使用的路径
变量中,OP环境中需要显式身份验证
相关变化如下:
using (var memberEntry = new DirectoryEntry(path))
到
有关详细信息:与OP聊天后,我们确定问题出在目录条目中使用的路径
变量中,OP的环境中需要显式身份验证
相关变化如下:
using (var memberEntry = new DirectoryEntry(path))
到
有关详细信息:catch(异常e){throw e;}
-有点毫无意义,您失去了整个调用堆栈。使用throw代码>改为或清除整个try\catch块。是的,您是正确的,尚未清理代码。感谢您没有提到您得到的确切异常,我们只能在这里猜测,但可能并非所有对象都定义了Name
属性?您无条件地获得它,这可能会导致问题。我已更新了例外。我在所有30个项目上都得到了这个(异常)?这是COM错误0x80004005:查找失败。因此,在它们中的任何一个上都找不到Name属性(或者由于权限的原因,您无法读取它)-您是否尝试过使用ADSI检查属性的存在?catch(Exception e){throw e;}
-有点毫无意义,您失去了整个调用堆栈。使用throw代码>改为或清除整个try\catch块。是的,您是正确的,尚未清理代码。感谢您没有提到您得到的确切异常,我们只能在这里猜测,但可能并非所有对象都定义了Name
属性?您无条件地获得它,这可能会导致问题。我已更新了例外。我在所有30个项目上都得到了这个(异常)?这是COM错误0x80004005:查找失败。因此,在它们中的任何一个上都找不到Name属性(或者由于权限的原因,您无法读取它)-您是否尝试过使用ADSI检查该属性的存在?我认为这两个属性并不相似。link中的问题是如何吸引用户。这里的问题是查找失败,OP必须找出原因。我认为两者并不相似。link中的问题是如何吸引用户。这里的问题是查找失败,OP必须找出原因。