使用Get-ADUser检查AD用户是否存在

AI摘要
Deepseek提供支持

在本文中,我将介绍如何使用PowerShell cmdlet Get-ADUser检查Active Directory用户是否存在,并展示如何处理一些特殊情况,例如-ErrorAction Stop不起作用,设置$ErrorActionPreference = ‘Stop’也不起作用,以及如何使用try {} catch {}块。

AD cmdlet在某些方面与PowerShell标准不一致。例如,关键cmdlet缺少-WhatIf支持,使用”-Properties”而不是”-Property”(应该使用单数形式;在其他参数上也可以看到这种情况),-ErrorAction的行为不符合许多人的预期,还有一些可能我不知道的问题。

广告
广告图片

快速总结:

[bool] (Get-ADUser -Filter { SamAccountName -eq $SomeSamAccountName })

截图示例

这表明当用户不存在时,-ErrorAction SilentlyContinue似乎不适用于Get-ADUser -Identity。

它还展示了我在本文下方更详细记录的一种成功验证方法。

验证AD用户是否存在 – 失败尝试一

您可能了解到”-ErrorAction Stop”和try {} catch {}块,并期望这样的代码能够工作:

Import-Module ActiveDirectory

$SamAccountName = 'doesNotExist'

try {
    $User = Get-ADUser -Filter { SamAccountName -eq $SamAccountName } -ErrorAction Stop
}
catch {
    Write-Warning -Message "用户不存在。"
} 

但它不会打印警告。设置$ErrorActionPreference = ‘Stop’也不起作用。这至少是这个AD cmdlet的一个bug/缺陷。我想原因是它执行查询没有失败,只是没有找到用户。

验证AD用户是否存在 – 成功尝试一

您可以使用@()符号强制输出为数组,并检查.Count属性是否为0表示不存在,或者大于0表示存在(.Count -gt 0或.Count -eq 1),如下所示:

if (@(Get-ADUser -Filter { SamAccountName -eq $SamAccountName }).Count -eq 0) {
    Write-Warning -Message "用户 $SamAccountName 不存在。"
}

这是有效的。

验证AD用户是否存在 – 成功尝试二

您也可以简单地将返回的结果转换为[bool]类型;这是一个所谓的布尔值,可以是true或false(分别传统上用数字1和0表示)。

$SamAccountName = 'doesnotexist'
[bool] (Get-ADUser -Filter { SamAccountName -eq $SamAccountName }) # 返回 false

$SamAccountName = 'joakimbs'
[bool] (Get-ADUser -Filter { SamAccountName -eq $SamAccountName }) # 返回 true

所以您可以在if语句中检查(我还加入了foreach循环):

foreach ($SamAccountName in 'doesNotExist', 'joakimbs') {
    if (-not [bool] (Get-ADUser -Filter { SamAccountName -eq $SamAccountName })) {
        Write-Warning -Message "用户 ${SamAccountName} 不存在。"
    }
}

使用ADSISearcher验证AD用户是否存在

为了本文的完整性,我将提及一些关于使用ADSI的内容,它也可以在PowerShell版本1中使用。

我的示例基于我在Microsoft Technet上找到的关于ADSI/LDAP的内容,并根据查询仅针对用户的需求进行了一些修改,这些查询是我在自己的wiki文章中查找的(关于从Active Directory获取用户名)。

首先我尝试了Richard Mueller提到的方法,做了这个:

PS D:\> $SamAccountName = 'test'

PS D:\> $Searcher = [adsisearcher] "(sAMAccountName=$SamAccountName)"

PS D:\> if (@($Searcher.FindOne()).Count -eq 1) { "$SamAccountName exists" } else { "$SamAccountName does not exist" }
test exists
PS D:\> get-aduser test
get-aduser : Cannot find an object with identity: 'test' under: 'DC=ad,DC=example,DC=org'.

所以”test”作为SAM账户名被找到,但它不是一个实际的AD用户对象(是另一种类型的对象,见下文)。由于SAM账户名在AD中是唯一的,我想用户和其他类型的对象之间的区别并不总是需要的,但如果需要,以下是如何验证它确实是一个”’用户”’:

# 我想知道"test"是什么类型的对象。
PS D:\> (Get-ADObject -Filter { SamAccountName -eq 'test' }).ObjectClass
group

PS D:\> $SamAccountName = "test"
PS D:\> $Searcher = [adsisearcher] "(&(objectCategory=Person)(objectClass=User)(sAMAccountName=$SamAccountName))"
PS D:\> if (@($Searcher.FindOne()).Count -eq 1) { "$SamAccountName exists" } else { "$SamAccountName does not exist" }
test does not exist

唯一的区别在于LDAP查询中,我添加了”(objectClass=user)”来针对用户,以及”(objectCategory=Person)”来过滤掉否则会包含在结果中的”contact”类型AD对象。您可以使用其他可能比我使用的更好的LDAP查询。

广告
广告图片
温馨提示 : 非特殊注明,否则均为©李联华的博客网原创文章,本站文章未经授权禁止任何形式转载;来自:俄亥俄州·哥伦布 ,欢迎您的访问!
文章链接:https://www.lilianhua.com/use-get-aduser-to-check-if-ad-users-exist.html
请先登录才能参与答题
距本场结束剩 00 00 00 00
轻量应用服务器 2核2G
200M峰值带宽,适用于网站搭建、Web应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

三只松鼠小圆饼奶盐味1000g 休闲零食网红饼干糕点早餐下午茶40袋 三只松鼠小圆饼奶盐味1000g 休闲零食网红饼干糕点早餐下午茶40袋
Loading...
OpenClaw

OpenClaw 龙虾

AI AGENT GATEWAY
在您的服务器部署 OpenClaw,打造专属极速 AI 助手。
零门槛一键部署环境
支持 QQ/飞书/微信 渠道
跨平台指令分发执行
立即安装