检查电子邮件是否在从ADGroup中提取的电子邮件的变量列表中

时间:2018-09-01 02:21:08

标签: arrays powershell variables foreach contains

我正在尝试检查从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 :(得分:0)

好像您试图比较$members(这是一个具有对象的数组)(具有属性和值的对象)和$ColValues中的项目(属于一个数组)值

您可能想通过以下方式更改$members变量来解决此问题:

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

或通过以下方式更改if条件:

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

答案 1 :(得分:0)

Get-ADGroupMember函数可以返回组,计算机和用户。我认为您应该过滤掉不是用户的任何内容。

此外,通过使用Select emailaddress,您将获得Kirill Pashkov指出的用户对象数组。您真的只想拥有一组字符串

$members =部分尝试一下:

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

这里Sort-Object -Unique并不是必需的,只是为了确保其中没有重复项。

我无法检查您的代码是否实际上以正确的方式从Excel中获得了$ColValues。也就是说:如果这导致包含电子邮件地址的字符串数组,但如果是这样,也将该数组唯一化:

$ColValues = $ColValues | Sort-Object -Unique

最后的评论:

从Excel收集值之后,您似乎没有关闭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()

答案 2 :(得分:0)

通过消除对数组的需要并稍微简化了脚本,我找到了解决方法。因此,基本上我只是将动作移至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位数的值,它可以完美满足我的需求。