Powershell:针对属性过滤属性

时间:2017-02-16 19:48:53

标签: powershell active-directory

我使用PowerShell进行有限的,自学成才的经验,所以这可能是基本的,但我似乎无法做到正确。

我在Active Directory中,我需要提取一个用户列表,其中的电子邮件地址并不是以他们的SamAccountName开头的。 (因此,如果您的登录名是jdoe,但您的电子邮件是johndoe@mycompany.com,那么您的个人资料将被退回)

我已经得到了我需要的大部分内容......但我无法弄清楚如何将两种属性相互比较。

现在我有

Get-ADUser -Filter 'enabled -eq $true' -Properties *| 
Where {$_.PasswordNeverExpires -eq $false} | 
Select Name, SamAccountName, EmailAddress, PasswordNeverExpires

我尝试了一些不同的东西来过滤我需要的东西,下面的命令显示了我想要的东西(但当然这种语法不起作用)

Get-ADUser -Filter 'enabled -eq $true' -Properties *| 
Where {$_.PasswordNeverExpires -eq $false} | 
Where-Object EmailAddress -Contains SamAccountName | 
Select Name, SamAccountName, EmailAddress, PasswordNeverExpires

谢谢!

1 个答案:

答案 0 :(得分:3)

在第二个管道元素中使用Where-Object过滤器的脚本块:

Where-Object { $_.EmailAddress -notlike "$($_.SamAccountName)*" }

您甚至可以使用-and运算符将其与第一个过滤器结合使用:

Where-Object { $_.PasswordNeverExpires -eq $false -and $_.EmailAddress -notlike "$($_.SamAccountName)*" }

最后,仅指定您需要的属性而不是-Properties *(无需等待域控制器返回您不需要的数据):

$Properties = 'Name','SamAccountName','EmailAddress','PasswordNeverExpires'
Get-ADUser -Filter 'enabled -eq $true' -Properties $Properties |Where-Object {
    $_.PasswordNeverExpires -eq $false -and 
    $_.EmailAddress -notlike "$($_.SamAccountName)*" 
} |Select-Object $Properties