需要 powershell 脚本来检查用户是否仍在 Active Directory 中

Need powershell script to check if users are still in Active Directory

提问人:Richard Diring 提问时间:10/1/2023 最后编辑:Santiago SquarzonRichard Diring 更新时间:10/1/2023 访问量:69

问:

我有一个从公司的 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

我遇到的问题是:

  1. 并非所有在导出的 CSV 中列出的用户名都采用 samAccountName 格式。有些采用登录名格式。
  2. 我不断收到错误“ObjectNotFound: ((name):ADUser) [Get-ADUser], ADIdentityNotFoundException”,而不是生成 else 语句。

我尝试查找错误以查找解决问题的方法,并找到了一些选项,但它们似乎都不起作用。

我试图捕获错误,但我的工作配置文件没有权限添加我在其他地方找到的应该可以工作的 PowerShell 模块。

PowerShell Active-Directory DuoSecurity

评论

2赞 Santiago Squarzon 10/1/2023
您的Csv的列名(标题)具有用户?
0赞 Richard Diring 10/1/2023
从中提取用户的输入文件的标题列为“用户名”。
2赞 Santiago Squarzon 10/1/2023
我明白了,而且,您能否澄清一下“并非所有导出的 CSV 中列出的用户名都采用 samAccountName 格式”是什么意思。有些是登录名格式。登录名是 samAccountName。您的意思是某些行具有 userPrincipalName 而不是 SAM 吗?
0赞 Richard Diring 10/1/2023
“登录名是 samAccountName。您的意思是某些行具有 userPrincipalName 而不是 SAM 吗?“ 对于我的错误标签造成的混乱,我深表歉意。“用户名”列中的名称是 samAccountName 或 userPrincipleName 格式。
0赞 Santiago Squarzon 10/1/2023
明白了,刚刚看到这个,请记住,如果您希望某人在评论中看到您的回复,您可以@他们,即@Santiago会让我看到通知

答:

0赞 Santiago Squarzon 10/1/2023 #1

您当前的代码有许多语法错误,如果您 CSV 值可以有,或者您可以更改过滤器以针对这两种可能性,请将其放在一边。我添加了一些内联注释,以帮助您遵循代码的逻辑。需要注意的重要一点是,您似乎正在尝试根据是否找到用户来拥有动态属性,这是不可能的,您必须创建统一的对象(具有相同结构、相同属性名称的对象),否则您将丢失数据。samAccountNameUserPrincipalNameExport-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很高兴它做到了,那么你可以考虑接受答案