У меня есть список пользователей, для которых я хочу выполнить поиск 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 ответ1

1

После полудня,

У вас было несколько проблем с тем, что вы пытались сделать:

Одинарные кавычки

$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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .