我从公司的 Duo 管理门户下载了一个包含超过 4000 个“非活跃用户”的 CSV 文件。
我正在尝试编写一个可以导出结果的 PowerShell 脚本,如下所示:
我想出的最接近的代码是:
$InputFile = C:\Users\name\desktop\TestingSample1.csv
$CheckADUser = Import-CSV $InputFile | ForEachObject {GetADUser -f "samAccountName -eq $($_.)"}
$OutputFile = C:\Users\name\desktop\DuoInactiveUser.csv
$Result =
if ($CheckADUser -ne $null) {
-Properties samAccountName,mail,enabled | select @{name= '$DuoInactiveUsers.Username';expression= {$_.samAccountName}},@{name= '$DuoInactiveUsers.Email';expression={$_.mail}},@{name= 'DuoInactiveUsers.Enabled';expression={$_.Enabled}}}
else {
@{name= 'DuoInactiveUsers.Username';expression="{$_.samAccountName} not found!"
$Result | Export-CSV $OutputFile -Append
我遇到的问题是:
我尝试查找错误以找到解决问题的方法,并找到了一些选项,但它们似乎都不起作用。
我尝试捕获错误,但我的工作配置文件没有权限添加我在其他地方找到的应该可以工作的 PowerShell 模块。
您当前的代码有许多语法错误,撇开这一点不谈,如果您的 CSV 值可以有
samAccountName
或 UserPrincipalName
,您可以更改过滤器以针对这两种可能性。我添加了一些内联注释来帮助您理解代码的逻辑。需要注意的重要一点是,似乎您正在尝试根据是否找到用户来拥有动态属性,这对于 Export-Csv
来说是不可能的,您必须创建统一的对象(具有相同结构的对象,相同的属性名称)否则您将丢失数据。
$InputFile = 'C:\Users\name\desktop\TestingSample1.csv'
Import-Csv $InputFile | ForEach-Object {
$value = $_.Username
# if the CSV has an empty value here,
if ([string]::IsNullOrWhiteSpace($value)) {
# this is the only way to make the LDAPFilter throw an error
# we must skip, go next..
return
}
$getADUserSplat = @{
LDAPFilter = "(|(samAccountName=$value)(userPrincipalName=$value))"
Properties = 'mail'
}
$user = Get-ADUser @getADUserSplat
$status = 'Found'
# if the user was not found in AD
if (-not $user) {
# use the value we have from the CSV here
$samAccountName = $_.Username
$status = 'Not Found'
}
# `$user.Enabled` and `$user.Mail` will be null if the user was not found
# we don't need to worry about those
[pscustomobject]@{
SamAccountName = $samAccountName
Status = $status
Enabled = $user.Enabled
Mail = $user.Mail
}
} | Export-Csv 'C:\Users\name\desktop\DuoInactiveUser.csv' -NoTypeInformation