【问题标题】:Compare User AD and CSV file column Powershell比较用户 AD 和 CSV 文件列 Powershell
【发布时间】:2021-03-09 09:47:51
【问题描述】:

我不太擅长 Powershell,我尝试编写一个脚本来比较 CSV 中的“用户”列与我的所有用户 AD。

我需要在 CSV 中获取所有用户,而不是在我们的 AD 中。

这是我写的:

$csvfile = Import-CSV USERAccountstocompare.csv
$alladusers = Get-ADUser -Filter * | Select sAMAccountName

foreach($user in $alladusers){
$userAD = $alladusers.SamAccountName

foreach($usercsv in $csvfile){

if ($usercsv | where {$_.user -ne "$userAD"}){ write "$usercsv"}

else{}
}
}     

当我在 if 命令之前写一个 $usercsv 时;我得到了好用户 但在 if 之后,它会将所有用户写入 @{User= 之前,例如“@{User=username}”,因此比较不起作用。

谢谢你:)

【问题讨论】:

  • 您需要扩展对象属性或使用点表示法来获取对象属性中的值。
  • 我们还没有收到您的来信.. 任何给定的答案是否解决了您的问题?如果是这样,请通过单击左侧的 图标来考虑accepting。这将帮助有类似问题的其他人更轻松地找到它,并有助于激励其他人回答您将来可能遇到的任何问题。

标签: powershell csv active-directory script


【解决方案1】:

你不需要 foreach 循环;只需使用Where-Object 过滤即可。

假设 CSV 中的 User 列包含 SamAccountNames:

$csvUsers   = Import-Csv -Path 'D:\Test\USERAccountstocompare.csv'
$allADUsers = Get-ADUser -Filter * | Select-Object -ExpandProperty sAMAccountName
$notADUsers = $csvUsers | Where-Object { $allADUsers -notcontains $_.User }

# output on screen
$notADUsers | Format-Table -AutoSize

# output to new CSV file
$notADUsers | Export-Csv -Path 'D:\Test\UsersNOTinAD.csv' -NoTypeInformation

【讨论】:

    【解决方案2】:

    如果您正在处理的域很大,$alladusers = Get-ADUser -Filter * | Select sAMAccountName 不是一个好主意。使用Where-Object 也不是过滤大对象的好主意,powershell.org 上有一篇非常酷的文章,Dave Wyatt 和 Don Jones 解释了过滤对象的不同方法及其效率,遗憾的是它被某些人删除了原因。

    我会做这样的事情,假设你的 Csv 对每个用户都有一个“用户”列:

    $result=New-Object System.Collections.ArrayList
    #result array will be only the user that do not exist in AD
    
    $csvfile = Import-CSV USERAccountstocompare.csv
    
    foreach($line in $csvfile.User)
    {
        $filter="(|(Name=$line)(samAccountName=$line))"
        $adusr=Get-ADuser -LDAPFilter $filter
    
        if(!$adusr)
        {
            $result.add($line) > $null
        }
    }
    

    如果相反,您想要一个包含在 Csv 和 AD 上的用户以及仅在 Csv 中的用户列表,您可以执行以下操作:

    $result=New-Object System.Collections.ArrayList
    #result array will be only the user that do not exist in AD
    
    $csvfile = Import-CSV USERAccountstocompare.csv
    
    foreach($line in $csvfile.User)
    {
        $filter="(|(Name=$line)(samAccountName=$line))"
        $adusr=Get-ADuser -LDAPFilter $filter
    
        if(!$adusr)
        {
            $result.add(
                [pscustomobject]@{
                    'Not In AD'=$line
            }) > $null
        }
        else
        {
            $result.add(
                [pscustomobject]@{
                    'In AD and Csv'=$line
            }) > $null
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多