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

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应用、容器环境、电商独立站等
立即前往
扫码进入
扫描二维码购买
文澜千文

文澜千文

请登录以使用此功能。

法丽兹抹茶慕斯味巧克力夹心曲奇饼干休闲零食团购食品礼物115g/盒 法丽兹抹茶慕斯味巧克力夹心曲奇饼干休闲零食团购食品礼物115g/盒
Loading...