PowerShell Get-ADUser - 使用自定义 AD 属性作为 IF 条件
PowerShell Get-ADUser - Using custom AD attibutes as IF condition
我需要做的是将特定的 AD 用户和他们的一些属性导出到一个 CSV 文件中。我需要的是一些默认属性,如 Name
、SamAccountName
、Enabled
和一些自定义属性:businesscategory
、extensionAttribute9
等。
我正在努力处理我的 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
我需要做的是将特定的 AD 用户和他们的一些属性导出到一个 CSV 文件中。我需要的是一些默认属性,如 Name
、SamAccountName
、Enabled
和一些自定义属性:businesscategory
、extensionAttribute9
等。
我正在努力处理我的 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