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

0

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

O código que estou escrevendo atualmente é parecido com isto:

$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.

    
por cyborgcommando0 22.02.2018 / 01:15

1 resposta

1

Tarde

Você tinha algumas coisas erradas com o que estava tentando fazer:

Citações simples

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

As aspas simples são strings literais e não são interperadas. Nesse caso, você estaria procurando um usuário chamado NT Authority\* . Ao alterá-las 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.

Escapar

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

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

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

Loop através da matriz

Em resumo - uma string não se compara a um array ao usar curingas. This 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) { }

Correspondência não contém

A correspondência é uma maneira muito melhor de corresponder um item em uma matriz. A página página Sobre operadores de comparação da Microsoft dar-lhe um salto, mas há muito mais do 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 lhe dará uma saída correspondente:

BUILTIN\Administrator exists in Active Directory

BUILTIN\Administrator is a system or deleted account

BUILTIN\Administrator exists in Active Directory

BUILTIN\Administrator exists in Active Directory

... mas isso só resolve metade do seu problema - você só se importa se tiver uma correspondência, quanto mais 2, 3 ou 4. Você também não quer continuar testando se encontrou uma correspondência! Estenda-o para incluir um swtch, mova a impressão da linha até o final e execute 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 is a system or deleted account

MyStupidFakeUser exists in Active Directory

PONTOS BONIFICADOS!

Cole os usuários para testar em uma matriz e faça um loop entre eles 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 estão no AD - dê uma olhada no Get-ADUser no PowerShell

    
por 22.02.2018 / 04:59