通过ADSI提取AD用户信息

Pow*_*ell 0 powershell adsi

如何通过ADSI LDAP为用户获取这些属性,这些是的属性Get-ADUser,我需要ADSI的等效属性。

  • 已启用
  • 密码永不过期
  • 密码已过期
  • 名称
  • SamAccountName
  • 邮件
  • 密码最后一个

我的目标是查询整个域的所有用户并获取这些属性。

我尝试使用Get-ADUsercmdlet,并且在查询用户时超时。

Get-ADUser -Filter * -Properties enabled,PasswordNeverExpires,passwordexpired,Name,SamAccountName,mail,passwordla??stset -server sc |
   where {$_.Enabled -eq "True"} |
   where { $_.PasswordNeverExpires -eq $false } |
   where { $_.passwordexpired -eq $false } |
   Select Name,SamAccountName,mail,
          @{l='PasswordExpires';e={$_.passwordlastset+(Get-ADDefa??ultDomainPasswordPolicy).MaxPasswordAge}},
          @{l='DaystoExpire';e={(New-TimeSpan -Start (get-date) -end ($_.passwordlastset+(Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge)).days}}
Run Code Online (Sandbox Code Playgroud)

上面的命令对几个用户有效,但是如果我查询大量用户,它将给出无效的枚举上下文。

Ans*_*ers 5

属性SamAccountNameNameMail对应于同名的AD属性。PasswordLastSet从属性派生pwdLastSet。其他3个属性(EnabledPasswordNeverExpiresPasswordExpired)是userAccountControl属性中的标志。

使用adsisearcher带有LDAP查询的对象在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)
  }
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,为什么您要解决所有这些麻烦而不是简单地Get-ADUser用于同一目的?

Import-Module ActiveDirectory

$attributes = 'SamAccountName', 'Name', 'Mail', 'PasswordLastSet', 'Enabled',
              'PasswordNeverExpires', 'PasswordExpired'

Get-ADUser -Filter * -Properties $attributes | select $attributes
Run Code Online (Sandbox Code Playgroud)