比较用户AD和CSV文件列Powershell



我在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{}
}
}     

当我将write$usercsv放在if命令之前时;我得到了好用户但在if之后,它用@{user=before写入所有用户,比如"@{user=]username}";所以比较不起作用。

您不需要foreach循环;用CCD_ 1过滤即可。

假设CSV中的User列包含SamAccountNames:

$csvUsers   = Import-Csv -Path 'D:TestUSERAccountstocompare.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:TestUsersNOTinAD.csv' -NoTypeInformation

$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
}
}

最新更新