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