如何使用PrincipalContext从Active Directory返回用户详细信息

时间:2013-07-14 16:48:01

标签: asp.net asp.net-mvc

我想创建一个新的操作方法,在调用它时将返回所有Active Directory用户名。 asp.net mvc应用程序和Active Directory位于同一个域中(当前位于同一个开发机器中)。

所以我定义了以下操作方法: -

public ViewResult Details()
        {
 var c = repository.GetUserDetails3();
return View("Details2",c); }

以及以下存储库方法: -

public DirectoryEntry GetUserDetails3()
{   
     DirectoryEntry de = new DirectoryEntry();

     using (var context = new PrincipalContext(ContextType.Domain, "WIN-SPDEV.com"))
     {
         using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
         {
             foreach (var result in searcher.FindAll())
             {
                 de = result.GetUnderlyingObject() as DirectoryEntry; 
             }
         }
     }
     return de; 
}

和以下模型类: -

public class DirectoryUser
    {public Nullable<Guid> Guid { get; set; }
        public string Name { get; set; }
        public string Username { get; set; }
}}

在视图上我有: -

@model IEnumerable<TMS.Models.DirectoryUser>

@{
    ViewBag.Title = "Details2";
}

<h2>Details2</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Guid)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Username)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Guid)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Username)
        </td>

但是当我调用action方法时出现以下错误: -

  

参数字典包含非可空类型

的参数“id”的空条目      

传递到字典中的模型项是类型的   'System.DirectoryServices.DirectoryEntry',但是这本字典   需要类型的模型项   'System.Collections.Generic.IEnumerable`1 [TMS.Models.DirectoryUser]'。

1 个答案:

答案 0 :(得分:1)

我不明白为什么要将新的PrincipalContext与旧的DirectoryEntry混合使用。没有任何意义.....

此外 - 您正在搜索所有用户,但最终,您只返回一个DirectoryEntry - 为什么?!

如果您正在使用新的PrincipalContext - 那么请使用UserPrincipal - 它包含关于用户的简单易用的属性 - 比旧的更容易使用和使用{1}} stuf ....

DirectoryEntry

public List<UserPrincipal> GetAllUsersDetails() { using (var context = new PrincipalContext(ContextType.Domain, "WIN-SPDEV.com")) using (var searcher = new PrincipalSearcher(new UserPrincipal(context))) { var searchResults = searcher.FindAll(); List<UserPrincipal> results = new List<UserPrincipal>(); foreach(Principal p in searchResults) { results.Add(p as UserPrincipal); } } } 类具有非常好的属性,如UserPrincipal(名字),GivenName等等 - 易于使用,强类型的属性。使用它们!

阅读所有关于这些新类以及如何在这里使用它们的信息: