我根据下面评论中的回复编辑了我的问题。
我正在编写一个脚本,从csv文件更新Active Directory。该文件包含许多列,其中一些是空白的,这意味着我必须跳过这些列。问题是我事先不知道哪些列是空白的,哪些不是,它从一个文件到另一个文件都在变化。该脚本将每半小时运行一次,从HR系统中提取数据以更新AD记录。
CSV文件中的列名与AD中的属性名不匹配,因此为了适应这种情况,我创建了一个自定义对象,在该对象中,我基本上定义了名称与AD属性名匹配的属性,并将每列的值分配给该对象的属性。这应该允许我使用splatting来更新AD。
要更新的AD对象包含在名为$CurrentADUser的变量中。
自定义对象从CSV记录中获取值,CSV记录从CSV文件中读取并存储在$CSVUserData中-并非所有记录都在这里,一次只有一条记录在此对象中,因此我不需要在此时循环通过文件中的每条记录,因为此脚本是在不同的函数中编写的,该函数被称为CSV文件循环通过记录。
我似乎不能让它工作。该脚本没有生成错误,但对象的属性似乎没有被后面的For each循环识别,并且它只是在尝试一次后基本上跳过for each循环。
我使用的代码如下,希望有人能为我指出我的错误
Description变量是通过组合$CSVUserData.JobTitle和$CSVUserData.Department的值来设置的,并且由于AD需要将AD对象而不是字符串插入到Manager属性中,因此也在此声明之外对其进行操作。其余部分直接来自CSV记录
$ADObjectToUpdate = [PSCustomobject]@{
GivenName = $CSVUserData.FirstName
Surname = $CSVUserData.LastName
Description = $DescriptionString
Title =$CSVUserData.JobTitle
Department = $CSVUserData.Department
Manager = $ADManager **<- this is an AD object**
Company = $CSVUserData.Company
EmployeeID = $CSVUserData.EmployeeNumber
StreetAddress = $CSVUserData.WorkAddress
City = $CSVUserData.City
State = $CSVUserData.State
PostalCode = $CSVUserData.Zip
Country = $CSVUserData.Country
Office = $CSVUserData.Location
LogonWorkstations = $CSVUserData.WorkstationLocation
EmailAddress = $CSVUserData.EmailAddress
}
$setSplat = @{}
ForEach($_ in $ADObjectToUpdate.PSObject.Properties)
{
If(-not([string]::IsnullOrWhiteSpace($_.Value)))
{
$setSplat[$_.Name] = $_.Value
}
}
Set-ADUser -Identity $CurrentADUser @setSplat
我想感谢每一个给我留言的人,有些人对我的这种方法非常有用
1条答案
按热度按时间iyr7buue1#
如果你想让你的脚本更进一步,你可以设置一个哈希表,用于将CSV列与
Set-ADUser
参数相关联,在左边(哈希表Keys)你可以放置CSV列名称,在右边(哈希表Values)你可以放置参数名称。例如:这个哈希表将位于代码的顶部,在循环之外,然后您可以使用它的键来迭代对象的属性并检查它们的值是否为null或空: