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后打开本工具。选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。

Ad域身份验证总结,码迷,mamicode.com

时间: 2024-12-22 20:44:31

Ad域身份验证总结的相关文章

使用JAVA进行ad域身份验证常用属性详解

一些变态的公司经常对开发者提出一些变态的问题.比如在oa系统中,要求登录验证必须使用ad域进行登录.还有的如登录crm系统必须使用公司的阿里云邮箱账号进行身份验证等等. 作为程序员我们只能按照客户的需求进行完善系统.毕竟客户才是我们的衣食父母,没办法拒绝.我这里就列举一些,在系统中集成ad域身份验证的一些配置信息,并一一解释他们的作用. 直接看代码: public boolean login() { // 判断必填字段是否全部填写 if (StringUtils.isEmpty(this.use

Windows Azure SSTP模式VPN Client使用AD域用户验证登录

我们上面一篇文章介绍了,如何在windows azure下搭建SSTP模式的vpn服务,搭建配置后我们遗留了一个,什么问题呢,我们都知道,一般的独立vpn是使用独立的账户及密码的,尤其是托管到外面的vpn服务器,无法使用AD域用户验证.这样会造成vpn用户拥有两套用户及密码,管理起来很不方便.再说说我的环境,我的环境是把vpn服务器放在了windows azure上,这样算来也是托管类型的,但是windows azure毕竟是微软出的,AD也是微软的,在设计上肯定考虑了,最终呢托管到window

JWT跨域身份验证解决方案

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.本文介绍JWT的原理和用法. 1. 当前跨域身份验证的问题 Internet服务无法与用户身份验证分开.一般过程如下.1.用户向服务器发送用户名和密码.2.验证服务器后,相关数据(如用户角色,登录时间等)将保存在当前会话中.3.服务器向用户返回session_id,session信息都会写入到用户的Cookie.4.用户的每个后续请求都将通过在Cookie中取出session_id传给服务器.5.服务器收到session_

跨域身份验证

传统身份验证的方法session 当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端. 这些 Session 可能会存储在内存,磁

使用 AD 进行身份验证的 Dynamic CRM 系统在新电脑上无法登录进入系统

不知道是因为什么,也许是超出了连接最大限制?限制是按 IP 地址?还是按 计算机?还是按 连接数?不得而知 目前从网上找到了一个修改 LDAP 的 MaxPageSize,可以缓解此问题,但不知道是否是正确的解决方案. 操作方法如下: 1.开始->运行->输入"ntdsutil" //回车 2.输入"ldap policies" //回车 3.输入"connections" //回车 4.输入"connect to doma

上网行为管理AD域集成windos身份验证SSO单点登录

一.背景需求 在大型公司项目上会使用到AD域集成windos身份验证SS0单点登录,而不同用户有不同的环境,不同环境就会有不同的验证需求,使用微软AD域进行用户身份验证,会经常出现在客户的需求中. 二.网域上网行为管理集成windos身份验证功能. 什么是AD域集成windos身份验证了?就是基于windos系统的电脑端都需要加入到AD域或者这些没有加入到AD域的windos系统的电脑必须要通过AD域的用户验证信息才能上网.为什么大型企业需要windos身份验证?通过windos身份验证分配给每

乾颐盾之深信服防火墙 -----AD域集成

乾颐盾之深信服防火墙 -----AD域集成 在生活的环境中,或者是企业环境中,都会有一个微软的AD域的环境,那么我们深信服的下一代防火墙也有认证系统,要是为这个设备单独的做认证用户的话就比较的麻烦,对于用户来说有可能会有不同的密码,就会产生很多的麻烦.深信服可以集成系统的域环境,这样就可以让用户直接的使用自己原先在域中的用户名和密码. 下面我们简单的看下试验环境 实验环境也比较的简单,让设备能够连接到AD域,并且DNS也做好,指向域服务器.我们来看下简单实际的操作. 一:添加角色(AD域) 二:

Samba通过ad域进行认证并限制空间大小《转载》

本文实现了samba服务被访问的时候通过windows域服务器进行用户名和密码验证;认证通过的用户可以自动分配500M的共享空间;在用户通过windows域登陆系统的时候可以自动把这块空间映射成一块硬盘.环境说明:文件服务器用的Centos5.3,域控用的Win2k3 sp2,Domain是rainbird.net.Centos5.3:Name:FilesrvIP:192.168.1.245Dns:192.168.1.241Samba:3.0.33-3.7.el5Win2k3:Name:ad1I

Dynamics CRM 2013 试用之 配置联合身份验证服务 Active Directory Federation Services

注:本文会适当把微软英文原话复制过来(英语来自微软MSDN官网),增加大家英文阅读能力. Configure AD FS for Windows Server 2012 R2 To configure AD FS as a stand-alone federation server for Microsoft Dynamics CRM Server claims authentication, do the following: 1.Open the Windows Server 2012 R2