我很难过..
我正在尝试从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()
答案 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浏览器(商业+试用版)来正确连接字符串。