尝试从AD检索userPrincipalName时索引超出范围

时间:2011-05-10 01:59:00

标签: c# asp.net

我很难过..

我正在尝试从AD获取userPrincipalName,如下所示:

DirectorySearcher search = new DirectorySearcher("LDAP://DCHS");
search.Filter = String.Format("(SAMAccountName={0})", UserName);
SearchResult result = search.FindOne();    
DirectoryEntry entry = result.GetDirectoryEntry();
_UPN = entry.Properties["userPrincipalName"][0].ToString();

但是这给了我:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

谁能告诉我为什么会这样?

编辑: 此代码获取当前用户的SSID。我需要对输入文本框的任何用户进行此操作。

WindowsIdentity windowsId = new WindowsIdentity(WindowsIdentity.GetCurrent().Token);
_SSID = windowsId.User.ToString()

3 个答案:

答案 0 :(得分:1)

我认为问题是因为您将userPrincipalName条目视为值数组。尝试按如下方式修改代码:

DirectorySearcher search = new DirectorySearcher("LDAP://DCHS");
search.Filter = String.Format("(SAMAccountName={0})", UserName);
SearchResult result = search.FindOne();    
DirectoryEntry entry = result.GetDirectoryEntry();
_UPN = entry.Properties["userPrincipalName"].Value.ToString();

请注意,我将最后一行从[0]更改为Value。这应该可以解决你的问题。

我要说的一件事是我会在尝试读取此值之前进行一些检查。在某些情况下,用户不会拥有UPN。在这种情况下,当您尝试访问该字段时,代码会抛出错误(该字段不存在,因此您不需要确保它不为空)。

答案 1 :(得分:1)

如果您使用的是.NET 3.5及更高版本,则应查看System.DirectoryServices.AccountManagement(S.DS.AM)命名空间。在这里阅读所有相关内容:

Managing Directory Security Principals in the .NET Framework 3.5

基本上,您可以定义域上下文并轻松在AD中查找用户和/或组:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find user by name
UserPrincipal user = UserPrincipal.FindByIdentity(UserName);

if(user != null)
{
    string upn = user.UserPrincipalName;
}

新的S.DS.AM使得在AD中使用用户和群组变得非常容易:

答案 2 :(得分:0)

要避免异常(如果这是有效的)要做的显而易见的事情是

if (entry.Properties["userPrincipalName"].Count > 0)
{
    _UPN = entry.Properties["userPrincipalName"][0].ToString();
}

但是如果你应该得到一个有效的结果而你不是那么我会检查LDAP连接字符串等。您可以使用一些LDAP浏览器(商业+试用版)来正确连接字符串。