解析AD用户时的参数错误

时间:2016-01-11 20:25:09

标签: powershell active-directory

我正在尝试解决为什么我使用以下脚本出错。我应该在声明前加上说明脚本正确输出和运行,但总是以相同数量的错误为前缀。

正在使用的CSV文件是自动生成的,并且标题不在第一行,这就是我必须跳过前4行的原因。

这是脚本:

# Getting the name of PCs in the DNS column.
$data = Get-Content -Path c:\admin\scripts\windows\test.csv |
        Select-Object -Skip 4 |
        Out-String |
        ConvertFrom-Csv |
        Select-Object -Property DNS -Unique

$dns = $data.DNS

# REMOVES DOMAIN NAME AND LEAVES JUST THE HOST/USERNAME
[regex]$myregex = "\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S$"

$dns2 = foreach ($DNS in $dns) {
    $myregex.split($dns)
}

$getemail = foreach ($DNS in $dns2) {
    Get-ADUser $DNS -Properties mail | Select-Object -Property mail -Unique
}

Send-MailMessage -Attachments c:\admin\scripts\windows\test.csv -From admin@mydomain.com -To $getemail.mail -Subject "UPDATES OF NON-SUPPORTED APPLICATIONS REQUIRED" -SmtpServer smtp.mydomain.com

这将获取用户的电子邮件地址,并向每个用户发送报告副本。它确实有效,但对于每个正确的电子邮件地址,都有相应的错误:

Get-ADUser : Cannot bind parameter 'Identity' to the target. Exception 
setting "Identity": "Cannot validate argument on parameter: 'Identity'. The 
argument is null or empty.

Supply an argument that is not null or empty and then try the command again.

我只想停止错误,以免对运行此脚本的其他人造成任何混淆。

2 个答案:

答案 0 :(得分:0)

您的输入文件包含不存在的用户身份。要让Get-ADUser跳过它们而不抱怨使用-Filter而不是隐式-Identity

Get-ADUser -Filter "SamAccountName -eq '$DNS'" -Properties mail |
  Select-Object -Property mail -Unique
如果您不确定哪个属性完全匹配,请

或将-LDAPFilterAmbiguous Name Resolution一起使用:

Get-ADUser -LDAPFilter "(anr=$DNS)" -Properties mail |
  Select-Object -Property mail -Unique

编辑:要在字符串中的连字符之前提取部分,最好执行以下操作:

$getemail = $data.DNS | ForEach-Object {
  $_ -replace '-.*'
} | ForEach-Object {
  Get-ADUser -LDAPFilter "(anr=$_)" -Properties mail |
    Select-Object -Property mail -Unique
}

对其余代码的一些其他评论。第一个foreach循环对循环变量和元素列表使用相同的变量:

$dns2 = foreach ($DNS in $dns) {
    $myregex.split($dns)
}
不要这样做。 PowerShell变量名称不区分大小写。

另外,你的正则表达式

[regex]$myregex = "\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S$"

可以像这样简化:

[regex]$myregex = "\S{16}$"

或(如果你不关心确切的字符数),如下所示:

[regex]$myregex = "\S+$"

答案 1 :(得分:0)

再次感谢Ansgar!

经过一些调整后,我将您的建议纳入了脚本中,这是现在完美运行的建议:

$data = Get-Content -path c:\admin\scripts\windows\test.csv | select-object` 
-skip 4 | Out-String | ConvertFrom-Csv | select-object -property DNS -unique

$getuser = $data.dns | ForEach-Object {$_ -replace '-.*'}

$getemail = foreach($dns in $getuser) {get-aduser -filter "(samaccountname` 
-eq '$dns')" -properties mail | select-object -property mail -unique} 

send-mailmessage -attachments c:\admin\scripts\windows\test.csv` 
-from admin@mydomain.com -to $getemail.mail`
-subject "UPDATES OF NON-SUPPORTED APPLICATIONS REQUIRED"`
-smtpserver smtp.mydomain.com

感谢您的协助!

JC