如何用PowerShell获取AD用户过期日期及经理姓名并导出CSV
PowerShell AD组成员信息查询脚本扩展方案
一、账号过期日期问题解决
问题分析
- 尝试1中直接使用
$user.accountExpires为空,原因是accountExpires属于AD扩展属性,默认不会被Get-ADUser返回,且该属性存储的是64位整数时间戳,即使返回也需要转换为可读日期格式。 - 尝试2的参数绑定错误,是因为脚本存在语法缺陷(比如
Get-ADUser参数行未完整闭合,或后续自定义对象定义缺少终止符号}),导致PowerShell误将后续代码解析为Get-ADUser的位置参数。
正确处理方式
使用PowerShell预转换的AccountExpirationDate属性(无需手动转换时间戳),在Get-ADUser的-Properties中明确指定该属性,并处理账号永不过期的场景:
- 当
AccountExpirationDate为$null时,说明账号无过期限制,可显示“永不过期” - 若有过期日期,格式化为可读性强的字符串
二、经理姓名提取问题解决
问题分析
$user.manager返回的是经理账号的完整辨别名(DN),直接输出无法满足需求。可靠的提取方式有两种:
- 从DN字符串拆分:通过
-split分割DN,提取CN=后的姓名部分,但依赖DN格式规范性,容错性差。 - 查询AD获取姓名:用经理的DN作为参数调用
Get-ADUser,获取其Name属性,这种方法更可靠,同时需要处理经理账号不存在的异常情况。
完整修正脚本
$ou = 'distinguishedName of my OU' $outputPath = 'C:\Users\Me\Desktop\MyFile.csv' Get-ADGroup -Filter * -SearchBase $ou -Properties 'Description' | ForEach-Object { $group = $_ $members = Get-ADGroupMember $_ | Where-Object { $_.objectClass -eq 'user' } foreach($member in $members) { # 获取用户所需扩展属性 $user = Get-ADUser $member -Properties EmailAddress, AccountExpirationDate, Manager # 处理账号过期日期 $expiryDate = if ($user.AccountExpirationDate) { $user.AccountExpirationDate.ToString('yyyy-MM-dd HH:mm:ss') } else { '永不过期' } # 处理经理姓名,捕获查询异常 $managerName = if ($user.Manager) { try { (Get-ADUser $user.Manager -Properties Name).Name } catch { '经理账号不存在' } } else { '无' } [pscustomobject]@{ SamAccountName = $user.SamAccountName Name = $user.Name EmailAddress = $user.EmailAddress ?? '无邮箱' AccountExpirationDate = $expiryDate ManagerName = $managerName GroupName = $group.Name GroupDescription = $group.Description ?? '无描述' } } } | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
脚本关键点说明
- 明确指定
Get-ADUser需要返回的扩展属性,避免遗漏 - 对空值(邮箱、组描述)和异常场景(经理账号不存在)做了默认值填充,提升CSV可读性
- 对过期日期做了格式化处理,区分永不过期的情况
内容的提问来源于stack exchange,提问作者S.Mahmood
相关产品推荐
相关产品推荐

