我有一个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 Name
和First Name
来自AD,Last 4 SSN
,Month of Birth
,Day of Birth
和Phone Number
来自主CSV文件。
COMPANY Employee ID
,Titles
,Department Name
和Email Address
应采用AD属性employeeNumber
,title
的值, <{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
}
}
}
}
}
答案 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