После полудня,
У вас было несколько проблем с тем, что вы пытались сделать:
Одинарные кавычки
$SystemUsers = @(
'NT AUTHORITY\*',
'BUILTIN\*',
'S-*',
'Everyone'
)
Одинарные кавычки являются буквальными строками и не взаимодействуют. В этом случае вы будете искать пользователя с именем NT Authority\*
. Изменив их на двойные кавычки - вы начнете сопоставлять шаблоны. Для получения дополнительной информации см. О правилах цитирования на веб-сайте документации Microsoft.
Спасаясь
В PowerShell символ «\» является escape-символом. Чтобы избежать косых черт - удвойте их:
$SystemUsers = @(
"NT AUTHORITY\\*",
"BUILTIN\\*",
"S-1*",
"Everyone"
)
Для получения дополнительной информации об этом - взгляните на этот вопрос на Stack OverFlow. Кроме того, сопоставление с S-*
даст вам множество совпадений, которые вам не нужны, попробуйте "S-1*"
. Windows SID действительно не изменились с Windows 2000 дней, так что это довольно безопасная вещь
Цикл по массиву
Вкратце - строка не будет сравниваться с массивом при использовании подстановочных знаков. Эта статья демонстрирует это для вас.
Самый простой способ сравнить все элементы в вашем массиве - это перебрать массив:
ForEach ($SystemUser in $SystemUsers) {
}
Матч не содержит
Совпадение - намного лучший способ сопоставления элемента в массиве. Страница Microsoft « О операторах сравнения» даст вам быстрый старт, но в ней есть еще кое-что. Попробуйте что-то вроде:
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"
}
}
Это даст вам соответствующий результат:
BUILTIN\ Администратор существует в Active Directory
BUILTIN\ Администратор - это системная или удаленная учетная запись
BUILTIN\ Администратор существует в Active Directory
BUILTIN\ Администратор существует в Active Directory
... но это только наполовину решает вашу проблему - вас действительно волнует только совпадение, не говоря уже о 2, 3 или 4. Вы также не хотите продолжать тестирование, если нашли совпадение! Расширьте его, чтобы включить образец, переместите строку печати до конца и сделанную работу:
$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\ Администратор - это системная или удаленная учетная запись
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 - взгляните на Get-ADUser в PowerShell