基于AD的用户组织目录树选择工具的解决方案

基于AD的用户组织目录树选择工具的解决方案

2009-03-06 11:00 by Virus-BeautyCode, 1675 阅读, 5 评论, 收藏编辑

本文的需求来自进来SharePoint开发中的人员选择,基础中国的用户更加喜欢通过组织结构来选择人员,这样可以清晰的知道选择人员的部门,通过组织结构选择人员是本文的讨论点。

我也是集合了前人的思路,进行了整合,参考了下面的博客

基于AD的用户组织目录树选择工具的解决方案
http://blog.lickies.cn/Lists/Posts/Post.aspx?List=34201ce7%2Dcc0e%2D452a%2D949a%2Dffcf74a1780a&ID=31

asp.net(C#)弹出窗口返回值并刷新主窗体
http://blog.csdn.net/taoyinzhou/archive/2007/12/12/1930668.aspx

使用C#中的DirectorySearcher来获得活动目录中的组织结构与用户等信息,并在展示成树形结构(附源代码)
http://www.cnblogs.com/KingOfSoft/archive/2007/05/12/743693.html

感谢三位作者的无私奉献,为我的这篇博客提供了资料。

我的整个实现是由三个页面组成,首先是一个信息填写页面WebForm1.aspx,有一栏为选择任务的执行人员

WebForm1.aspx页面代码如下


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApp.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
    <style type="text/css">
        body
        { font-size:12px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table style="width: 100%;">
            <tr>
                <td style="width:100px;">
                    任务标题:</td>
                <td>
                    
                    <asp:TextBox ID="TextBox2" runat="server" Width="500px"></asp:TextBox>
                </td>
              
            </tr>
            <tr>
               <td style="width:100px;">
                    
                    任务内容:</td>
                <td>
                    
                    <asp:TextBox ID="TextBox3" runat="server" Height="117px" TextMode="MultiLine" 
                        Width="500px"></asp:TextBox>
                </td>
                
            </tr>
            <tr>
               <td style="width:100px;">
                   
                    代办人:</td>
                <td>
                   <asp:TextBox ID="TextBox1" runat="server" Width="500px">这是初始值,将被传递到新窗口。</asp:TextBox>
        
            <asp:Button ID="Button1" runat="server" Text="打开窗口" Width="96px" 
             onclick="Button1_Click" />
                </td>
               
            </tr>
        </table>
        
    </div>
    </form>
</body>
</html>

WebForm1.aspx的后台代码如下


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace WebApp
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!ClientScript. IsClientScriptBlockRegistered("clientScript"))
            {
                System.Text.StringBuilder sbScript = new System.Text.StringBuilder();
                sbScript.Append("<script>");
                sbScript.Append("function OpenWin(){");
                sbScript.Append(Environment.NewLine);
                sbScript.Append("var str=window.showModalDialog(‘WebForm2.aspx‘,document.form1.TextBox1.value,‘dialogWidth=800px;dialogHeight=700px‘,‘scroll:yes‘);");
                sbScript.Append(@"if(str!=null)
                    {
                        var users=str;
                        document.form1.TextBox1.value=users.substring(0,users.lastIndexOf(‘,‘));
                    }
                    ");
                sbScript.Append("}");
                sbScript.Append("</script>");
                ClientScript. RegisterClientScriptBlock(this.GetType(),"clientScript", sbScript.ToString());
            }
            Button1.Attributes.Add("onclick", "OpenWin()");
        }

protected void Button1_Click(object sender, EventArgs e)
        {

}
    }
}

弹出窗口如下图,是用一个页面,里面嵌套一个iframe,防止回发之后页面消失WebForm2.aspx嵌套ADOperTest.aspx

WebForm2.aspx页面文件,没有后台代码


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApp.WebForm2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title> <style type="text/css">
        body
        { font-size:12px;
        }
    </style>
</head>
  <body>
    <iframe src="ADOperTest.aspx" id="iframe1" width="1600px" height="1400px"></iframe>
  </body>
</html>
后台代码

ADOperTest.aspx 页面代码


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ADOperTest.aspx.cs" Inherits="WebApp.ADOperTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 <style type="text/css">
        body
        { font-size:12px;
        }
    </style>
    <title>无标题页</title>
</head>
<body id="MyBody" runat="server" ms_positioning="GridLayout">
    <form id="Form1" runat="server" method="post">
    <div>
    
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <input id="Hidden1" type="hidden" runat=server />
    </div>
    <table>
        <tr>
            <td>
                <fieldset>
                    <legend>组织单元</legend>
                    <div style="overflow: auto; height: 200px; width: 100px;">
                    <asp:TreeView ID="TreeView1" runat="server" 
                        onselectednodechanged="TreeView1_SelectedNodeChanged">
                    </asp:TreeView></div>
                </fieldset>
            </td>
            <td>
                <fieldset>
                    <legend>人员</legend>
                    <div style="overflow: auto; height: 200px; width: 100px;">
                    <asp:DataList ID="DataList1" runat="server">
                        <ItemTemplate>
                            <asp:CheckBox ID="CheckBox1" runat="server" Text= ‘<%# Eval("UserName") %>‘ />
                        </ItemTemplate>
                       
                    </asp:DataList>
                    </div>
                </fieldset>
            </td>
            <td>
                <fieldset>
                    <legend>操作</legend>
                     <div style="overflow: auto; height: 200px; width: 52px;" >
                    <asp:Button ID="btnAdd" runat="server" Text=">>" Width=50px onclick="btnAdd_Click" />
                    <br />
                    <br />
                         <asp:Button ID="btnDel"
                        runat="server" Text="<<"  Width=50px onclick="btnDel_Click"/>
                        </div>
                </fieldset>
            </td>
            <td>
                <fieldset>
                    <legend>选中的人员</legend>
                    <div style="overflow: auto; height: 200px; width:100px;">
                    <asp:DataList ID="DataList2" runat="server">
                        <ItemTemplate>
                            <asp:CheckBox ID="CheckBox2" runat="server" Text= ‘<%# Eval("UserName") %>‘ />
                        </ItemTemplate>
                       
                    </asp:DataList>
                    </div>
                </fieldset>
            </td>
        </tr>
    </table>
    
    <asp:Button ID="Button1" runat="server" Text="确定" onclick="Button1_Click" />
    
    </form>
</body>
</html>

ADOperTest.aspx.cs后台代码


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.DirectoryServices;
using System.DirectoryServices.ActiveDirectory;

namespace WebApp
{
    public partial class ADOperTest : System.Web.UI.Page
    {

protected void Page_Load(object sender, EventArgs e)
        {
            string vbCrLf = " ";
            if (!IsPostBack)
            {
                DirectoryEntry entry = new DirectoryEntry("LDAP://192.168.203.222", "administrator", "demo");
                DirectoryEntry ou = entry.Children.Find("OU=virus", "organizationalUnit");
                TreeNode ouTree = new TreeNode();
                getOUTree(ouTree, ou);
                TreeView1.Nodes.Add(ouTree);

DataList1.DataSource = null;
                DataList1.DataBind();
                DataList2.DataSource = null;
                DataList2.DataBind();
                Session["SelectedUsers"] = null;
            }

string strScript = "<script>" + vbCrLf;

strScript += @"function closewin(){
            var valuehiden=document.getElementById(‘Hidden1‘).value;
            window.parent.returnValue=valuehiden;" + vbCrLf;

strScript += "window.parent.close();}" + vbCrLf;
            strScript += "</script>" + vbCrLf;
            if (!ClientScript.IsClientScriptBlockRegistered("clientScript"))
                ClientScript.RegisterClientScriptBlock(this.GetType(), "clientScript", strScript);

Button1.Attributes.Add("onclick", "closewin()");
            MyBody.Attributes.Add("onload", "document.Form1.TextBox1.value=window.parent.dialogArguments");

}
        /// <summary>
        /// 加载公司组织结构
        /// </summary>
        /// <param name="ouTree"></param>
        /// <param name="entry"></param>
        private void getOUTree(TreeNode ouTree, DirectoryEntry entry)
        {

foreach (DirectoryEntry de in entry.Children)
            {
                if (!de.SchemaClassName.ToLower().Equals("user"))
                {
                    TreeNode ouChildNode = new TreeNode();
                    //ouChildNode.Text = de.Name+"|"+de.SchemaClassName;
                    ouChildNode.Text = de.Name.Substring(de.Name.IndexOf("=") + 1);
                    ouChildNode.Value = de.Name;
                    ouTree.ChildNodes.Add(ouChildNode);
                    if (de.Children != null)
                    {
                        getOUTree(ouChildNode, de);
                    }
                }
            }
        }
        /// <summary>
        /// 加载选中组织结构中的人员信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            TextBox1.Text = ((TreeView)sender).SelectedNode.Text;
            TreeNode node = ((TreeView)sender).SelectedNode;
            DataTable dt = new DataTable();
            dt.Columns.Add("UserName");
            DataRow dr;

DirectoryEntry entry = new DirectoryEntry("LDAP://192.168.203.222", "administrator", "demo");
            DirectorySearcher searcher = new DirectorySearcher();
            searcher.Filter = "objectClass=user";

DirectoryEntry ou = entry.Children.Find("OU=virus", "organizationalUnit");
            searcher.SearchRoot = ou;
            SearchResultCollection users = searcher.FindAll();

foreach (SearchResult sr in users)
            {
                if (sr.Path.Split(‘,‘)[1].ToLower().Equals(node.Value.ToLower()))
                {
                    dr = dt.NewRow();
                    //dr["UserName"] = sr.Path;
                    dr["UserName"] = sr.Properties["name"][0];
                    dt.Rows.Add(dr);
                }
            }

DataList1.DataSource = dt;
            DataList1.DataBind();

}
        /// <summary>
        /// 调整人员:添加人员
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnAdd_Click(object sender, EventArgs e)
        {
            DataTable dt;
            if (Session["SelectedUsers"] == null)
            {
                dt = new DataTable();
                dt.Columns.Add("UserName");
            }
            else
            {
                dt = (DataTable)Session["SelectedUsers"];
            }
            DataRow dr;
            bool isAdded = false;
            //Hidden1.Value = "";
            foreach (DataListItem item in DataList1.Items)
            {
                isAdded = ((CheckBox)item.FindControl("CheckBox1")).Checked;
                if (isAdded)
                {
                    //Hidden1.Value += ((CheckBox)item.FindControl("CheckBox1")).Text+",";

dr = dt.NewRow();
                    dr["UserName"] = ((CheckBox)item.FindControl("CheckBox1")).Text;
                    if (dt.Select("UserName=‘" + dr["UserName"].ToString() + "‘").Length == 0)
                        dt.Rows.Add(dr);
                    else
                        continue;
                }
            }

Session["SelectedUsers"] = dt;
            DataList2.DataSource = dt;
            DataList2.DataBind();
            getSelectedUsers();
        }
        private void getSelectedUsers()
        {
            bool isAdded = false;
            Hidden1.Value = "";
            foreach (DataListItem item in DataList2.Items)
            {

Hidden1.Value += ((CheckBox)item.FindControl("CheckBox2")).Text + ",";

}
        }
        protected void Button1_Click(object sender, EventArgs e)
        {

}
        /// <summary>
        /// 调整人员:删除选中人员
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDel_Click(object sender, EventArgs e)
        {
            bool isDeled = false;
            DataTable dt = (DataTable)Session["SelectedUsers"];
            foreach (DataListItem i in DataList2.Items)
            {
                isDeled = ((CheckBox)i.FindControl("CheckBox2")).Checked;
                if (isDeled)
                {
                    dt.Rows[i.ItemIndex].Delete();
                }
            }

DataList2.DataSource = dt;
            DataList2.DataBind(); getSelectedUsers();
        }

}
}



这个东西本来是SharePoint开发过程中出来的需求,可是返回的只是一个组合了用户姓名的字符串,不能变成SPUser对象,SPUser对象又没有构造函数,有没有研究过这个呢,如果有的话,可以给我留言,谢谢了。

时间: 2024-11-07 10:55:55

基于AD的用户组织目录树选择工具的解决方案的相关文章

python GUI编程tkinter示例之目录树遍历工具

摘录 python核心编程 本节我们将展示一个中级的tkinter应用实例,这个应用是一个目录树遍历工具:它会从当前目录开始,提供一个文件列表,双击列表中任意的其他目录,就会使得工具切换到新目录中,用新目录中的文件列表代替旧文件列表.这里新增了列表框.文本框和滚动条,此外还增加了鼠标单击.键盘按下.滚动操作等回调函数.其实,整个应用就是一系列控件和函数的组合. #python 3.6 import os from time import sleep from tkinter import * #

JAVA 通过LDAP获取AD域用户及组织信息

因为工作需求近期做过一个从客户AD域获取数据实现单点登录的功能,在此整理分享. 前提:用户可能有很多系统的情况下,为了方便账号的统一管理使用AD域验证登录,所以不需要我们的系统登录,就需要获取用户的AD域组织和用户信息,实现域认证和单点登录. LDAP: LDAP是轻量目录访问协议 AD域:微软基于域模式的集中化管理 1.常规的AD域登陆验证 LdapContext dc = null;             Hashtable<String, String> env = new Hasht

Android SDK目录结构和工具介绍

Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. AD: Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. Android SDK目录下有很多文件夹,主要都是干什么的呢? 1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会

sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。

//来源:http://www.cnblogs.com/lrforever/p/3695820.html 隐藏AD人员选择,$ad.IsVisible设置为true,则显示出AD里用户 $cpm = Get-SPClaimProviderManager  $ad = get-spclaimprovider -identity "AD" $ad.IsVisible = $false $cpm.Update()

计算目录树的深度-基于linq

生成word时,有时用户要求要生成所有级别的目录. 这个时候就需要计算目录树的深度.关于求树的深度,已有很多现成的算法.本文主要介绍一种linq的写法.代码看起来挺简洁的. public static int MenuDepth(List<Menu> menuList, int parentId) {    var children = menuList.Where(p => p.parentId == parentId);    if (children.Count() == 0) 

【专家坐堂Q&amp;A】在 petalinux-config 中选择外部来源时,可将符号链路添加内核来源目录树

问题描述 作为 petalinux-config 菜单的一部分,现在可以将 Linux 内核指定为外部来源. 如果选择了该选项,可为内核来源目录树添加两个符号链路. 这会带来两个问题: 1. 符号链路 oe-log 和 oe-workdir 指向该项目 PetaLinux 构建目录中的工作区域,这就意味着只有一个项目可以使用相同的外部来源. 如果一个二级项目使用相同的外部来源,这些符号链路就会被改变,指向不同的项目 2. 这些符号链路会按"git status"命令的一部分显示为无路径

Java使用LdAP获取AD域用户

随着我们的习大大上台后,国家在网络信息安全方面就有了很明显的改变!所以现在好多做网络信息安全产品的公司和需要网络信息安全的公司都会提到用AD域服务器来验证,这里就简单的研究了一下! 先简单的讲讲AD域和LdAP目录访问协议:AD(active directory)活动目录,动态的建立整个域模式网络中的对象的数据库或索引,协议为LDAP,安装了AD的服务器称为DC域控制器,存储整个域的对象的信息并周期性更新!其中的对象分为三大类--资源(如印表机).服务(如电子邮件).和人物(即帐户或用户,以及组

sharepoint 2013基于AD的Form表单登录(二)——form登录页面自定义

配置好了sharepoint 2013基于AD的Form登录,只是成功了第一步,如何自定义登录页呢?特别是不要出现sharepoint2013自带登录页面,每次登录前还需要选择是否是form或者windows验证. 打开vs2012新建sharepoint 2013 project,在layouts目录下添加application page,页面命名为CustomLogin.aspx. 前台页面:为避免母版页中其他控件影响,注意继承的是simple.master         后台页面:继承F

SharePoint 2013 配置基于AD的Form认证

前 言 配置SharePoint 2013基于AD的Form认证,主要有三步: 1. 修改管理中心的web.config: 2. 修改STS Application的web.config: 3. 修改Web应用程序的web.config并开启FBA: 首先,修改CA的web.config,一般在不知道端口号的时候(因为创建CA的时候,即使我们修改了端口号,创建后也会使用默认的那个,但是访问却使用我们填写的那个),我们选择在IIS中找到CA文件路径,如下图: 通常我们应该先进行web.config