2016-07-12 4 views
1

У меня есть необходимость избавиться от некоторых пользователей, которые больше не существуют в AD, но все еще установлены в приложении.PowerShell превращает инструкцию if else в цикл Foreach

У меня есть сценарий, который предоставляет список пользователей и присваивает их переменной. На данный момент я хочу список пользователей, которые не являются безусловными. Это работает для одного пользователя:

#One user in an Application 

$Users = $location.Users.FindAll() | where {$_.username -like "*johnsmith*"} | select username 

Username                                           
--------                                           

JohnSmith 


#See if user exists in AD (Match Username with AD UserPrincipalName) 

$users = $repository.Users.FindAll() |where {$_.username -like "*johnp*"} | select username 

$users2 = Get-ADUser -Filter "UserPrincipalName -eq '$($users.username)'" -Properties LastLogonDate 

if (!$users2) 
{ 
Write-Host "$users doesnt exist" 
} 

else 
{ 
Write-Host "$users does exist" 
} 


> @{Username=JohnSmith} doesnt exist 

Проблемы Я получаю кормление это цикл Еогеаспа для нескольких пользователей в переменном. Как я могу поместить это для просмотра объекта для каждого пользователя и вывода тех, которые не существуют?

#List of all users in Appication 

$Users = $location.Users.FindAll() | select username 

Username                                           
--------                                           

JohnSmith 
JohnSmith1 
JohnSmith2 

Пытались, но не работает, показывает существование всех пользователей, даже если JohnSmith оленья кожа существовать как выше:

$users = $location.Users.FindAll() |select username 

$users2 = Get-ADUser -Filter "UserPrincipalName -eq '$($users.username)'" 

foreach ($users2 in $users){ 
if (!$users2) 
{ 
write-host "$users2 doesnt exist" 
} 

else 
{ 
write-host "$users2 does exist" 
} 
} 

PS C:\> 
@{Username=JohnSmith} does exist 
@{Username=JohnSmith1} does exist 
@{Username=JohnSmith2} does exist 

ответ

-1

Не тестировался, но это должно возвращать список всех пользователей приложения, которые не в AD :

$applicationUsers = $location.Users.FindAll() | select username 
$adUsers = Get-ADUser -filter * | select -ExpandProperty UserPrincipalName 
$users = $applicationUsers | Where username -NotIn $adUsers 

И вы можете перебирать их с помощью:

$users | Foreach-Object { $_ } 
+0

Отлично, работал по мере необходимости, спасибо – Ralluhb

+0

'Get-ADUser -filter *' - очень плохая практика. Не могли бы представить, сколько времени это займет для моего AD с более чем девятью тысячами (серьезно) объектами пользовательского типа. Вы должны указать некоторые критерии, иначе может потребоваться слишком много времени для извлечения всех пользовательских объектов. Я только что проверил: 2 минуты 15 секунд и ~ 500 мб моей памяти. – n01d

+0

@ n01d Это не плохая практика сама по себе. Это зависит от его среды, которую мы не знаем, поэтому я не могу дать ему правильные критерии для улучшения производительности, если это необходимо в целом. –

Смежные вопросы