zoukankan      html  css  js  c++  java
  • AD操作类[修改版]

    存在的问题,给AD用户增加一个新属性提示错误“指定的目录服务属性或服务不存在”,哪位高人知道,请指点?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.DirectoryServices;

    namespace Yesun.Edzh.Util
    {
        /// <summary>
        /// 操作AD
        /// </summary>
        public class AD
        {
            private string _domainADsPath;
            private string _username;
            private string _password;

            public static string TYPE_ORGANIZATIONALUNIT = "organizationalUnit";
            public static string TYPE_GROUP = "group";
            public static string TYPE_USER = "user";

            /// <summary>
            /// 构造
            /// </summary>
            /// <param name="server"></param>
            /// <param name="path"></param>
            public AD(string domainADsPath, string username, string password)
            {
                this._domainADsPath = domainADsPath;
                this._username = username;
                this._password = password;
            }

            /// <summary>
            /// 读取用户
            /// </summary>
            /// <param name="domainADsPath"></param>
            /// <param name="username"></param>
            /// <param name="password"></param>
            /// <param name="schemaClassNameToSearch"></param>
            /// <returns></returns>
            public DataTable GetUserList(string schemaClassNameToSearch)
            {
                SearchResultCollection results = ExecuteAD(schemaClassNameToSearch);
                DataTable dt = GetUserList(results);
                results.Dispose();
                return dt;
            }

            /// <summary>
            /// 给用户绑定RFID
            /// </summary>
            /// <param name="username"></param>
            /// <param name="rfid"></param>
            public void BindRfIdToADUser(string username, string rfid)
            {
                DirectoryEntry entry = ExecuteAD(TYPE_USER, username);
                if (entry != null)
                {
                    //需要判断卡号是否存在
                    SearchResultCollection results = ExecuteAD(TYPE_USER);
                    foreach (SearchResult result in results)
                    {
                        string adPath = result.Path;
                        if (adPath.IndexOf("/") < 0)
                            continue;
                        DirectoryEntry tmpEntry = result.GetDirectoryEntry();
                        if (tmpEntry.Properties["Comment"].Count > 0 && tmpEntry.Properties["Comment"][0].ToString() == rfid)
                        {
                            //卡号已经存在
                            throw new Exception("此卡号已经绑定到员工[" + tmpEntry.Properties["name"][0].ToString() + "]");
                        }
                    }

                    //更新
                    SetProperty(entry, "Comment", rfid); //Comment 值作为RFID卡号
                    entry.CommitChanges();

                }
            }

            /// <summary>
            /// 通过rfid读取AD用户信息
            /// </summary>
            /// <param name="rfid"></param>
            /// <returns></returns>
            public DirectoryEntry GetDirectoryEntryByRFID(string rfid)
            {
                SearchResultCollection results = ExecuteAD(TYPE_USER);
                foreach (SearchResult result in results)
                {
                    string adPath = result.Path;
                    if (adPath.IndexOf("/") < 0)
                        continue;
                    DirectoryEntry tmpEntry = result.GetDirectoryEntry();
                    if (tmpEntry.Properties["Comment"].Count > 0 && tmpEntry.Properties["Comment"][0].ToString() == rfid)
                    {
                        return result.GetDirectoryEntry();
                    }
                }
                return null;
            }

            /// <summary>
            /// 读取用户
            /// </summary>
            /// <param name="results"></param>
            /// <returns></returns>
            public DataTable GetUserList(SearchResultCollection results)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("rfid", typeof(string));
                dt.Columns.Add("username", typeof(string));
                dt.Columns.Add("password", typeof(string));
                dt.Columns.Add("path", typeof(string));
                dt.Columns.Add("displayname", typeof(string));
                dt.Columns.Add("samaccountname", typeof(string));
                dt.Columns.Add("mail", typeof(string));

               
                if (results.Count == 0)
                    throw new Exception("域中没有任何用户");
                else
                {
                    foreach (SearchResult result in results)
                    {
                        string adPath = result.Path;
                        if (adPath.IndexOf("/") < 0)
                            continue;
                        DirectoryEntry entry = result.GetDirectoryEntry();
                        if (entry != null)
                        {
                            DataRow dr = dt.NewRow();
                            if (entry.Properties["name"].Count > 0)
                                dr["username"] = entry.Properties["name"][0].ToString();
                            if (entry.Properties["samaccountname"].Count > 0)
                                dr["samaccountname"] = entry.Properties["sAMAccountName"][0].ToString();
                            if (entry.Properties["Comment"].Count > 0)
                                dr["rfid"] = entry.Properties["Comment"][0].ToString();//暂时用这个来作为RFID
                            if (entry.Properties["displayname"].Count > 0)
                                dr["displayname"] = entry.Properties["displayname"][0].ToString();
                            if (entry.Properties["mail"].Count > 0)
                                dr["mail"] = entry.Properties["mail"][0].ToString();
                            dt.Rows.Add(dr);
                        }
                    }
                }
                return dt;
            }

            /// <summary>
            /// 读取组
            /// </summary>
            /// <param name="domainADsPath"></param>
            /// <param name="username"></param>
            /// <param name="password"></param>
            /// <param name="schemaClassNameToSearch"></param>
            /// <returns></returns>
            public DataTable GetGroupList(string schemaClassNameToSearch)
            {
                SearchResultCollection results = ExecuteAD(schemaClassNameToSearch);
                DataTable dt = GetGroupList(results);
                results.Dispose();
                return dt;
            }

     

            /// <summary>
            /// 读取组
            /// </summary>
            /// <param name="results"></param>
            /// <returns></returns>
            public DataTable GetGroupList(SearchResultCollection results)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("rfid", typeof(string));
                dt.Columns.Add("username", typeof(string));
                dt.Columns.Add("password", typeof(string));
                dt.Columns.Add("path", typeof(string));
                dt.Columns.Add("displayname", typeof(string));
                dt.Columns.Add("samaccountname", typeof(string));
                dt.Columns.Add("mail", typeof(string));
                if (results.Count == 0)
                    throw new Exception("域中没有任何组织结构");
                else
                {
                    foreach (SearchResult result in results)
                    {
                        if (result.Path.IndexOf("OU=用户") < 0)
                            continue;
                        ResultPropertyCollection propColl = result.Properties;
                        DataRow dr = dt.NewRow();
                        dr["name"] = propColl["name"][0].ToString();
                        //TODO
                    }
                }
                return dt;
            }

            /// <summary>
            /// 从AD中读取数据
            /// </summary>
            /// <param name="schemaClassNameToSearch"></param>
            /// <returns></returns>
            public SearchResultCollection ExecuteAD(string schemaClassNameToSearch)
            {
                DirectorySearcher searcher = new DirectorySearcher();
                searcher.SearchRoot = new DirectoryEntry(_domainADsPath, _username, _password);
                searcher.Filter = "(objectClass=" + schemaClassNameToSearch + ")";
                searcher.SearchScope = SearchScope.Subtree;
                searcher.Sort = new SortOption("name", SortDirection.Ascending);
                searcher.PageSize = 512;

                //指对范围内的属性进行加载,以提高效率
                searcher.PropertiesToLoad.AddRange(new string[] { "name", "Path", "displayname", "samaccountname", "mail", "Comment" });
                SearchResultCollection results = searcher.FindAll();
                return results;
            }


            /// <summary>
            /// 从AD中读取数据
            /// </summary>
            /// <returns></returns>
            public DirectoryEntry ExecuteAD(string schemaClassNameToSearch, string cn)
            {
                DirectorySearcher searcher = new DirectorySearcher();
                searcher.SearchRoot = new DirectoryEntry(_domainADsPath, _username, _password, AuthenticationTypes.Delegation);
                searcher.Filter = "(&(objectClass=" + schemaClassNameToSearch + ")(cn=" + cn + "))";
                searcher.SearchScope = SearchScope.Subtree;
                searcher.Sort = new SortOption("name", SortDirection.Ascending);
                searcher.PageSize = 512;

                //指对范围内的属性进行加载,以提高效率
                searcher.PropertiesToLoad.AddRange(new string[] { "name", "Path", "displayname", "samaccountname", "mail", "Comment" });
               
                SearchResult result = searcher.FindOne();
                DirectoryEntry entry = result.GetDirectoryEntry();
                return entry;
            }

            /// <summary>
            /// 设置属性,如果不存在此属性,可以创建
            /// </summary>
            /// <param name="entry"></param>
            /// <param name="propertyName"></param>
            /// <param name="propertyValue"></param>
            public static void SetProperty(DirectoryEntry entry, string propertyName, string propertyValue)
            {
                if (!string.IsNullOrEmpty(propertyValue))
                {
                    if (entry.Properties.Contains(propertyName))
                    {
                        entry.Properties[propertyName][0] = propertyValue;
                    }
                    else
                    {
                        entry.Properties[propertyName].Add(propertyValue);
                    }
                }
            }

            /// <summary>
            /// 读取属性
            /// </summary>
            /// <param name="entry"></param>
            /// <param name="propertyName"></param>
            /// <returns></returns>
            public static string GetProperty(DirectoryEntry entry, string propertyName)
            {
                if (entry.Properties.Contains(propertyName))
                    return entry.Properties[propertyName][0].ToString();
                else
                    return String.Empty;
            }
        }

    }

  • 相关阅读:
    NoSql
    事务简介
    c#批量插入
    SqlServer中获取所有数据库,所有表,所有字段
    企业需要k2来解放孤岛危机
    路在何方?移动互联网浪潮下房地产转型之路探讨
    卡斯柯经验谈│流程驱动项目管理的应用
    【干货来了】2014年K2房地产IT分享峰会
    【快报】基于K2 BPM的新一代协同办公门户实践交流会
    元祖签约K2 BPM,引领绿色健康食品!
  • 原文地址:https://www.cnblogs.com/yesun/p/1051709.html
Copyright © 2011-2022 走看看