使用 PowerShell 在数组中查找通配符匹配

使用 PowerShell 在数组中查找通配符匹配

我有一个要进行 ActiveDirectory 查找的用户列表,但我不想查找列表中出现的系统帐户。我要检查的列表将包含用户帐户的全名。我想使用可预测的模式检查该列表。

我目前正在编写的代码如下所示:

$Usertest = "BUILTIN\Administrator"
$SystemUsers = @(
    'NT AUTHORITY\*',
    'BUILTIN\*',
    'S-*',
    'Everyone'
 )
if ($SystemUsers -contains $UserTest)
{
    Write-Host "$Usertest is a system or deleted account"
}
else
{
    Write-Host "$Usertest exists in Active Directory"
}

显然上面的代码不起作用但它确实传达了我想要完成的任务。

答案1

下午,

您在尝试执行的操作中发现了一些错误:

单引号

$SystemUsers = @(
    'NT AUTHORITY\*',
    'BUILTIN\*',
    'S-*',
    'Everyone'
 )

单引号是文字字符串,不会被解释。在本例中,您将查找名为 的用户NT Authority\*。通过将其更改为双引号 - 您将开始匹配模式。有关更多信息,请参阅关于引用规则在微软的文档网站上。


转义

在 PowerShell 中,“\” 是转义字符。要转义斜线,请将其加倍:

$SystemUsers = @(
    "NT AUTHORITY\\*",
    "BUILTIN\\*",
    "S-1*",
    "Everyone"
 )

有关更多信息,请查看这个问题在 Stack OverFlow 上。此外,匹配S-*将为您提供大量您不想要的匹配项,请尝试"S-1*"。Windows SID 自那以后并没有真正改变Windows 2000 天所以这是一件相当安全的事情


循环遍历数组

简而言之 - 使用通配符时,字符串将不会与数组进行比较。 本文向您演示这一点。

比较数组中所有项的最简单方法是循环遍历数组:

ForEach ($SystemUser in $SystemUsers) { }


匹配不包含

Match 是匹配数组中项目的更好方法。微软的关于比较运算符页面将为您提供快速入门,但还有更多内容。尝试以下操作:

ForEach ($SystemUser in $SystemUsers) {
    if ($Usertest -match $SystemUser)
    {
        Write-Host "$Usertest is a system or deleted account"
    }
    else
    {
        Write-Host "$Usertest exists in Active Directory"
    }
}

综合起来

$Usertest = "BUILTIN\Administrator"
$SystemUsers = @(
    "NT AUTHORITY\\*",
    "BUILTIN\\*",
    "S-1*",
    "Everyone"
 )

 ForEach ($SystemUser in $SystemUsers) {
    if ($Usertest -match $SystemUser)
    {
        Write-Host "$Usertest is a system or deleted account"
    }
    else
    {
        Write-Host "$Usertest exists in Active Directory"
    }
 }

这将为您提供匹配的输出:

Active Directory 中存在 BUILTIN\Administrator

BUILTIN\Administrator 是系统帐户或已删除帐户

Active Directory 中存在 BUILTIN\Administrator

Active Directory 中存在 BUILTIN\Administrator

...但这只能解决一半问题 - 你只关心是否匹配,更不用说 2、3 或 4。如果找到匹配,你也不想继续测试!将其扩展以包含一个 swtch,将行打印移到末尾,工作就完成了:

$Usertest = "BUILTIN\Administrator"
$SystemUsers = @(
   "NT AUTHORITY\\*",
   "BUILTIN\\*",
   "S-1*",
   "Everyone"
)

$HasUserBeenMatchedYet = $false
    ForEach ($SystemUser in $SystemUsers) {
        if ($Usertest -match $SystemUser) {
            $HasUserBeenMatchedYet = $true
            break
        }
    }

if ($HasUserBeenMatchedYet -eq $true) {
    Write-Host "$Usertest is a system or deleted account"
} else {
    Write-Host "$Usertest exists in Active Directory"
}

BUILTIN\Administrator 是系统帐户或已删除帐户

MyStupidFakeUser 存在于 Active Directory 中


奖励积分!

将要测试的用户放入数组中并循环遍历这些用户:

$Usertests = @("MyStupidFakeUser", "NT Authority\Someone")
$SystemUsers = @(
   "NT AUTHORITY\\*",
   "BUILTIN\\*",
   "S-1*",
   "Everyone"
)

ForEach ($UserTest in $userTests) {
    $HasUserBeenMatchedYet = $false
        ForEach ($SystemUser in $SystemUsers) {
            if ($Usertest -match $SystemUser) {
                $HasUserBeenMatchedYet = $true
                break
            }
        }

    if ($HasUserBeenMatchedYet -eq $true) {
        Write-Host "$Usertest is a system or deleted account"
    } else {
        Write-Host "$Usertest exists in Active Directory"
    }
}

...现在您要做的就是实际测试它们是否处于 AD 状态 -看看 PowerShell 中的 Get-ADUser

相关内容