Ad域身份验证总结

活动目录(Active Directory)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务。(Active Directory不能运行在Windows Web Server上,但是可以通过它对运行Windows Web Server的计算机进行管理。)Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。Microsoft Active Directory 服务是Windows 平台的核心组件,它为用户管理网络环境各个组成要素的标识和关系提供了一种有力的手段。
人们经常将数据存储作为目录的代名词。目录包含了有关各种对象 [例如用户、用户组、计算机、域、组织单位(OU)以及安全策略]
的信息。这些信息可以被发布出来,以供用户和管理员的使用。目录存储在被称为域控制器的服务器上,并且可以被网络应用程序或者服务所访问。一个域可能拥有一台以上的域控制器。每一台域控制器都拥有它所在域的目录的一个可写副本。对目录的任何修改都可以从源域控制器复制到域、域树或者森林中的其它域控制器上。由于目录可以被复制,而且所有的域控制器都拥有目录的一个可写副本,所以用户和管理员便可以在域的任何位置方便地获得所需的目录信息
实例操作:()

.Net提供了专用类操作AD,本文详细介绍使用C#操作AD的方法。(转自:http://www.cnblogs.com/dragonwlb/archive/2012/08/06/2625474.html)

一、系统环境

系统环境:Windows Server 2008 R2, VS2010, .Net Framework 4.0

AD Server:LDAP的server IP

基本DN:OU=user,DC=Company,DC=com

用来登录的管理员:Peter

密码:ab#CD%1234

二、程序

1.  引用

.Net操作AD的类在命名空间System.DirectoryServices下,需要将该类引用进来。

2.  连接

要操作AD需首先连接AD,就象要操作数据先要连接数据库一样。

复制代码
/// <summary>
        /// 获得DirectoryEntry对象实例,以管理员登陆AD
        /// </summary>
        /// <returns></returns>
        private static DirectoryEntry GetDirectoryObject()
        {
            DirectoryEntry entry = null;
            try
            {
                entry = new DirectoryEntry("LDAP://10.10.10.16", "Peter", " ab#CD%1234", AuthenticationTypes.Secure);
            }
            catch (Exception ex)
            {
            }
            return entry;
        }
复制代码

3.  查询

根据各种条件获取具体的用户。下例为根据公共名称获取对象。

复制代码
/// <summary>
        /// 根据用户公共名称取得用户的 对象
        /// </summary>
        /// <param name="commonName">用户公共名称</param>
        /// <returns>如果找到该用户则返回用户的对象,否则返回 null</returns>
        public static DirectoryEntry GetDirectoryEntry(string commonName)
        {
            DirectoryEntry de = GetDirectoryObject();
            DirectorySearcher deSearch = new DirectorySearcher(de);
            deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName.Replace("\\", "") + "))";
            deSearch.SearchScope = SearchScope.Subtree;
            try
            {
                SearchResult result = deSearch.FindOne();
                de = new DirectoryEntry(result.Path);
                return de;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
复制代码

 

4.  修改用户

修改查询到的Entity的值,修改后将修改记录保存到AD。注意有两种保存属性的方式。具体使用哪种请参考帮助。

1)       直接修改属性

2)       通过invoke来触发AD的内置函数

复制代码
/// <summary>
        /// 修改查询到的用户
        /// </summary>
        /// <param name="CommonName">通用名(displayName,系统中显示的中文字)</param>
        /// <param name="Account">帐户名(如Peter)</param>
        /// <param name="organizeName">组织单元名(资讯中心)</param>
        /// <param name="password">密码</param>
        public static string ChangeADAccount(string CommonName, string Account, string password)
        {
            //获取对应AD实体
            DirectoryEntry user = GetDirectoryEntry( commonName);
            try
            {
                ADHelper.SetProperty(user, " sAMAccountName ", Account);
                user.Invoke("SetPassword", new object[] { password });
                user.CommitChanges();
            }
            catch (Exception e)
            {
                throw e;
            }
            return user.Path;
        }
 
/// <summary>
        /// 设置指定的属性值
        /// </summary>
        /// <param name="de"></param>
        /// <param name="propertyName">属性名称?</param>
        /// <param name="propertyValue">属性值</param>
        public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue)
        {
            if (de.Properties.Contains(propertyName))
            {
                if (String.IsNullOrEmpty(propertyValue))
                {
                    de.Properties[propertyName].RemoveAt(0);
                }
                else
                {
                    de.Properties[propertyName][0] = propertyValue;
                }
            }
            else
            {
                if (!String.IsNullOrEmpty(propertyValue))
                {
                    de.Properties[propertyName].Add(propertyValue);
                }
            }
        }
复制代码

 

5.  修改OU

1)  获取OU      

复制代码
 DirectoryEntry OUEntry = new DirectoryEntry(GetOrganizeNamePath(OUName), "Peter", " ab#CD%1234", AuthenticationTypes.Secure);
        /// <summary>
        /// 获得OU的Path
        /// </summary>
        /// <param name="organizeUnit">OU名</param>
        /// <returns></returns>
        public static string GetOrganizeNamePath(string organizeUnit)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(ADPath);
            sb.Append("/");
            return sb.Append(SplitOrganizeNameToDN(organizeUnit)).ToString();
        }
复制代码

 

2)  修改OU项      

OUEntry.Rename("OU=" + newOUName);

        OUEntry.CommitChanges();

 

3)  删除OU      

DirectoryEntry OUParent = OUEntry.Parent;

        OUParent.Children.Remove(OUEntry);

        OUParent.CommitChanges();

 

6.  修改组

1)  获取组      

复制代码
 /// <summary>
        /// 获取AD组
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="organizeUnit"></param>
        /// <returns></returns>
        public static DirectoryEntry GetADGroupInOU(string groupName, string organizeUnit)
        {
            if (!String.IsNullOrEmpty(groupName))
            {
                DirectoryEntry de = new DirectoryEntry(GetOrganizeNamePath(organizeUnit) , "Peter", " ab#CD%1234", AuthenticationTypes.Secure); ;
                DirectorySearcher deSearch = new DirectorySearcher(de);
                deSearch.Filter = "(&(objectClass=group)(cn=" + groupName.Replace("\\", "") + "))";
                deSearch.SearchScope = SearchScope.Subtree;
                try
                {
                    SearchResult result = deSearch.FindOne();
                    if (result != null)
                    {
                        de = new DirectoryEntry(result.Path, adminName, adminPassword);
                    }
                    else
                    {
                        return null;
                    }
                    return de;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }
复制代码

2)  管理组成员

group.Properties["member"].Add(user.Properties["distinguishedName"].Value);

group.Properties["member"].Remove(user.Properties["distinguishedName"].Value);

 

三、查看AD User属性结果

在程序中修改了User属性后我们要检验一下是否被修改了,有三种方式查看AD中User属性:

1.  Active Directory Users and Computers

打开Active Directory Users and Computers,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。在该属性页只能看到一些常用的属性。

2.  Exchange Management Console

打开Exchange Management Console,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。单击Customer Attributes按钮可以查看自定义的属性。

3.  adsiedit.msc

以上两种方式所看到的属性都不全,要看到所有属性需使用adsiedit.msc工具。

在运行窗口中输入adsiedit.msc后打开本工具。选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。

转载于:https://www.cnblogs.com/LuckZ/p/3700997.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在.NET Core中调用AD验证,可以使用Novell.Directory.Ldap.NETStandard这个Nuget包。下面是一个演示代码,可以在控制台中验证一个AD账户: ```csharp using System; using Novell.Directory.Ldap; namespace NetCoreLdap { class Program { static void Main(string[] args) { string username = "james"; string password = "2wsx@WSX"; var loginFlag = LDAPUtil.Validate(username, password); if(loginFlag) { Console.WriteLine("User validate successfully!"); } else { Console.WriteLine("User validate unsuccessfully!"); } Console.ReadLine(); } } public class LDAPUtil { public static bool Validate(string username, string password) { try { using (var cn = new LdapConnection()) { cn.Connect("your.ad.server", 389); cn.Bind("your.ad.username", "your.ad.password"); var searchBase = "DC=your,DC=domain,DC=com"; var searchFilter = $"(&(objectClass=user)(sAMAccountName={username}))"; var result = cn.Search(searchBase, LdapConnection.SCOPE_SUB, searchFilter, null, false); var entry = result.Next(); if (entry != null) { cn.Bind(entry.DN, password); return true; } else { return false; } } } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } } } } ``` 其中,`your.ad.server`是你的AD服务器地址,`your.ad.username`和`your.ad.password`是你的AD管理员账户和密码,`DC=your,DC=domain,DC=com`是你的AD的根节点,`(&(objectClass=user)(sAMAccountName={username}))`是搜索条件,用于查找指定用户名的用户。如果验证成功,返回true,否则返回false。 --相关问题--: 1. 如何在.NET Core中操作AD用户? 2. 如何在.NET Core中操作AD组?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值