PowerShell:将CSV与AD进行比较

时间:2014-03-03 11:28:09

标签: powershell csv import

我是PowerShell的新手,我在很多论坛上都发布了这个,但我之前已经从这里获得了编程帮助的成功,虽然这不是严格的编程,但我希望有人可能知道答案。< / p>

我的组织有大约5,300个用户需要为客户端禁用。有人决定最好地利用我们的时间是让人们通过AD并一次禁用它们。很快我得到了它,我停下来并使用PowerShell获取我们已有的CSV列表,然后运行一个cmdlet来禁用CSV列表中的所有用户。

这似乎有效,但我想进行比较。我想比较CSV文件中的用户和AD中的用户,并确认它们全部被禁用,而无需单独检查所有5300。我们检查了大约60个随机的,以验证我的运行是否有效,但我想确保没有任何漏洞。

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

任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

在不知道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"}}}