【问题标题】:Powershell to CSV comparePowershell 到 CSV 比较
【发布时间】:2016-02-08 19:39:45
【问题描述】:

您好,我正在尝试使用在此处找到的一些代码来比较 CSV 和 Active Directory。我有一个包含用户列表的 csv 文件。我想检查这个文件,看看电子表格中“电子邮件”列中的任何内容是否与 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,但它只包含一个字符串值、长度标题以及每行的数值。我可以使用 Out-File 将结果发送到 txt 文件,其中包括屏幕上显示的相同结果,但我真的希望这是一个 csv,而不是 txt 文件。我相信我需要参考 csv 文件和 AD 的属性才能将它们构建到我的导出文件中,但是我在这样做时遇到了麻烦,因为我不确定如何构建是否找到用户的状态或不是。

任何帮助将不胜感激。

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

$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

【问题讨论】:

    标签: powershell export-to-csv


    【解决方案1】:

    我不确定生成的 CSV 应该是什么样子,所以这段代码只是将 CannonicalName 使用 Calculated Properties 添加到 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
    

    【讨论】:

    • 您不会从表达式 E 中提取 CN。我认为您需要在其中使用 select -expand 语句或使用点符号 (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -Properties CanonicalName).CanonicalName。某种错误预防也可能是一个好主意。操作在这个方面有点东西
    • 我试图将电子邮件地址和规范名称输出到电子表格中,并指示该帐户是否在 Active Directory 中列出。我的文本文件输出是这样的:User does exist in OU Joe.User@domain.com Fabrikam.com/Washington/Users/User, Joe 这个脚本的结果在我的原始 csv 中添加了一个额外的列,它显示了规范名称。因此,这种情况的出现表明输入文件和 AD 中存在匹配。我想我可以通过使用它在技术上得到我需要的东西,但这并不是我想要的。
    • @YEMyslf 查看更新后的答案,这是 CSV 的样子吗?
    • 是的,这正是我所需要的。感谢您的帮助!
    • 跟进问题。我希望能够使用它来查询子域,但我在使用 -or 命令时遇到了问题。如果我执行下面列出的操作,我只会在 Cname 字段中得到真/假。为什么? Import-Csv -Path $path | ForEach-Object { $UserExistInOu = $false if($CanonicalName = (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -Properties CanonicalName).CanonicalName -or ($CanonicalName = (Get-ADUser -LDAPFilter "(&(objectclass=user)(mail=$($_.Email)))" -server child.domain.com -Properties CanonicalName).CanonicalName)) { $UserExistInOu = $true }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2011-01-26
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多