PowerShell filer 使用 -filte {SamAccountName -eq $_} 但使用 regex



我正在尝试根据包含用户名的计算机名称过滤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 中找不到垃圾用户

最新更新