【问题标题】:Check if email is within variable list of emails pulled from ADGroup检查电子邮件是否在从 ADGroup 提取的电子邮件的可变列表中
【发布时间】:2019-02-07 00:16:23
【问题描述】:

我正在尝试检查从 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

【问题讨论】:

    标签: arrays powershell variables foreach contains


    【解决方案1】:

    我通过消除对数组的需要并稍微简化脚本找到了解决方案。所以基本上我只是将操作移到 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 个左右的值,它完美地满足了我的需要。

    【讨论】:

      【解决方案2】:

      Get-ADGroupMember 函数可以返回组、计算机和用户。我认为你应该过滤掉任何不是用户的东西。

      此外,通过使用Select emailaddress,您将获得一组用户对象,正如 Kirill Pashkov 已经指出的那样。你真的只想拥有一个 strings 数组。

      试试这个$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 中收集值后,您似乎没有关闭它。
      最好养成在使用如下代码时关闭和释放 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()
      

      【讨论】:

      • 感谢您对关闭 ComObjects 的反馈。有点令人困惑,这一切到底在做什么,所以希望能详细说明一下,以便我能更好地理解它的各个部分。
      【解决方案3】:

      您似乎试图比较 $members 这是一个 对象数组(具有属性和值的对象)和来自 $ColValues 的项目,这是一个 值数组强>。

      您可能希望通过以这种方式更改 $members 变量来解决此问题:

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

      或者这样改变if的条件:

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

      【讨论】:

      • 更改$members 似乎Write-Host 中的所有电子邮件都在$members 和来自$ColValue 的适当电子邮件中,创建双倍和三倍以及不准确的输出。 更改if似乎为所有内容输出Write-Host,但为VIP ADGroup中的那些添加变量电子邮件,而为所有其他人添加不带变量的字符串?
      • 我打错了。它应该是 $members.emailaddress.contains($email)
      • 不起作用不是很有帮助。尝试在两者之间输出一些步骤以查看您要比较的内容。 $members 包含什么; $ColValues 包含什么等等。您可以通过首先使用 -Unique 参数对两个列表进行排序来消除双打。
      • 像他说的那样调整他的if 语句,它会写出名字,一些重复的名字idk 为什么,然后偶尔会在新的一行上加上`is a VIP`。我测试了 $email 和 $members 两者都是正确的电子邮件列表。
      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 2021-12-23
      • 1970-01-01
      • 2016-04-12
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多