Powershell与CSV比较

时间:2016-02-08 19:39:46

标签: powershell export-to-csv

您好我尝试使用我在此处找到的一些代码来比较CSV和Active Directory。我有一个带有用户列表的csv文件。我想查看这个文件,看看" Email"电子表格中的列与AD中的电子邮件地址匹配。如果是,我想列出该电子邮件地址并包含AD中的规范名称,以便我可以轻松查看用户帐户所在的OU。

我正在与之合作:

$path = "C:\Scripts\Import.csv"
$outpath = "C:\Scripts\Export.csv"
$csv = Import-Csv $path 
Import-Module ActiveDirectory


foreach ($line in $csv) 
{
    $User = Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($line.Email)))"  -Properties CanonicalName
    If ($User -ne $Null) {"User does exist in OU" + $line.Email + $User.CanonicalName}
    Else {"User not found in AD OU  - " + $line.Email} 
} 

我已经能够修改它以满足我的需要,但是我在将结果输出到CSV文件时遇到了一些麻烦。如上所示运行脚本会将我想要的内容输出到屏幕,但我希望以CSV格式显示它。如果我这样做:

$Results = foreach ($line in $csv) 

然后使用

$Results | export-CSV $outpath -NotypeInformation 

我创建了csv,但它只包含一个字符串值,标题为Length,然后是每行的数值。我可以使用Out-File将结果发送到txt文件,其中包含与屏幕上显示的结果相同的结果,但我真的希望这是一个csv,而不是txt文件。我相信我需要引用csv文件和AD的属性,以便将它们构建到我的导出文件中,但是我很难做到这一点,因为我不知道如何构建是否存在的状态用户被发现与否。

任何帮助都将不胜感激。

更新 - 最终代码 这是我最后的代码。这会将csv中的用户与父域和子域中的AD用户进行比较。它使用电子邮件地址字段来匹配用户。它抓取Canonical Name,这样我就可以看到用户所在的OU,如果找不到用户,它会在Canonical Name字段中报告。

$path = "$env:userprofile\Desktop\InFile.csv"
$outpath = "$env:userprofile\Desktop\OutFile.csv"

# Importing CSV file 
Import-Module ActiveDirectory
$Users = Import-Csv $path |


ForEach-Object {
     Write-Progress -Activity "Comparing Imported File to Active Directory" -Status "Processing $($_.Email)" 

# Comparing CSV file to Domain.com users
If (
    $Value1 = (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -server Domain.com -Properties CanonicalName).CanonicalName)
     {$_ | Add-Member -MemberType NoteProperty -Name CanonicalName -Value $value1 -PassThru}

# Comparing CSV file to child.Domain.com users
ElseIF (     
    $Value2 = (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -server child.Domain.com-Properties CanonicalName).CanonicalName)
    {$_ | Add-Member -MemberType NoteProperty -Name CanonicalName -Value $value2 -PassThru}

# Writing output for users not found in either domain
Else {$_ | Add-Member -MemberType NoteProperty -Name CanonicalName -Value "Email Address not found in Active Directory" -PassThru}

#Exporting to CSV file


        New-Object -TypeName pscustomobject -Property @{
        Email = $_.Email
        CanonicalName = $_.CanonicalName
        LastName = $_."Last Name"
        FirstName = $_."First Name"

    }

} | Select-Object LastName, Firstname, Email, CanonicalName | Sort-Object CanonicalName | Export-CSV $outpath -NoTypeInformation

1 个答案:

答案 0 :(得分:1)

我不确定生成的CSV应该是什么样子,所以此代码只是使用Calculated PropertiesCannonicalName添加到Import.Csv并将其保存为Export.Csv

$path = "C:\Scripts\Import.csv"
$outpath = "C:\Scripts\Export.csv"
Import-Module ActiveDirectory

Import-Csv -Path $path |
    Select-Object -Property *, @{
        n = 'CanonicalName'
        e = {(Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -Properties CanonicalName).CanonicalName}
    } | Export-Csv -Path $outpath -NoTypeInformation

更新

此版本将创建一个包含3列的新CSV文件:UserExistInOuEmailCanonicalName(如果有):

Import-Csv -Path $path | ForEach-Object {
    $UserExistInOu = $false
    if($CanonicalName = (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -Properties CanonicalName).CanonicalName)
    {
        $UserExistInOu = $true
    }

    New-Object -TypeName pscustomobject -Property @{
        UserExistInOu = $UserExistInOu
        Email = $_.Email
        CanonicalName = $CanonicalName
    }
} | Export-Csv -Path $outpath -NoTypeInformation