ADSI查询,我正在尝试查找用于标识是否禁用了本地帐户的标志

问题描述

要尝试获取所有可能的值,我尝试将它们全部打印出来,我认为这是一种获取我感兴趣的值的简单方法。但是,我有兴趣确定帐户是否被禁用,并且似乎我该值不适用于本地帐户吗?这看起来很疯狂,所以我一定想念一些东西。任何帮助将不胜感激。

我已经检查了here,但是没有定义标志,我尝试了明显的操作(“已禁用”,“已启用”),但是正如我所说的没有运气,我从下面的结果中看不到任何明显的东西。

$user_adsi = [ADSI]"WinNT://$ComputerName"
$users = $user_adsi.Children | where { $_.SchemaClassName -eq 'user' } | select *
try
{
    foreach ($user in $users)
    {
        Write-Host $user
        
    }
}

解决方法

您需要检查UserFlags属性的二进制位,以表示禁用用户的十进制2

$disabledUsers = $user_adsi.Children |
    where { $_.SchemaClassName -eq 'user' -and $_.UserFlags[0] -band 2} 

由于UserFlags(类似于UserAccountControl)的类型为PropertyValueCollection,因此您需要索引到其第一个元素[0]


您还可以使用Where()方法创建两个禁用和启用用户列表:

$DisabledUsers,$EnabledUsers = $user_adsi.children.where({$_.SchemaClassName -eq 'user'}).where({$_.UserFlags[0] -band 2},'Split')

Split模式会将满足条件的项目输出到第一个变量($DisabledUsers)中,并将其余项目输出到第二个变量($EnabledUsers)中。