通过 ADSI 提取 AD 用户信息
Extract AD User information via ADSI
如何通过 ADSI LDAP 为用户获取这些属性,这些是来自 Get-ADUser
的属性,我需要 ADSI 的等效项。
- 已启用
- 密码永不过期
- 密码过期
- 姓名
- SamAccountName
- 邮件
- 密码上次设置
我的objective是为所有用户查询整个域并获取这些属性。
我尝试使用 Get-ADUser
cmdlet,但在查询用户时超时。
Get-ADUser -Filter * -Properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset -server sc |
where {$_.Enabled -eq "True"} |
where { $_.PasswordNeverExpires -eq $false } |
where { $_.passwordexpired -eq $false } |
Select Name,SamAccountName,mail,
@{l='PasswordExpires';e={$_.passwordlastset+(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge}},
@{l='DaystoExpire';e={(New-TimeSpan -Start (get-date) -end ($_.passwordlastset+(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge)).days}}
上述命令适用于几个用户,但如果我查询大量用户,它会提供无效的枚举上下文。
您可以在 AD:\
Powershell 驱动器上使用 Get-Item
,此 cmdlet 接受 -properties
参数来检索指定的属性列表。使用星号会使 cmdlet 检索所有属性。一个例子:
get-aduser -filter "sAMAccountName -like '*'" | % { get-item "AD:$($_.distinguishedName)" -properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset }
编辑:对于计算属性,包括"Enabled"、"Password never expires"等,Get-ADUser
也可以接受-properties
参数,所以代码就是这样:
get-aduser -filter "sAMAccountName -like '*'" -properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset
星号也可以。
属性SamAccountName
、Name
、Mail
对应同名AD属性。 PasswordLastSet
派生自属性 pwdLastSet
。其他 3 个属性(Enabled
、PasswordNeverExpires
和 PasswordExpired
)是 userAccountControl
属性中的标志。
使用带有 LDAP 查询的 adsisearcher
对象在 AD 中搜索用户对象,然后构建具有所需属性的自定义对象:
$ACCOUNTDISABLE = 0x000002
$DONT_EXPIRE_PASSWORD = 0x010000
$PASSWORD_EXPIRED = 0x800000
$searcher = [adsisearcher]"(&(objectClass=user)(objectCategory=person))"
$searcher.FindAll() | % {
$user = [adsi]$_.Properties.adspath[0]
New-Object -Type PSCustomObject -Property @{
SamAccountName = $user.sAMAccountName[0]
Name = $user.name[0]
Mail = $user.mail[0]
PasswordLastSet = [DateTime]::FromFileTime($_.Properties.pwdlastset[0])
Enabled = -not [bool]($user.userAccountControl[0] -band
$ACCOUNTDISABLE)
PasswordNeverExpires = [bool]($user.userAccountControl[0] -band
$DONT_EXPIRE_PASSWORD)
PasswordExpired = [bool]($user.userAccountControl[0] -band
$PASSWORD_EXPIRED)
}
}
话虽如此,您为什么要解决所有这些麻烦,而不是简单地使用 Get-ADUser
来达到相同的目的?
Import-Module ActiveDirectory
$attributes = 'SamAccountName', 'Name', 'Mail', 'PasswordLastSet', 'Enabled',
'PasswordNeverExpires', 'PasswordExpired'
Get-ADUser -Filter * -Properties $attributes | select $attributes
如何通过 ADSI LDAP 为用户获取这些属性,这些是来自 Get-ADUser
的属性,我需要 ADSI 的等效项。
- 已启用
- 密码永不过期
- 密码过期
- 姓名
- SamAccountName
- 邮件
- 密码上次设置
我的objective是为所有用户查询整个域并获取这些属性。
我尝试使用 Get-ADUser
cmdlet,但在查询用户时超时。
Get-ADUser -Filter * -Properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset -server sc |
where {$_.Enabled -eq "True"} |
where { $_.PasswordNeverExpires -eq $false } |
where { $_.passwordexpired -eq $false } |
Select Name,SamAccountName,mail,
@{l='PasswordExpires';e={$_.passwordlastset+(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge}},
@{l='DaystoExpire';e={(New-TimeSpan -Start (get-date) -end ($_.passwordlastset+(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge)).days}}
上述命令适用于几个用户,但如果我查询大量用户,它会提供无效的枚举上下文。
您可以在 AD:\
Powershell 驱动器上使用 Get-Item
,此 cmdlet 接受 -properties
参数来检索指定的属性列表。使用星号会使 cmdlet 检索所有属性。一个例子:
get-aduser -filter "sAMAccountName -like '*'" | % { get-item "AD:$($_.distinguishedName)" -properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset }
编辑:对于计算属性,包括"Enabled"、"Password never expires"等,Get-ADUser
也可以接受-properties
参数,所以代码就是这样:
get-aduser -filter "sAMAccountName -like '*'" -properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordlastset
星号也可以。
属性SamAccountName
、Name
、Mail
对应同名AD属性。 PasswordLastSet
派生自属性 pwdLastSet
。其他 3 个属性(Enabled
、PasswordNeverExpires
和 PasswordExpired
)是 userAccountControl
属性中的标志。
使用带有 LDAP 查询的 adsisearcher
对象在 AD 中搜索用户对象,然后构建具有所需属性的自定义对象:
$ACCOUNTDISABLE = 0x000002
$DONT_EXPIRE_PASSWORD = 0x010000
$PASSWORD_EXPIRED = 0x800000
$searcher = [adsisearcher]"(&(objectClass=user)(objectCategory=person))"
$searcher.FindAll() | % {
$user = [adsi]$_.Properties.adspath[0]
New-Object -Type PSCustomObject -Property @{
SamAccountName = $user.sAMAccountName[0]
Name = $user.name[0]
Mail = $user.mail[0]
PasswordLastSet = [DateTime]::FromFileTime($_.Properties.pwdlastset[0])
Enabled = -not [bool]($user.userAccountControl[0] -band
$ACCOUNTDISABLE)
PasswordNeverExpires = [bool]($user.userAccountControl[0] -band
$DONT_EXPIRE_PASSWORD)
PasswordExpired = [bool]($user.userAccountControl[0] -band
$PASSWORD_EXPIRED)
}
}
话虽如此,您为什么要解决所有这些麻烦,而不是简单地使用 Get-ADUser
来达到相同的目的?
Import-Module ActiveDirectory
$attributes = 'SamAccountName', 'Name', 'Mail', 'PasswordLastSet', 'Enabled',
'PasswordNeverExpires', 'PasswordExpired'
Get-ADUser -Filter * -Properties $attributes | select $attributes