PowerShell Get-ADUser - 使用自定义 AD 属性作为 IF 条件

PowerShell Get-ADUser - Using custom AD attibutes as IF condition

我需要做的是将特定的 AD 用户和他们的一些属性导出到一个 CSV 文件中。我需要的是一些默认属性,如 NameSamAccountNameEnabled 和一些自定义属性:businesscategoryextensionAttribute9 等。

我正在努力处理我的 if - else 语句,因为它们似乎没有将 employeenumber 与 $null

进行比较
$name = Read-Host -Prompt "Please enter the name for output file."
$filename = $name+".csv"
$domain = @('DOMAIN1','DOMAIN2','DOMAIN3','DOMAIN4')    
$result = foreach ($item in $domain) {    
    Get-ADUser -server $item -Properties businesscategory, extensionAttribute4, 
    extensionAttribute9, extensionAttribute13, employeenumber, Enabled -ResultPageSize 100 -Filter *   
    if (($null -ne $_.employeenumber) -and ($_.employeenumber -notlike '*svc*')) {              
    Select-Object Name, 
    SamAccountName, 
    UserPrincipalName,
    @{n="businesscategory"; e={$_.businesscategory  -join ", "}},               
    @{n="extensionAttribute4";e={$_.extensionAttribute4 -join ", "}},           
    @{n="extensionAttribute9";e={$_.extensionAttribute9 -join ", "}},           
    @{n="extensionAttribute13";e={$_.extensionAttribute13 -join ", "}},         
    DistinguishedName, employeenumber, Enabled
    }  else { (...)

以上是我的部分代码,应该先进入if。它会这样做,但它会导出所有帐户,无论 employeenumber 是否存在。 另一个问题是导出的 CSV 不包含从自定义属性创建的列,而是显示了一些我没有要求的其他属性。

如果我使用 Where-Object 而不是 if - else 并检查如下值,这过去工作正常:

Where-Object { 
($_.SamAccountName      -notlike '*proprietary*') -and                         
($_.UserPrincipalName   -notlike '*proprietary*') -and
($_.SamAccountName      -notlike '*mailbox*') -and (...)

很遗憾,我需要用if - else来进行更复杂的比较和选择,但是想不通

问题出在这一行:

$result = foreach ($item in $domain) {
    Get-ADUser -server $item -Properties ... # => not assigned to any variable

然后在这一行:

if (($null -ne $_.employeenumber) -and ($_.employeenumber -notlike '*svc*')) {

由于 $_ 不存在,您正在比较类似的内容:

$null -ne $null -and $null -notlike '*svc*'

永远是 $false。还值得一提的是,这是一个 foreach loop, different from ForEach-Object, the automatic variable $_ ($PSItem) 在这里没有任何意义。

当使用 Select-Object 作为语句的开头时,下一个问题出现了,没有对象通过管道传递给它。

Select-Object Name, SamAccountName, UserPrincipalName, ...

在这种情况下,if 条件可以通过 LDAP Filtering:

完全删除
# employee number is not `$null` AND employee number is not like `*svc*`
-LDAPFilter "(&(employeenumber=*)(!employeenumber=*svc*))"

代码如下所示:

$name = Read-Host -Prompt "Please enter the name for output file."
$filename = $name + ".csv" # Consider using `$HOME` here, or an absolute Path
$param = @{
    LDAPFilter = "(&(employeenumber=*)(!employeenumber=*svc*))"
    ResultPageSize = 100
    Properties = @(
        'businesscategory'
        'extensionAttribute4'
        'extensionAttribute9'
        'extensionAttribute13'
        'employeenumber'
    )
}
'DOMAIN1','DOMAIN2','DOMAIN3','DOMAIN4' | ForEach-Object {
    $param['Server'] = $_
    foreach($user in Get-ADUser @param) {
        [pscustomobject]@{
            Name                 = $user.Name
            SamAccountName       = $user.SamAccountName
            UserPrincipalName    = $user.UserPrincipalName
            BusinessCategory     = $user.businesscategory  -join ", "
            extensionAttribute4  = $user.extensionAttribute4 -join ", "
            extensionAttribute9  = $user.extensionAttribute9 -join ", "
            extensionAttribute13 = $user.extensionAttribute13 -join ", "
            DistinguishedName    = $user.DistinguishedName
            employeenumber       = $user.employeenumber
            Enabled              = $user.Enabled
            Domain               = $_ # Adding the Domain of this user here
        }
    }
} | Export-Csv $filename -NoTypeInformation