从CSV读取并比较AD的信息

时间:2014-03-24 15:14:45

标签: powershell csv powershell-v3.0

我有一个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属性employeeNumbertitle的值, <{1}}和department

如果它们不匹配,主CSV中的记录必须是新CSV的一部分,并带有上述相同的标题。

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

mail

最新代码,但我被困住了:

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
      }
    }
  }
}

}

1 个答案:

答案 0 :(得分:0)

我在我的工作中做了类似的事情,基本上做了你正在做的事情并为每个用户运行一个循环。将数据从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=的缩写,所以应该说的是: 对象的名称=&#34;姓氏&#34; 用于确定值的表达式= {$ User。&#39;姓氏&#39;}

但是你有@{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