问题描述
我不太擅长 Powershell,我尝试编写一个脚本来将 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 命令之前放置一个 write $usercsv 时;我得到了好用户 但是在 if 之后,它会在之前用 @{User= 写入所有用户,例如“@{User=username}”,因此比较不起作用。
谢谢:)
解决方法
为此您不需要 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
,
如果您正在处理的域很大,$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
}
}