使用Get-ADUser检查AD用户是否存在
在本文中,我将介绍如何使用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
English (US)
Español (ES)
Português (PT)
Français (CA)
Español (MX)
Español (VE)
Español (CO)
Español (AR)
Português (BR)
Quechua (PE)
Guaraní (PY)
简体中文 (ZH)
繁體中文 (HK)
日本語 (JP)
한국어 (KR)
हिन्दी (HI)
Pilipino (PH)
ไทย (TH)
Tiếng Việt (VN)
Bahasa Melayu (MY)
Bahasa Indonesia (ID)
বাংলা (BD)
اردو (PK)
සිංහල (LK)
ភាសាខ្មែរ (KH)
English (UK)
Français (FR)
Deutsch (DE)
Italiano (IT)
Русский (RU)
Nederlands (NL)
Türkçe (TR)
Polski (PL)
Svenska (SE)
Norsk (NO)
Dansk (DK)
Suomi (FI)
Ελληνικά (GR)
Čeština (CZ)
Magyar (HU)
Română (RO)
Български (BG)
Српски (RS)
Українська (UA)



