我正在尝试检查从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
来说,所有内容都正确列出了吗?
答案 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位数的值,它可以完美满足我的需求。