【问题标题】:PowerShell: Compare CSV to ADPowerShell:比较 CSV 和 AD
【发布时间】:2014-03-03 11:28:08
【问题描述】:

我对 PowerShell 还很陌生,我在很多论坛上都发过这个帖子,但是我之前在这里获得过编程帮助,虽然这不是严格的编程,但我希望有人知道答案。

我的组织有大约 5,300 个用户,我们需要为一个客户禁用。有人决定最好地利用我们的时间是让人们通过 AD 并一次禁用它们。当我听到这个消息后,我立即停止了它并使用 PowerShell 获取我们已经拥有的 CSV 列表,并运行一个 cmdlet 来禁用 CSV 列表中的所有用户。

这似乎可行,但我想进行比较。我想将 CSV 文件中的用户与 AD 中的用户进行比较,并确认他们都已被禁用,而无需单独检查所有 5300。我们随机检查了大约 60 个以验证我的运行是否有效,但我想确保没有一个漏掉。

我尝试了几个脚本,并尝试了一些 cmdlet 变体。我尝试过的所有脚本都没有工作,充满了错误。当我尝试使用 csv 文件中的 get-content 或 import-CSV 运行 AD 搜索时,当我导出它时,它给了我大约 7600 个禁用用户(如果我按禁用搜索)。总共只有 5300 个用户,所以它必须给我所有 AD 中的禁用用户。我运行的其他 cmdlet 似乎也在做同样的事情,它会导出整个 AD 列表,而不仅仅是与我的 CSV 文件进行比较。

任何人都可以提供的任何帮助都会有所帮助。

【问题讨论】:

  • 此外,我们正在处理的 CSV 文件只是一个使用 FDN 的用户列表,因此一行的示例是 CN=Users Name,OU=ImInHere,DC=domain, DC=com
  • 所以基本上只是foreach (user in CSV) | $_.Disabled的报告?
  • 奥斯汀,基本上。需要它查看 CSV 以检查用户名,然后在 AD 中检查该用户并查看其是否启用或禁用(我对任何一个都很好),然后向我显示该数据。因此,如果启用了任何一个,我可以确保它们被禁用。

标签: powershell csv import


【解决方案1】:

在不知道 CSV 的确切结构的情况下,我将假设它是这样的: "CN=","OU=","DC=" "JSmith","会计","Foo.com" "BAnderson","HR","Foo.com" "JAustin","IT","Foo.com"

也就是说,如果您的第一个字段实际上包含 CN=(即“CN=JSmith”、“OU=Accounting”、“Foo.com”),您将需要使用 .TrimStart("CN=") 对其进行修剪。

$ToRemove = Import-CSV UserList.csv
$UserList=@()
ForEach($User in $ToRemove){
    $Temp = ""|Select "User","Disabled"
    $Temp.User = $User.'CN='
    If((Get-aduser $Temp.User -Prop Enabled).Enabled){$Temp.Disabled='False'}else{$Temp.Disabled='True'}
    $UserList+=$Temp}
$UserList|?{$_.Disabled -eq 'False'}

这会将 CSV 加载到一个变量中,通过一个检查“CN=”属性的循环运行每个列表,为每个用户创建一个自定义对象,其中只包含他们的姓名以及他们是否被禁用,然后将该对象添加到数组方便以后使用。最后,您将得到 $UserList ,其中列出了原始 CSV 中的每个人以及他们是否被禁用。你可以将它输出到一个文件中,过滤掉那些仍然启用的文件,或者你想要的任何东西。如前所述,如果您的 CSV 实际上每行都有 CN=JSmith,您需要将第 5 行更新为如下所示:

    $Temp.User = $User.'CN='.TrimStart("CN=")

如果 CSV 文件中没有任何标题,则可能需要注入它们。只需在顶部添加一行,如下所示:
CN=,OU=,DC= 或者,如果您有不同的 OU 深度,您可能最好进行 GC,然后通过拆分运行每一行,获取第一部分,从开头修剪 CN=,并检查它们是否被禁用,如下所示:

GC SomeFile.CSV||%{$_.split(",")[0].trimstart("CN=")|%{If((get-aduser $_ -prop enabled).enabled){"$_ is Enabled"}else{"$_ is Disabled"}}}

【讨论】:

    【解决方案2】:

    假设您的 CSV 有一个名为 DN 的列,您可以运行以下命令,这将返回电子表格中已启用的所有用户

    import-csv YourUsersCSV.csv | Get-ADUser -Filter 
         {DistinguishedName -eq $_.DN } |
         where{$_.enabled -eq $true} | 
         Select-Object -Property DistinguishedName,samaccountname,enabled
    

    【讨论】:

    • 我没有 DN 字段。在 CSV 文件中,它只有 CN=、OU= 和 DC=。就是这么深。
    • 我说一个名为 DN 的列 所以你需要在你的 DN 列表顶部放置一个名为 DN 的标题。理解?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多