2017-02-16 128 views
2

我对PowerShell的自学经验有限,所以这可能是一些基本的问题,但我似乎无法做到。Powershell:针对属性过滤属性

我在Active Directory中,我需要提取电子邮件地址不以SamAccountName开头的用户列表。 (所以如果你的登录是jdoe,但你的电子邮件是[email protected],那么你的个人资料将被退回)

我已经得到了我所需要的大部分...但我无法弄清楚如何比较这两个属性反对海誓山盟。

现在我已经

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 

谢谢!

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

你甚至可以与第一过滤器结合起来,使用-and操作:

回答

3

在你的第二个管道元件使用脚本块为Where-Object过滤器一样

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 
+1

您只需指定不属于默认属性集的属性。由于默认情况下它拉取'Name'和'samAccountName',所以只需指定'EmailAddress'和'PasswordNeverExpires'。除了缺省值之外,它会将这些属性粘贴到检索到的东西列表中。 – TheMadTechnician

+1

@TheMadTechnician正确,但我很懒,并且通过将它们包含在'$ Properties'列表中,我可以通过'Select-Object'重用该变量;-) –

+0

哦,是的--Properties *只是一个神器在我完成它并进行更改之前,我会进行调整。谢谢! :) – Steve