Проверьте, находится ли электронная почта в списке переменных сообщений, извлеченных из ADGroup - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь проверить, находится ли электронное письмо из массива, извлеченного из столбца в Excel, в списке электронных писем из группы AD, и если это так, выведите это письмо с Write-Host для уведомления.

Clear-Host

$objExcel = New-Object -ComObject Excel.Application
$WorkBook = $objExcel.Workbooks.Open("C:\Users\Status.xlsx")
$WorkSheet = $WorkBook.Sheets.Item("PS1")
$members = Get-ADGroupMember -Identity VIP | 
Get-ADUser -Properties emailaddress | Select emailaddress

$startRow = 2
$ColValues = @()
$count = $Worksheet.Cells.Item(65536, 7).End(-4162)
for ($startRow; $startRow -le $count.row; $startRow++) {
    $ColValues += $Worksheet.Cells.Item($startRow, 6).Value()
}

foreach ($email in $ColValues) {
    if ($members -contains $email) {
        Write-Host "$email is a VIP!" -ForegroundColor Red
    } else {}
}

Write-Host " "
Write-Host "Complete!" -ForegroundColor Green

Если я запускаю приведенный выше код, он просто переходит к Complete! - но все правильно перечисляется для $email, $ColValues и $members?

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Функция Get-ADGroupMember может возвращать группы, компьютеры и пользователей. Я думаю, что вы должны отфильтровать все, что не является пользователем.

Также, используя Select emailaddress, вы получите массив пользовательских объектов , как уже указывал Кирилл Пашков. Вы действительно хотите иметь массив строк .

Попробуйте это для $members = части:

$members   = Get-ADGroupMember -Identity VIP -Filter {objectClass -eq "user"} |
             Get-ADUser -Properties Emailaddress | 
             Select-Object -ExpandProperty Emailaddress | 
             Sort-Object -Unique

Здесь Sort-Object -Unique не обязательно, но только для того, чтобы убедиться, что там нет дубликатов ..

Я не могу проверить, действительно ли ваш код правильно получает $ColValues из Excel. То есть: если это приводит к массиву из строк , содержащему адреса электронной почты, но если это так, также унифицируйте этот массив:

$ColValues = $ColValues | Sort-Object -Unique

Заключительное замечание:

Похоже, вы не закрыли Excel после того, как собрали значения из него.
Лучше всего иметь привычку закрывать и выпускать ComObjects, когда закончите с таким кодом:

$objExcel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($WorkBook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
0 голосов
/ 07 сентября 2018

Я нашел решение, исключив необходимость в массиве и немного упростив сценарий. Поэтому я просто переместил действие в оператор for для каждого значения по мере его получения.

Clear-Host

$objExcel = New-Object -ComObject Excel.Application
$WorkBook = $objExcel.Workbooks.Open("C:\Users\Status.xlsx")
$WorkSheet = $WorkBook.Sheets.Item("PS1")
$members = Get-ADGroupMember -Identity VIP | Get-ADUser -Properties emailaddress | Select emailaddress

$startRow = 2
$count = $Worksheet.Cells.Item(65536, 7).End(-4162)
for ($startRow; $startRow -le $count.row; $startRow++) {
{

    $emails = ($Worksheet.Cells.Item($startRow, 4).Value())
    $computerName = ($Worksheet.Cells.Item($startRow, 1).Value())

    if (($members -match $emails) -and ($emails -like "*")) {

        Write-Host "$emails is a VIP! " -ForegroundColor Green -NoNewline
        Write-Host " Computer Name: $computerName"

    } else {}   

}

Write-Host " "
Write-Host "Complete!" -ForegroundColor Green

Единственным недостатком было то, что я потерял способность легко удалять дубликаты и форматировать их как таблицы. Но, учитывая, что выводятся только 30-значные значения, он отлично работал для того, что мне было нужно.

0 голосов
/ 01 сентября 2018

Похоже, вы пытаетесь сравнить $members, который представляет собой массив объектов (объект со свойством и значением) и элементы из $ColValues, который представляет собой массив значений,

Вы можете исправить это, изменив переменную $members следующим образом:

$members = Get-ADGroupMember -Identity VIP | 
Get-ADUser -Properties emailaddress | Select -ExpandProperty emailaddress

Или измените if условие таким образом:

If ($members.emailaddress.Contains($email)) 
...