Zumpyx's Blog

LDAP 笔记

adldap

在 LDAP 中,每个对象都拥有独一无二的 DN 属性和 RDN,DN 是整个树中唯一的标识,RDN 是 DN 中每一个逗号分割的表达式。如 “CN=Admin,DC=test,DC=com”,整体是一个 DN,其中有三个 RDN,分别是 CN=Admin、DC=test、DC=com

查询方式

# 获取用户的域对象
$domainObj = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
# 获取 PDC
$PDC = $domainObj.PdcRoleOwner.Name
# 使用 ADSI 检索 DN
$DN = ([adsi]'').distinguishedName
# 组装完整 LDAP 路径
$LDAP = "LDAP://$PDC/$DN"
# 创建 DirectoryEntry 类(DirectoryEntry 类中封装了 AD 服务层次结构中的节点与对象)
$direntry = New-Object System.DirectoryServices.DirectoryEntry($LDAP)
# 创建 DirectorySearcher 使用 LDAP 对 AD 进行查询
$dirsearcher = New-Object System.DirectoryServices.DirectorySearcher($direntry)
$result = $dirsearcher.FindAll()

# samAccountType 属性为 0x30000000 的对象
$dirsearcher.filter="samAccountType=805306368"
# $dirsearcher.filter="name=jeffadmin" 过滤用户信息
$result = $dirsearcher.FindAll()

# 遍历打印每个对象的每个属性
Foreach($obj in $result)
{
	Foreach($prop in $obj.Properties)
	{
		$prop
		# $prop.memberof	打印对应对象所属组
	}
	Write-Host ”-------------------------------”
}

也可以封装为函数

function LDAPSearch {
    param
    	[string]$LDAPQuery
    )
    $PDC = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().PdcRoleOwner.Nam
    e
    $DistinguishedName = ([adsi]'').distinguishedName
    $DirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$PDC/$DistinguishedName")
    $DirectorySearcher = New-Object System.DirectoryServices.DirectorySearcher($DirectoryEntry, $LDAPQuery)
    return $DirectorySearcher.FindAll()
}

调用方法

PS c:\> Import-Module LDAP.ps1
PS c:\> LDAPsearch -LDAPQuery "(samAccountType=805306368)"
PS c:\> LDAPsearch -LDAPQuery "(objectclass=group)"
...