我有一个要进行 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