我正在尝试根据包含用户名的计算机名称过滤AD中的用户名,例如XXXXXX01BLOGGSJ
(BLOGGSJenter code here
是此示例中的用户名(
为了提取用户名,我使用此方法:
"XXXXXX01BLOGGSJ" | %{($_ -split 'd+')[-1]}
输出是 BLOGGSJ
但是,我需要像这样过滤许多计算机名称,其中一小部分在计算机名称中具有无效的用户名,例如"XXXXXX01RUBBISH">
为了阻止不可避免的错误出现,我正在尝试使用如下所示的-filter {SamAccountName $_}
方法:
"BLOGGSJ", "RUBBISH" | % {Get-ADUser -Server domain.com -Filter{SamAccountName -eq $_ }} | select Name
但不是当我尝试这样做时,这就是我想做的:
“XXXXXX01BLOGGSJ”, “XXXXXX01BLOGGSJ” | % {Get-ADUser -Server domain.com -Filter{SamAccountName -eq "'($_ -split 'd+')[-1]'"}} | select Name
……or various permutations of that. So I am struggling with the syntax I think.
我知道我可以这样做:
"XXXXXX01BLOGGSJ","XXXXXX01RUBBISH" | %{($_ -split 'd+')[-1]} | %{Get-ADUser -Server domain.com -Filter {SamAccountName -eq $_ }} | Select Name
但是在管道的进一步下游还发生了其他事情,需要我以上面显示的方式进行操作。
请帮忙。
特别是因为你说其他事情正在进一步发生,我建议不要试图在一行代码中完成所有操作。
这应该会让你上路:
"XXXXXX01BLOGGSJ","XXXXXX01RUBBISH" | ForEach-Object {
$name = ($_ -split 'd+')[-1]
$user = Get-ADUser -Server domain.com -Filter "SamAccountName -eq '$name'" -ErrorAction SilentlyContinue
if ($user) {
# a user with that SamAccountName was found
[PsCustomObject]@{
ComputerName = $_
SamAccountName = $user.SamAccountName
UserName = $user.Name
}
}
else {
# user not found
[PsCustomObject]@{
ComputerName = $_
SamAccountName = $name
UserName = "User Not found in AD"
}
}
}
输出:
计算机名 Sam帐户名称用户名 ------------ -------------- -------- XXXXXX01BLOGGSJ bloggsj Joe Bloggs XXXXXX01RUBBISH 在 AD 中找不到垃圾用户