Encontre uma correspondência curinga em uma matriz com o PowerShell

0

Eu tenho uma lista de usuários nos quais quero fazer uma pesquisa no ActiveDirectory, mas não quero fazer uma pesquisa nas contas do sistema que aparecem na minha lista. Minha lista em que estou verificando terá o nome completo da conta de usuário. Eu gostaria de verificar essa lista usando um padrão previsível.

O código que estou escrevendo atualmente se parece com isso:

$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"
}

Obviamente, o código acima não funciona, mas transmite o que estou tentando realizar.

cyborgcommando0
fonte

Respostas:

1

Tarde,

Você tinha algumas coisas erradas no que estava tentando fazer:

Citações simples

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

Aspas simples são cadeias literais e não são interoperadas. Nesse caso, você procuraria um usuário chamado NT Authority\*. Alterando-as para aspas duplas - você começará a combinar padrões. Para obter mais informações, consulte Sobre as regras de cotação no site de documentação da Microsoft.


Escapando

No PowerShell, o "\" é um caractere de escape. Para escapar das barras, dobre-as:

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

Para obter mais informações sobre isso, consulte esta pergunta no Stack OverFlow. Além disso, a correspondência contra S-*fornecerá muitas correspondências que você não deseja, tente "S-1*". Os SIDs do Windows realmente não mudaram desde o Windows 2000 dias, portanto, é uma coisa bastante segura a se fazer


Loop pela matriz

Em resumo - uma string não se compara a uma matriz ao usar curingas. Este artigo demonstra isso para você.

A maneira mais fácil de comparar todos os itens em sua matriz é percorrer a matriz:

ForEach ($SystemUser in $SystemUsers) { }


A correspondência não contém

A correspondência é uma maneira muito melhor de corresponder um item em uma matriz. A página Sobre os operadores de comparação da Microsoft dará a você um impulso inicial, mas há muito mais que isso. Tente algo como:

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"
    }
}

Juntando tudo

$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"
    }
 }

Isso fornecerá uma saída correspondente:

BUILTIN \ Administrator existe no Active Directory

BUILTIN \ Administrator é um sistema ou uma conta excluída

BUILTIN \ Administrator existe no Active Directory

BUILTIN \ Administrator existe no Active Directory

... mas isso apenas resolve o seu problema - você só se importa se conseguir uma partida, sem falar em 2, 3 ou 4. Você também não quer continuar testando se encontrou uma partida! Estenda-o para incluir um swtch, mova a linha de impressão para o final e faça o trabalho:

$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 é um sistema ou uma conta excluída

MyStupidFakeUser existe no Active Directory


PONTOS BÔNUS!

Enfie os usuários para testar em uma matriz e percorrer esses também:

$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"
    }
}

... agora tudo o que você precisa fazer é testar se eles estão no AD - veja o Get-ADUser no PowerShell

Fazer87
fonte