0

我在 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}”,所以比较不起作用。

谢谢 :)

4

2 回答 2

0

为此,您不需要 foreach 循环;只需过滤Where-Object.

假设UserCSV 中的列包含 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
于 2021-03-09T10:24:57.593 回答
0

$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
    }
}
于 2021-03-09T14:42:46.187 回答