Windows AD PowerShell(一):用户与账户
这是 Windows AD PowerShell 学习记录的第一节,主要整理用户账户的查询、属性筛选、状态管理和常见登录故障排查。
一、用户与账户
Get-ADUser部分
1.1 查询用户的基本信息
# 查单个用户的基本信息Get-ADUser -Identity qianyue -Properties *
# 以下仅节选部分输出DistinguishedName : CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=netEnabled : TrueGivenName : 月Name : 浅月ObjectClass : userObjectGUID : a050d085-d8dd-4065-903b-452e9fbb7a75SamAccountName : qianyueSID : S-1-5-21-2772337105-4098782075-1994570761-1116Surname : 浅UserPrincipalName : qianyue@qy.net这里可以看到很多数据,让我们一个个来分析:
| 属性 | 含义 | 值 |
|---|---|---|
| DistinguishedName | 用户在 Active Directory 中的唯一辨识名称,包含完整的组织单位路径 | CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=net |
| Enabled | 用户账户是否启用,True 表示启用,False 表示禁用 | True |
| GivenName | 用户的名字或名 | 月 |
| Name | AD 对象名称,通常对应 DistinguishedName 中的 CN 部分 | 浅月 |
| ObjectClass | AD 对象类型,user 表示这是一个用户对象 | user |
| ObjectGUID | AD 为该对象分配的全局唯一标识符,即使用户改名也通常保持不变 | a050d085-d8dd-4065-903b-452e9fbb7a75 |
| SamAccountName | 用户登录名,主要用于兼容旧版 Windows/NT 域登录 | qianyue |
| SID | Windows 安全标识符,用于唯一标识用户并进行权限判断 | S-1-5-21-2772337105-4098782075-1994570761-1116 |
| Surname | 用户的姓 | 浅 |
| UserPrincipalName | 用户主体名称,常用的现代域登录格式,通常类似电子邮箱地址 | qianyue@qy.net |
1.2 查询符合 Filter 参数的用户
顺带学习 Filter 参数的用法。
# 查所有启用的用户Get-ADUser -Filter 'Enabled -eq $true'
# 按名字模糊查Get-ADUser -Filter 'Name -like "*浅月*"'-Filter 后面是一个筛选表达式,通常由“属性、比较运算符和值”组成。-eq 表示精确相等;-like 表示按照通配符匹配,其中 * 代表任意数量的字符。
需要注意,-like 只会检查表达式中明确指定的属性。例如 Name -like "*浅月*" 只会检查 Name,不会自动检查其他属性。
1.3 使用 Properties 提供需要额外返回的属性
# 推荐:直接查询密码永不过期的用户Search-ADAccount -PasswordNeverExpires -UsersOnly
# 进阶:通过 userAccountControl 位标志查询Get-ADUser -Filter 'userAccountControl -band 0x10000' -Properties userAccountControl
# 示例一条:DistinguishedName : CN=浅月,OU=User,OU=Admin,OU=Organization,DC=qy,DC=netEnabled : TrueGivenName : 月Name : 浅月ObjectClass : userObjectGUID : a050d085-d8dd-4065-903b-452e9fbb7a75SamAccountName : qianyueSID : S-1-5-21-2772337105-4098782075-1994570761-1116Surname : 浅userAccountControl : 66048UserPrincipalName : qianyue@qy.net-Properties 用来指定 Get-ADUser 需要额外查询并返回哪些用户属性,-Filter 用来筛选用户,两者通常配合使用。例如上述命令通过 -Filter 判断 userAccountControl 中的密码永不过期标志,并通过 -Properties 返回该属性。
userAccountControl 是由多个状态位组合而成的数值。示例中的 66048 不只代表单一状态,因此需要通过位运算判断其中是否包含指定标志。
1.4 配合管道与 Select-Object 来筛选需要的对象
# 查询指定 OU 下的所有用户,并仅返回 NameGet-ADUser -SearchBase "OU=User,OU=Admin,OU=Organization,DC=qy,DC=net" -Filter * | Select-Object Name
Name----浅月Search-ADAccount部分
1.5 根据账户状态进行查询
# 查锁定中的账户Search-ADAccount -LockedOut -UsersOnly
# 查密码已过期的账户Search-ADAccount -PasswordExpired -UsersOnly
# 查已禁用的账户Search-ADAccount -AccountDisabled -UsersOnly
# 查超过 90 天未登录的用户Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnlySearch-ADAccount 用于按照账户状态进行搜索。如果不指定 -UsersOnly 或 -ComputersOnly,结果中可能同时包含用户账户和计算机账户。
常见的返回属性包括:
| 属性 | 含义 |
|---|---|
| AccountExpirationDate | 账户过期时间 |
| DistinguishedName | 对象在 AD 中的完整路径 |
| Enabled | 账户是否启用 |
| LastLogonDate | 最近一次登录时间 |
| LockedOut | 账户是否被锁定 |
| Name | 对象名称 |
| ObjectClass | 对象类型,例如 user 或 computer |
| ObjectGUID | 对象的全局唯一标识符 |
| PasswordExpired | 密码是否已经过期 |
| PasswordNeverExpires | 密码是否永不过期 |
| SamAccountName | 旧式 Windows 登录名 |
| SID | 安全标识符 |
| UserPrincipalName | 用户主体名称,例如 qianyue@qy.net |
1.6 对帐户执行修改的操作
# 启用/禁用账户Enable-ADAccount -Identity qianyueDisable-ADAccount -Identity qianyue
# 解锁账户Unlock-ADAccount -Identity qianyue
# 重置密码$newPassword = Read-Host "请输入新密码" -AsSecureStringSet-ADAccountPassword -Identity qianyue -Reset -NewPassword $newPassword
# 取消密码永不过期Set-ADUser -Identity qianyue -PasswordNeverExpires $false
# 强制下次登录改密码Set-ADUser -Identity qianyue -ChangePasswordAtLogon $true
# 移动用户到另一个 OUGet-ADUser -Identity qianyue | Move-ADObject -TargetPath "OU=NewOU,DC=qy,DC=net"密码不应该以明文形式直接写入脚本或命令历史,因此这里使用 Read-Host -AsSecureString 安全地读取密码。管理员重置密码时,需要给 Set-ADAccountPassword 添加 -Reset 参数。
在移动、禁用等可能影响用户登录的操作前,可以先使用 -WhatIf 预览将要执行的操作:
Get-ADUser -Identity qianyue | Move-ADObject -TargetPath "OU=NewOU,DC=qy,DC=net" -WhatIf另外,设置“下次登录必须修改密码”前,应确保已经取消“密码永不过期”:
Set-ADUser -Identity qianyue -PasswordNeverExpires $falseSet-ADUser -Identity qianyue -ChangePasswordAtLogon $true1.7 修改用户的常用属性
除了账户状态,还可以使用 Set-ADUser 修改显示名称、部门、职位和描述等属性:
Set-ADUser -Identity qianyue ` -DisplayName "浅月" ` -Department "IT" ` -Title "系统管理员" ` -Description "AD 测试账户"修改完成后,可以重新查询并通过 Select-Object 查看结果:
Get-ADUser -Identity qianyue ` -Properties DisplayName,Department,Title,Description | Select-Object SamAccountName,DisplayName,Department,Title,Description常见的用户资料属性如下:
| 属性 | 含义 |
|---|---|
| DisplayName | 用户的显示名称,常用于管理界面和通讯簿 |
| Department | 用户所在部门 |
| Title | 用户的职位 |
| Description | 用户对象的说明信息 |
| Office | 用户所在办公室 |
| EmailAddress | 用户的电子邮件地址 |
| Manager | 用户的直属负责人 |
1.8 设置账户过期时间
对于临时账户,可以设置明确的过期时间:
# 设置账户过期时间Set-ADAccountExpiration -Identity qianyue -DateTime "2026-12-31 23:59:59"
# 取消账户过期时间Clear-ADAccountExpiration -Identity qianyue查询账户过期时间:
Get-ADUser -Identity qianyue -Properties AccountExpirationDate | Select-Object Name,Enabled,AccountExpirationDate1.9 管理用户的组成员关系
AD 中的权限通常通过组进行分配,因此组成员关系也是用户管理的重要部分。
# 将用户添加到组Add-ADGroupMember -Identity "Domain Admins" -Members qianyue
# 查看用户所属的组Get-ADPrincipalGroupMembership -Identity qianyue | Select-Object Name,GroupScope,GroupCategory
# 将用户从组中移除Remove-ADGroupMember -Identity "Domain Admins" -Members qianyue -ConfirmDomain Admins 是高权限组,上述命令只适合在实验环境中练习。生产环境中应遵循最小权限原则,并在修改前确认操作对象。
1.10 创建新的用户账户
可以使用 New-ADUser 创建用户,并同时设置初始密码、UPN 和所在 OU:
$password = Read-Host "请输入初始密码" -AsSecureString
New-ADUser ` -Name "浅月" ` -GivenName "月" ` -Surname "浅" ` -SamAccountName "qianyue" ` -UserPrincipalName "qianyue@qy.net" ` -Path "OU=User,OU=Admin,OU=Organization,DC=qy,DC=net" ` -AccountPassword $password ` -Enabled $true ` -ChangePasswordAtLogon $true创建后可以立即进行验证:
Get-ADUser -Identity qianyue -Properties DisplayName,Created | Select-Object Name,SamAccountName,Enabled,Created1.11 用户无法登录的排查流程
当用户反馈无法登录时,可以依次检查账户是否启用、是否被锁定、密码是否过期以及账户本身是否过期。
# 获取账户主要状态Get-ADUser -Identity qianyue ` -Properties LockedOut,PasswordExpired,PasswordNeverExpires,AccountExpirationDate,LastLogonDate | Select-Object Name,Enabled,LockedOut,PasswordExpired,PasswordNeverExpires,AccountExpirationDate,LastLogonDate可以按照以下顺序进行判断:
- 检查
Enabled是否为True。 - 检查
LockedOut是否为True。 - 检查
PasswordExpired是否为True。 - 检查
AccountExpirationDate是否已经超过当前时间。 - 检查用户对象所在 OU 和所属组是否正确。
- 根据问题执行启用、解锁或重置密码操作。
- 再次运行查询命令,确认账户已经恢复正常状态。
例如,对锁定账户执行解锁并验证:
Unlock-ADAccount -Identity qianyue
Get-ADUser -Identity qianyue -Properties LockedOut | Select-Object Name,Enabled,LockedOut需要注意,LastLogonDate 通常根据可复制的 lastLogonTimestamp 转换而来,适合判断长期未使用的账户,但不适合用作精确到分钟的登录审计记录。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!













