Powershell 与 CSV 比较
Powershell to CSV compare
您好,我正在尝试使用我在此处找到的一些代码将 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,但它只包含一个字符串值,header 表示长度,然后是每行的数值。我可以使用 Out-File 将结果发送到 txt 文件,其中包含与屏幕上显示的结果相同的结果,但我真的希望这是一个 csv,而不是 txt 文件。我相信我需要引用 csv 文件和 AD 的属性,以便将它们构建到我的导出文件中,但我在这样做时遇到了麻烦,因为我不确定如何构建用户是否被发现或不是。
如有任何帮助,我们将不胜感激。
更新 - 最终代码
这是我使用的最终代码。这会将 csv 中的用户与 parent 和 child 域中的 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
我不确定生成的 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 文件:UserExistInOu
、Email
和 CanonicalName
(如果有):
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
您好,我正在尝试使用我在此处找到的一些代码将 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,但它只包含一个字符串值,header 表示长度,然后是每行的数值。我可以使用 Out-File 将结果发送到 txt 文件,其中包含与屏幕上显示的结果相同的结果,但我真的希望这是一个 csv,而不是 txt 文件。我相信我需要引用 csv 文件和 AD 的属性,以便将它们构建到我的导出文件中,但我在这样做时遇到了麻烦,因为我不确定如何构建用户是否被发现或不是。
如有任何帮助,我们将不胜感激。
更新 - 最终代码 这是我使用的最终代码。这会将 csv 中的用户与 parent 和 child 域中的 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
我不确定生成的 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 文件:UserExistInOu
、Email
和 CanonicalName
(如果有):
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