提问人:Richard Diring 提问时间:10/1/2023 最后编辑:Santiago SquarzonRichard Diring 更新时间:10/1/2023 访问量:69
需要 powershell 脚本来检查用户是否仍在 Active Directory 中
Need powershell script to check if users are still in Active Directory
问:
我有一个从公司的 Duo 管理门户下载的 CSV 文件,其中包含超过 4k 的“非活动用户”。
我正在尝试编写一个PowerShell脚本,我可以导出结果,如下所示:
- 对于仍在 Active Directory 中找到的用户 = 用户 - 电子邮件 - 已启用
- 对于在 Active Directory 中找不到的用户 = 用户“未找到”。
我想出的最接近的代码是:
$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
我遇到的问题是:
- 并非所有在导出的 CSV 中列出的用户名都采用 samAccountName 格式。有些采用登录名格式。
- 我不断收到错误“ObjectNotFound: ((name):ADUser) [Get-ADUser], ADIdentityNotFoundException”,而不是生成 else 语句。
我尝试查找错误以查找解决问题的方法,并找到了一些选项,但它们似乎都不起作用。
我试图捕获错误,但我的工作配置文件没有权限添加我在其他地方找到的应该可以工作的 PowerShell 模块。
答:
0赞
Santiago Squarzon
10/1/2023
#1
您当前的代码有许多语法错误,如果您 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
$samAccountName = $user.samAccountName
$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
评论
0赞
Santiago Squarzon
10/2/2023
@RichardDiring很高兴它做到了,那么你可以考虑接受答案
评论