【问题标题】:Read from CSV and Compare info against AD从 CSV 读取并与 AD 比较信息
【发布时间】:2014-03-24 15:14:45
【问题描述】:

我有一个 CSV 文件,我将其视为主文件。并非 CSV 中的所有标题都是 AD 中用户的一部分。

主 CSV 具有以下字段:

  • Last Name
  • First Name
  • Last 4 SSN
  • Month of Birth
  • Day of Birth
  • COMPANY Employee ID
  • Titles
  • Department Name
  • Phone Number

我需要将 CSV 中的 Company Employee ID 字段与 AD 中的 employeeNumber 属性进行比较。如果匹配,则应将以下字段写入新的 CSV:

  • Last Name
  • First Name
  • Last 4 SSN
  • Month of Birth
  • Day of Birth
  • COMPANY Employee ID
  • Titles
  • Department Name
  • Phone Number
  • Email Address

Last NameFirst Name 来自 AD,Last 4 SSNMonth of BirthDay of BirthPhone Number 来自主 CSV 文件。

输出 CSV 中的COMPANY Employee IDTitlesDepartment NameEmail Address 应分别采用 AD 属性 employeeNumbertitledepartmentmail 的值。

如果它们不匹配,则来自主 CSV 的记录需要成为具有上述相同标题的新 CSV 的一部分。

@Kobhrl:我无法在评论中添加整个代码。到目前为止,我有以下内容:

Function CheckAD
{
  $MasterFile,$CSV,$AD = @()
  DomainController = "companydc02.companycolo.pvt"
  $companyUsersOU = "OU=company,DC=companycolo,DC=pvt"
  $MasterFile = "C:\scripts\edir\edir_headers01.csv"
  $CSVADMismatch = "C:\scripts\edir\edir_headers01_1.csv"
  $CSV = Import-Csv $MasterFile
  ForEach ($User in $CSV)
  {
    $ClockNumber = $User."company Employee ID"
    Get-ADUser -SearchBase $companyUsersOU -Server $DomainController `
        -Filter '(employeeNumber -eq $ClockNumber)' | ForEach-Object {
      If ($User.$ClockNumber -eq $_.employeeNumber) {
        write-host "Last Name " $_.surname
      }
    }
  }
}

最新代码,但我卡住了:

Function CheckAD
{
 $MasterFile,$CSV,$AD,$Output = @()
 $DomainController = "companydc02.companycolo.pvt"
 $companyUsersOU = "OU=company,DC=companycolo,DC=pvt"
 $MasterFile = "C:\scripts\edir\edir_headers01.csv"
 $CSVADMismatch = "C:\scripts\edir\edir_headers01_1.csv"
 $CSV = Import-Csv $MasterFile
ForEach ($User in $CSV)
{
    $ClockNumber = $User."company Employee ID"
    #Get-ADUser -SearchBase $companyUsersOU -Server $DomainController -Filter '(employeeNumber -eq $ClockNumber)' -Properties * | `
    #Get-ADUser -SearchBase $companyUsersOU -Server $DomainController -Filter '(employeeNumber -eq $ClockNumber)' -Properties * | Select Surname, givenName, employeeNumber, department, mail
    Get-ADUser -SearchBase $companyUsersOU -Server $DomainController -Filter '(employeeNumber -eq $ClockNumber)' -Properties surname,givenName,employeeNumber,department,mail | `
    # If ($AD)
    # {
            # $Output += New-Object PSObject -Property @{
                # "Last Name"=$_.surname
                # "First Name"=$_.givenName
                # "Last 4 SSN"=$User."Last 4 SSN"
            # }
    # ForEach-Object { 
            # write-host "Last Name: " $_.surname
            # write-host "First Name: " $_.givenName
            # write-host "Last 4 SSN: " $User."Last 4 SSN"
            # write-host "Month of Birth: " $User."Month of Birth"
            # write-host "Day of Birth: " $User."Day of Birth"
            # write-host "company Employee ID: " $_.employeeNumber
            # write-host "Titles: " $User."Titles"
            # write-host "Department Name: " $_.department
            # write-host "Phone Number: " $User."Phone Number"
            # write-host "Email Address: " $_.mail              
            # write-host ""
    # }
    #$Ad | Sort-Object -Property sn, givenName | Select SamAccountName,Surname,GivenName,Name,Department,Title,TelephoneNumber,EmployeeNumber | Export-Csv "c:\scripts\ceridian\06-10-2013_ExportedADUsersWithClockNumber.csv" -NoTypeInformation
    Select @{n="Last Name";e={$_.surname}},@{n="First Name";e={$_.givenName}},@{n="Last 4 SSN";e={$User."Last 4 SSN"}},@{a="Month of Birth";b={$User."Month of Birth"}},@{c="Day of Birth";d={$User."Day of Birth"}},@{f="COMPANY Employee ID";g={$_.employeeNumber}},@{i="Titles";j={$User."Titles"}},@{k="Department Name";l={$_.department}},@{m="Phone Number";o={$User."Phone Number"}},@{p="Email Address";q={$_.mail}} | Export-CSV $CSVADMisMatch -NoTypeInformation
    #}
}
#$Output | Sort "Last Name" | Export-CSV $CSVADMisMatch -NoTypeInformation

}

【问题讨论】:

  • 这是一组很好的要求,但在 Stack Overflow 上,您应该已经尝试过解决方案,并且需要帮助来解决您遇到的问题。展示你迄今为止的作品。

标签: powershell csv powershell-3.0


【解决方案1】:

我在我的工作中做过类似的事情,基本上做了你正在做的事情并为每个用户运行一个循环。将 AD 中的数据拉入对象,然后更新自定义对象中的记录。所以,是这样的:

$DomainController = "companydc02.companycolo.pvt"
$companyUsersOU = "OU=company,DC=companycolo,DC=pvt"
$MasterFile = "C:\scripts\edir\edir_headers01.csv"
$CSVADMismatch = "C:\scripts\edir\edir_headers01_1.csv"
$CSV = Import-Csv $MasterFile
$Output = @()
ForEach($User in $CSV){
    Remove-Variable Current
    $Current = Get-ADUser -SearchBase $companyUsersOU -Server $DomainController -Filter '(employeeNumber -eq $ClockNumber)'
    If($Current){ #If AD match is found
        $Output += New-Object PSObject -Property @{
            "Last Name"=$Current.surname
            "First Name"=$Current.givenname
            "Last 4 SSN"=$User.'Last 4 SSN'
            "Other Fields"="Other Values"
        }
    }else{ #If no AD match
        $Output += New-Object PSObject -Property @{
            "Last Name"=$User.'Last Name'
            "First Name"=$User.'First Name'
            "Last 4 SSN"=$User.'Last 4 SSN'
            "Other Fields"="Other Values"
        }
    }
}
$Output|Export-Csv C:\Somefile.csv -NoTypeInformation

您将需要填写各种字段,但这会导入您的主文件,遍历每个用户并在 AD 中查找它们。如果找到它们,它会从现有用户和 AD 创建一个新对象,如果没有找到,它只使用现有用户的值。然后它将该对象添加到主列表中。最后我让它输出到一个新的 CSV。

编辑:所以,你没有使用我的代码,但你说我的代码出错了。您上面的内容与我给您的内容完全不同(注释掉的部分除外)。如果您需要帮助,请使用给您的帮助。如果您不使用所提供的东西,则不要寻求帮助。

由于您的哈希表构造错误,您将无法使用。 @{n="Name";e={Expression}} 的部分有一些随机字母。 n=Name= 的缩写,e=Expression= 的缩写,所以应该说的是: 对象名称 = “姓氏” 确定值的表达式 = {$User.'Last Name'}

但是你有像@{o='Last Name';p={$User.'Last Name'}}这样的随机字母,而Powershell不知道o=p=应该是什么意思,所以它会抛出错误。

现在,您将其作为一个函数,我不知道为什么。你并没有把它当作一个函数来对待。本着出于某种原因保持它的功能的精神,我重新做了你上面所做的以保持它的完整性。这会将其设置为一个函数,然后调用该函数,并将其输出到 CSV。

Function CheckAD{
    Param($MasterFile = "C:\scripts\edir\edir_headers01.csv",
    $DomainController = "companydc02.companycolo.pvt",
    $companyUsersOU = "OU=company,DC=companycolo,DC=pvt")
    $CSV = Import-Csv $MasterFile
    ForEach($User in $CSV)
    {
        $ClockNumber = $User."company Employee ID"
        Remove-Variable AD
        $AD = Get-ADUser -SearchBase $companyUsersOU -Server $DomainController -Filter '(employeeNumber -eq $ClockNumber)' -Properties surname,givenName,employeeNumber,department,mail
        New-Object PSObject -Property @{"Last Name"=if($AD){$AD.surname}else{$User.'Last Name'}
            "First Name"=if($AD){$AD.givenName}else{$User.'First Name'}
            "Last 4 SSN"=$User."Last 4 SSN"
            "Month of Birth"=$User."Month of Birth"
            "Day of Birth"=$User."Day of Birth"
            "COMPANY Employee ID"=if($AD){$AD.employeeNumber}else{$User.'Company Employee ID'}
            "Titles"=$User."Titles"
            "Department Name"=if($AD){$AD.department}else{$User.department}
            "Phone Number"=$User."Phone Number"
            "Email Address"=if($AD){$AD.mail}else{$User.'Email Address'}
        }
    }
}
$CSVADMismatch = "C:\scripts\edir\edir_headers01_1.csv"
CheckAD | Sort "Last Name" | Export-CSV $CSVADMisMatch -NoTypeInformation

【讨论】:

  • 我收到以下错误:表达式或语句中出现意外的令牌“名字”。在 C:\scripts\eDir\Script_eDir.ps1:57 char:83 + $Output += New-Object PSObject -Property @{"Last Name"=$_.surname "First Name"
  • 您能否更新您的问题以显示您的代码?你不能使用我给出的确切代码,否则你不会得到那个错误。
  • 非常感谢......以及您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
相关资源
最近更新 更多