[ADSI]::Exists判断用户存在异常求助:误判非存在用户为存在
解决[ADSI]::Exists判断用户存在性总是返回True的问题
我来帮你理清这个问题——你遇到的[ADSI]::Exists始终返回True的情况,大概率是因为传入的LDAP路径格式不对,或者没有指定正确的用户查找范围。
先说说[ADSI]::Exists的正确用法
这个命令的核心是检查精确的LDAP对象路径是否存在,如果你只传入类似[ADSI]::Exists("LDAP://Lotzi")这种模糊路径,它并不会去查找用户,反而可能因为路径解析逻辑返回True(比如默认匹配到域内某个无关对象,或者路径格式错误导致的误判)。
正确的姿势是构造完整的用户LDAP路径,格式如下:
$username = "Lotzi" # 替换成你的域的完整DN,比如DC=contoso,DC=com $domainDN = "DC=yourdomain,DC=com" # 假设用户在默认的Users容器下,若在自定义OU则替换CN=Users为对应的OU路径 $userLDAPPath = "LDAP://CN=$username,CN=Users,$domainDN" [ADSI]::Exists($userLDAPPath)
这样如果用户Lotzi不存在,命令就会返回False了。
更灵活的替代方案:用ADSI搜索器查找用户
如果不知道用户所在的具体OU,硬编码路径显然不现实。这种情况下,用DirectorySearcher来全局搜索用户会更靠谱,它会遍历域内所有容器查找目标用户:
function Test-UserExists { param( [Parameter(Mandatory=$true)] [string]$Username, # 默认使用当前登录域,也可以手动指定 [string]$Domain = $env:USERDOMAIN ) $searcher = New-Object System.DirectoryServices.DirectorySearcher # 设置搜索根为目标域 $searcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$Domain") # 过滤条件:匹配用户对象,且登录名(sAMAccountName)等于目标用户名 $searcher.Filter = "(&(objectClass=user)(sAMAccountName=$Username))" # 搜索范围:遍历整个域的所有子容器 $searcher.SearchScope = "Subtree" # 查找第一个匹配结果,有结果则返回True,否则返回False return $null -ne $searcher.FindOne() } # 测试调用 Test-UserExists -Username "Lotzi"
域环境下更简洁的方法:用Get-ADUser
如果你的机器安装了Active Directory模块(域控制器或安装了RSAT工具的客户端),直接用Get-ADUser会更简单:
function Test-ADUserExists { param([Parameter(Mandatory=$true)][string]$Username) try { # 查找用户,找不到则抛出错误 Get-ADUser -Identity $Username -ErrorAction Stop return $true } catch { return $false } }
总结
- 用
[ADSI]::Exists必须提供精确的用户LDAP完整路径,否则会出现误判; - 推荐用
DirectorySearcher,无需额外模块,适配所有域环境,且无需预先知道用户所在OU; - 若有AD模块权限,
Get-ADUser是最简洁的方案。
内容的提问来源于stack exchange,提问作者Lotzi11
相关产品推荐
相关产品推荐

