图片 21

LDAP基础

1
LDAP是什么LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。
LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。要非凡注重的是,LDAP通常作为一个hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。
简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。LDAP是轻量目录访问协议(Lightweight
Directory Access
Protocol)的缩写,其实是一话号码簿,类似于我们所使用诸如NIS(Network
Information Service)、DNS (Domain Name
Service)等网络目录,也类似于你在花园中所看到的树木。LDAP是一种非凡的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。
LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。1.1
LDAP的存储规则区分名和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。在文件系统中,
这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd,
/opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。在LDAP中,一个条目的区分名称叫做dn或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是uid=aghaffar,
ou=People,
o=developer.ch。不可能有相同的dn,但是我们可以有诸如uid=aghaffar,
ou=Administrators, o=developer.ch的dn。这同上面文件系统中/etc/passwd 和
/usr/passwd的例子很类似。我们有独一无二的属性,在ou=Administrators,
o=developer.ch 中uid和在ou=People,
o=developer.ch中的uid。这并不矛盾。CN=Common Name
为用户名或服务器名,最长可以到80个字符,可以为中文;OU=Organization
Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;O=Organization
为组织名,可以3

上一次我们对活动目录的用户和组进行了简单的管理操作,使用了.NET框架中的System.DirectoryServices

一.LDAP的4中基本模型
      
LDAP的体系结构由4中基本模型组成:信息模型描述LDAP的信息表达方式;命名模型描述LDAP的数据如何组织;功能模型描述LDAP的数据操作访问方式;安全模型描述LDAP的安全机制。

System.DirectoryServices.AccountManagement等类。以及微软与Quest公司的PowerShell扩展,在实际应用中,推荐使用上述两种扩展,其语法更加简洁,便于维护。本次我们将尝试批量编辑域用户的信息,以及通过LDAP查询我们感兴趣的信息。

       1.信息模型
       LDAP信息模型定义能够在目录中存储的数据类型和基本的信息单位。

 

       2.命名模型
      
LDAP中的命名模型,即LDAP中的条目定位方式。在LDAP中每个条目均有自己的DN(Distinguished
Name,标识名)和RDN(Relative Distinguished
Name,相对标识名)。DN是该条目在整个数中唯一名称标识。RDN是条目在父节点下唯一名称标识,如同文件系统中,带路径的文件名就是DN,文件名就是RDN.

测试脚本下载

       3.功能模型
      
LDAP功能模型说明了能够使用LDAP协议对目录执行某些操作。在LDAP中共有4类操作(共10种):
       (1)查询类操作,如搜索,比较;
       (2)更新类操作,如添加条目,删除条目,修改条目和修改条目名;
       (3)认证类操作,如绑定,解绑定;
       (4)其它操作,如放弃和扩展操作。

本系列所有脚本均在Windows Server
2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free
Edition x64中测试通过。

       4.安全模型
      
LDAP的安全模型主要是基于绑定操作的,绑定操作的不同使得安全机制有所不同。3种:
       (1)无认证
      
(2)基本认证:当使用LDAP的基本安全认证时,客户进程通过网络向服务进程发送一个分辨名(DN)和口令来标识自己。服务进程检查客户进程发送的分辨名(DN)和密码是否与目录中储存的分辨名(DN)和密码相匹配,如果匹配则认为通过了认证。
      
(3)SASL认证:即LDAP提供的在SSL和TLS安全通道基础上进行的身份认证,包括数字证书的认证。
    

 

       二.LDAP存储结构
      
一棵目录信息数由若干条目(Entry)组成,每个条目有惟一的标识名DN,一个条目是一个对象,每个条目由多个“属性(Attribute)”组成,每个属性由一个类型和一个到多个值组成,每个属性可以对应一个或多个“值(Value)”。
图片 1

  1. 使用 Microsoft Active Directory Cmdlets 批量创建域用户。

       三.LDAP的基本概念
       目录数据库是以目录信息数(Directory Information
Tree,DIT)为存储方式的数型存储结构。
*常用关键字及其对应的含义
【dc】– Domain Component–
域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com

首先准备一个csv文件,将待创建的域用户名写入:

【uid】– User ID– 用户ID,如“tom”

图片 2

【ou】– Organization Unit–
组织单位,类似于Linux文件系统中的子目录,是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market”

其中第一行的”UserName”作为列名。CSV = Comma Separated Values,即”逗号分隔值”文件。这里使用的是一种广义的csv文件,可以看到并没有逗号,其实用其他分隔符也可以,只要能区分各个用户就可以了。

【sn】– Surname– 姓,如“Johansson”

csv文件可以使用Excel打开:

【dn】– Distinguished Name–
唯一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个唯一的名称,如“uid=tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是唯一的

图片 3

【rdn】– Relative dn–
相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=ton”或“cn=Thomas
Johansson”

 

【c】– Country — 国家,如“CN”或“US”等

循环遍历csv文件,提取UserName:

【o】– Organization — 组织名,如“Example,Inc.”

Clear-Host

       四.规划目录树
      
要实现LDAP,首先要规划目录树,一个灵活且易于扩展的目录树可以减少后期维护目录树的工作量。
      
通过例子说明。假设有一个名为Example的公司(DNS名为example.com),其组织结构如下:
图片 4

Import-Csv -Path E:PSTestUsers.csv |
foreach {

    
(1)首先要为目录树建立一个“根(Root)”。根是目录树的最顶层,后面建立的所有对象都是基于这个根的,所以它也称为基准DN。它可以有3种格式表示。
     *使用X.500标准格式:o=example,c=CN。 
     *直接使用公司的DNS域名:o=example.com。
     *使用公司的DNS域名的不同部分:dc=example,dc=com。
    
第3种格式更利于以后目录树的扩展,如将来Example公司合并了abc公司,之需要将dc=com最为根即可,不需要修改原有的结构。

    New-ADUser -Name $_.UserName `

    
(2)公司中的部门作为OU,如“ou=market”。OU是目录树的分枝节点,下面可以包含其他分枝节点或叶子节点。

    -SamAccountName
$_.UserName -GivenName $_.UserName `

    
(3)用户是目录树的最底层(即叶子节点),可以根据用户所在的部门将其放置在不同的OU中,使用uid或cn描述都可以,如“uid=tom”或“cn=Thomas
Johansson”。
图片 5

    -Surname $_.UserName -Path “ou=Domain Controllers,dc=Lucifer,dc=com” `

       四.LDAP服务的应用领域

    -DisplayName $_.UserName -AccountPassword
$null `

      
由于LDAP所具有的查询效率高,树状的信息管理模式,分布式的部署框架以及灵活而细腻的访问控制,是LDAP广泛地用于基础性,关键性信息(如用户信息,网络资源信息等)的管理。LDAP的应用主要涉及以下几种类型。
     *信息安全类:数字证书管理,授权管理,单点登录。
     *科学计算类:DCE(Distributed Computing
Envirionment,分布式计算环境),UDDI(Universal Description,Discovery and
Integration,统一描述,发现和集成协议)。
     *网络资源管理类:MAIL系统,DNS系统,网络用户管理,电话号码薄。
    
*电子政务资源管理类:内网组织信息服务,电子政务目录体系,人口基础库,法人基础库。

    -CannotChangePassword $false `

    -ChangePasswordAtLogon $true `

    -UserPrincipalName
“$_.UserName@manticore.org” `

}

运行结果:

图片 6

可以看到用户默认是禁用的,稍后将学习怎么启用、禁用用户。

 

2、使用 Quest Active Directory Cmdlets 批量创建域用户。

Clear-Host

Import-Csv -Path E:PSTestUsers.csv |
foreach {

    New-QADUser -Name $_.UserName `

    -DisplayName $_.UserName `

    -SamAccountName
$_.UserName `

    -ParentContainer
“OU=Domain
Controllers,DC=Lucifer,DC=com” `

}

还是使用刚才的csv文件,运行结果类似:

图片 7

图片 8

 

其实不一定非要使用csv文件,使用txt、xml等文件也可以,文件只是存储用户信息的容器,只要能获取文件中存储的用户信息即可。PowerShell对csv提供了内置支持,即Import-Csv、Export-Csv命令等,所以如果没有特殊需求,建议使用csv文件。

 

3、修改用户信息。

要修改用户信息,首先要知道用户有哪些信息:

Get-ADUser -Identity “User1” -Properties *

运行结果:

图片 9

今天偶然看到AD PowerShell的官方博客,还是很不错的。

如上图所示,查询出了用户”User1″的所有信息,可以看到还是很多的。-Identity参数用于唯一标识用户,微软的Cmdlets支持如下四种Identity:

图片 10

其中比较常用的是sAMAccountName。

可以用一些PowerShell或LDAP表达式来进行查询:

Logical Operator

Description

Equivalent LDAP operator/expression

-eq

Equal to. This will not support wild card search.

=

-ne

Not equal to. This will not support wild card search.

! x = y

-like

Similar to -eq and supports wildcard comparison. The only wildcard character supported is: *

=

-notlike

Not like. Supports wild card comparison.

! x = y

-approx

Approximately equal to

~=

-le

Lexicographically less than or equal to

<=

-lt

Lexicographically less than

! x >= y

-ge

Lexicographically greater than or equal to

>=

-gt

Lexicographically greater than

! x <= y

-and

AND

&

-or

OR

|

-not

NOT

!

-bor

Bitwise OR

:1.2.840.113556.1.4.804:=

-band

Bitwise AND

:1.2.840.113556.1.4.803:=

-recursivematch

Uses LDAP_MATCHING_RULE_IN_CHAIN (Win2k3 SP2 and above)

:1.2.840.113556.1.4.1941:=

 

如:

Get-ADObject -Filter { CN -like “*bro*” }

Get-ADObject -LDAPFilter “(cn=*bro*)”

查询CN like bro的活动目录信息:

图片 11

我对LDAP语法很不熟悉,临时查了些资料:

LDAP的存储规则

区分名(DN,Distinguished Name)

和自然界中的树不同,文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性,这一属性可以帮助我们来区别这些枝叶。

在文件系统中,
这些独一无二的属性就是带有完整路径的文件名。比如/etc/passwd,该文件名在该路径下是独一无二的。当然我们可以有/usr/passwd,
/opt/passwd,但是根据它们的完整路径,它们仍然是唯一的。

在LDAP中,一个条目的区分名称叫做”dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是”uid=aghaffar,
ou=People,
o=developer.ch”。不可能有相同的dn,但是我们可以有诸如”uid=aghaffar,
ou=Administrators, o=developer.ch”的dn。这同上面文件系统中/etc/passwd 和
/usr/passwd的例子很类似。

我们有独一无二的属性,在”ou=Administrators,
o=developer.ch” 中uid和在”ou=People,
o=developer.ch”中的uid。这并不矛盾。

CN=Common Name
为用户名或服务器名,最长可以到80个字符,可以为中文;

OU=Organization
Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;

O=Organization 为组织名,可以3—64个字符长

C=Country为国家名,可选,为2个字符长

LDAP目录以一系列”属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。

 

4、将用户”User1″的部门修改为”开发部”,并启用该用户:

Get-ADUser -Identity “User1” | Set-ADUser -Department “Develop” -Enabled $true

运行结果:

图片 12

注意,在PowerShell中,使用$true、$false表示布尔值:true/false。

此外,凡是脚本中包含Q的,如Get-QADUser
均是Quest公司的Cmdlets,否则是微软的Cmdlets
,请注意区分。

 

5、查询禁用的用户:

Clear-Host

Get-QADUser -Disabled

 

Search-ADAccount -AccountDisabled
–UsersOnly

运行结果:

图片 13

Quest Cmdlets给出了禁用用户的列表,Microsoft
Cmdlets则给出了更为详细的信息。

 

6、使用.NET框架中的类进行查询:

Clear-Host

$user =
“User1”

$dc =
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()

$root =
$dc.GetDirectoryEntry()

$search =
[System.DirectoryServices.DirectorySearcher]$root

$search.Filter = “cn=$user”

$result =
$search.FindOne()

 

if($result -ne $null)

{

    Write-Host “Find One!”

}

else

{

    Write-Host “$user does not exists!”

}

查询cn=User1的结果,显然能找到该用户:

图片 14

FindOne()方法返回查询结果中的第一个,FindAll()则会返回所有查询到的结果。

 

7、禁用、启用用户:

Clear-Host

Disable-ADAccount -Identity “User1”

Enable-ADAccount -Identity “User1” -PassThru

 

Disable-QADUser -Identity “User1”

Enable-QADUser -Identity “User1”

 

8、查询登录并锁定的用户:

Clear-Host

Get-QADUser -Locked

Search-ADAccount –LockedOut

 

9、移动用户。为了便于看到效果,我们先新建一个OU:Temp。

图片 15

图片 16

注意,取消保护勾选可以方便的删除该OU:

图片 17

图片 18

 

下面把User1移动到Temp中去。

Move-ADObject -Identity “CN=User1,OU=Domain
Controllers,DC=Lucifer,DC=com” -TargetPath “OU=Temp,DC=Lucifer,DC=com”

运行结果:

图片 19

注意表达式是有顺序的,CN要在OU之前,这块语法我也在慢慢摸索。

再使用Quest Cmdlets将User1移动回去:

Move-QADObject -Identity “CN=User1,OU=Temp,DC=Lucifer,DC=com” -NewParentContainer
“OU=Domain Controllers,DC=Lucifer,DC=com”

运行结果:

图片 20

 

图片 21

 

小结:

本次我们继续练习了活动目录的相关操作,主要涉及域用户的编辑、搜索,其中掌握LDAP的查询语法非常重要。熟练以后可以快捷高效的对活动目录对象(不仅仅局限于用户、组)进行管理。下一次将练习域组的管理操作,以及管理OU、组策略等高级话题。

发表评论

电子邮件地址不会被公开。 必填项已用*标注