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