C# 从Active Directory C显示缩略图照片#

C# 从Active Directory C显示缩略图照片#,c#,asp.net,active-directory,ldap,C#,Asp.net,Active Directory,Ldap,使用C#MVC 5从搜索中提取active directory中的数据。其中一个我需要它来拉缩略照片 因此,我的LDAP连接捕获初始数据,并成功地将缩略图转换为字节[],至少看起来像是调试完成的。然后,当我尝试将字节数组转换为图像时,我得到一个“参数无效”错误 这是我的控制器: [HttpPost] public ActionResult Index(string userName, string searchFilter) { /**********Establish Connec

使用C#MVC 5从搜索中提取active directory中的数据。其中一个我需要它来拉缩略照片

因此,我的LDAP连接捕获初始数据,并成功地将缩略图转换为字节[],至少看起来像是调试完成的。然后,当我尝试将字节数组转换为图像时,我得到一个“参数无效”错误

这是我的控制器:

  [HttpPost]
public ActionResult Index(string userName, string searchFilter)
{
    /**********Establish Connection********/
    DirectoryEntry dir = createDirectoryEntry();
    DirectorySearcher search = new DirectorySearcher(dir);
    /****Refer to class constructor****/


    /********Create the List to store results in***************/
    List<ADUser> Users = new List<ADUser>();
    string DisplayName = "", SAMAccountName = "", Mail = "", Description = "", Department = "", TelephoneNumber = "", Fax = "";
    byte[] ThumbnailPhoto;
    string searchFilters = searchFilter.ToString();
    /*******Filter parameters************/
    if (searchFilters == "1")
    {
        search.Filter = "(&(objectCategory=Person)(objectClass=User)(&(anr=" + userName + "* )(displayName=*)(sn=*)))";
        //(&(department=" + userName + "* )(displayName=*)(sn=*))(&(telephoneNumber=" + userName + " )(displayName=*)(sn=*))
    }
    else if (searchFilters == "2")
    {
        search.Filter = "(&(objectCategory=Person)(objectClass=User)(&(department=" + userName + "* )(displayName=*)(sn=*)))";
    }
    else if (searchFilters == "3")
    {
        search.Filter = "(&(objectCategory=Person)(objectClass=User)(&(telephoneNumber=" + userName + "* )(displayName=*)(sn=*)))";
    }
    SearchResultCollection searchresult = search.FindAll();
    search.PropertiesToLoad.Add("Displayname");
    search.PropertiesToLoad.Add("SAMAccountName");
    search.PropertiesToLoad.Add("Mail");
    search.PropertiesToLoad.Add("Description");
    search.PropertiesToLoad.Add("TelephoneNumber");
    search.PropertiesToLoad.Add("Fax");
    search.PropertiesToLoad.Add("Department");
    search.PropertiesToLoad.Add("thumbnailPhoto");
    /*****************Filtering and populating the List****************/

    if (searchresult != null)
    {
        foreach (SearchResult iResult in searchresult)
        {
            ADUser userAttributes = new ADUser("", "", "", "", "", "", "", null);

            foreach (string PropertyName in iResult.Properties.PropertyNames)
            {
                foreach (Object key in iResult.GetDirectoryEntry().Properties[PropertyName])
                {
                    try
                    {


                        switch (PropertyName.ToUpper())
                        {
                            case "DISPLAYNAME":
                                DisplayName = key.ToString();
                                userAttributes.Name = DisplayName;
                                break;

                            case "SAMACCOUNTNAME":
                                SAMAccountName = key.ToString();
                                userAttributes.DomainUserName = SAMAccountName;
                                break;

                            case "MAIL":
                                Mail = key.ToString();
                                userAttributes.EmailAddress = Mail;
                                break;

                            case "DESCRIPTION":
                                Description = key.ToString();
                                userAttributes.JobDescription = Description;
                                break;

                            case "TELEPHONENUMBER":
                                TelephoneNumber = key.ToString();
                                userAttributes.TelephoneNumber = TelephoneNumber;
                                break;

                            case "FAX":
                                Fax = key.ToString();
                                userAttributes.FaxNumber = Fax;
                                break;

                            case "DEPARTMENT":
                                Department = key.ToString();
                                userAttributes.Department = Department;
                                break;

                            case "THUMBNAILPHOTO":
                                BinaryFormatter bf = new BinaryFormatter();
                                MemoryStream ms = new MemoryStream();
                                bf.Serialize(ms, key);

                                ThumbnailPhoto = ms.ToArray();
                                userAttributes.ThumbnailPhoto = ThumbnailPhoto;
                                break;
                        }
                    }
                    catch
                    {

                    }
                }
            }

            Users.Add(userAttributes);
        }

        return View(Users);
    }

    return View();
}
现在是我的观点

@model List<webby.Helpers.ADUser>
@using System.Drawing;
@{
    ViewBag.Title = "Directory";
}

<div class="container">
    <div class="col-md-7 col-md-offset-3">
        <h3>Directory</h3>
        <p>
            Here you will be able to search through the directory to find people that you are looking for.
            You can search by the person's name, their department or by their location.
        </p>
        <p>
            For a printable version please <a href="/Content/PDF/internal_telephone_directory.pdf" target="_blank">click here.</a>
        </p>

        @using (Html.BeginForm("Index", "Directory", FormMethod.Post))
        {
            <p>
                Search Employee: @Html.TextBox("userName")<br />
                <input type="radio" name="searchFilter" id="rdUser" value="1" checked />
                By User
                @*<input type="radio" name="searchFilter" id="rdDept" value="2" />
                    By Department
                    <input type="radio" name="searchFilter" id="rdExt" value="3" />
                    By Extension<br />*@
                <input type="submit" value="Search" class="btn btn-default" />
            </p>
        }

        @using (Html.BeginForm("Index", "Directory", FormMethod.Get))
        {
            <p>
                <input type="submit" value="Clear" class="btn btn-default" />
            </p>
        }


        <table class="table">
            @if (Model != null)
            {
                foreach (var item in Model)
                {
                    <tr onmouseover="this.style.backgroundColor = '#f3f3f3';" onmouseout="    this.style.backgroundColor = '#fff';">
                        <td>
                            @Html.DisplayFor(modelItem => item.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.TelephoneNumber)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.EmailAddress)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Department)
                        </td>
                        <td>
                            @if (item.ThumbnailPhoto != null)
                            {

                                using (MemoryStream s = new MemoryStream(item.ThumbnailPhoto))
                                {
                                    s.Seek(0, SeekOrigin.Begin);
                                    Bitmap.FromStream(s);
                                }

                            }
                        </td>
                        @*<td>
                                @Html.ActionLink("Details", "Details")
                            </td>*@
                    </tr>
                }
            }
        </table>

    </div>

</div>
@型号列表
@使用系统图;
@{
ViewBag.Title=“目录”;
}
目录

在这里,您将能够搜索目录,找到您正在寻找的人。
您可以按此人的姓名、所在部门或位置进行搜索。

如需可打印版本,请

@使用(Html.BeginForm(“Index”,“Directory”,FormMethod.Post)) { 搜索员工:@Html.TextBox(“用户名”)
按用户 @* 按部门 顺理成章地说
*@

} @使用(Html.BeginForm(“Index”,“Directory”,FormMethod.Get)) {

} @如果(型号!=null) { foreach(模型中的var项目) { @DisplayFor(modelItem=>item.Name) @DisplayFor(modelItem=>item.TelephoneNumber) @DisplayFor(modelItem=>item.EmailAddress) @DisplayFor(modelItem=>item.Department) @如果(item.ThumbnailPhoto!=null) { 使用(MemoryStream s=新的MemoryStream(item.ThumbnailPhoto)) { s、 Seek(0,SeekOrigin.Begin); 位图.FromStream(s); } } @* @ActionLink(“详细信息”、“详细信息”) *@ } }
任何想法都将不胜感激。干杯


编辑:它是十六进制格式的0x00,这与此有关吗?

使用LDAP时,我以base64格式存储小图片。是的-它需要更多的空间,但解析速度非常快,我没有这样的问题。
Bitmap.FromStream
在分配FromStream之前,您不应该先创建一个新的Bitmap实例吗我只是想知道这里的区别是什么,这里有一个
的帖子,你也可以看看它,它可能会帮助你朝着正确的方向前进。我尝试创建一个新实例,不走运:(你找到答案了吗?我自己解决了。当图像转换为base64字符串时,它转换了一些额外的信息。我将前9个字符(或更多,不记得了)进行了子字符串,然后它就工作了。
@model List<webby.Helpers.ADUser>
@using System.Drawing;
@{
    ViewBag.Title = "Directory";
}

<div class="container">
    <div class="col-md-7 col-md-offset-3">
        <h3>Directory</h3>
        <p>
            Here you will be able to search through the directory to find people that you are looking for.
            You can search by the person's name, their department or by their location.
        </p>
        <p>
            For a printable version please <a href="/Content/PDF/internal_telephone_directory.pdf" target="_blank">click here.</a>
        </p>

        @using (Html.BeginForm("Index", "Directory", FormMethod.Post))
        {
            <p>
                Search Employee: @Html.TextBox("userName")<br />
                <input type="radio" name="searchFilter" id="rdUser" value="1" checked />
                By User
                @*<input type="radio" name="searchFilter" id="rdDept" value="2" />
                    By Department
                    <input type="radio" name="searchFilter" id="rdExt" value="3" />
                    By Extension<br />*@
                <input type="submit" value="Search" class="btn btn-default" />
            </p>
        }

        @using (Html.BeginForm("Index", "Directory", FormMethod.Get))
        {
            <p>
                <input type="submit" value="Clear" class="btn btn-default" />
            </p>
        }


        <table class="table">
            @if (Model != null)
            {
                foreach (var item in Model)
                {
                    <tr onmouseover="this.style.backgroundColor = '#f3f3f3';" onmouseout="    this.style.backgroundColor = '#fff';">
                        <td>
                            @Html.DisplayFor(modelItem => item.Name)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.TelephoneNumber)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.EmailAddress)
                        </td>
                        <td>
                            @Html.DisplayFor(modelItem => item.Department)
                        </td>
                        <td>
                            @if (item.ThumbnailPhoto != null)
                            {

                                using (MemoryStream s = new MemoryStream(item.ThumbnailPhoto))
                                {
                                    s.Seek(0, SeekOrigin.Begin);
                                    Bitmap.FromStream(s);
                                }

                            }
                        </td>
                        @*<td>
                                @Html.ActionLink("Details", "Details")
                            </td>*@
                    </tr>
                }
            }
        </table>

    </div>

</div>