csv 在使用某列的信息更新AD之前,是否可以在Set-ADUser cmdlt中使用if语句检查该列是否为空?

velaa5lx  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(113)

我根据下面评论中的回复编辑了我的问题。
我写了一个脚本,从csv文件更新Active Directory。该文件包含许多列,其中一些是空的,这意味着我必须跳过这些列。问题是我不知道提前哪些列是空的,哪些不是,它从文件到文件的变化。该脚本将运行每半小时从人力资源系统拉数据更新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

我想感谢每一个给我留言的人,有些人对我的这种方法非常有用

2w3kk1z5

2w3kk1z51#

如果你想让你的脚本更进一步,你可以设置一个哈希表,用于将CSV列与Set-ADUser参数相关联,在左边(哈希表Keys)你可以放置CSV列名称,在右边(哈希表Values)你可以放置参数名称。例如:

$map = @{
    FirstName           = 'GivenName'
    LastName            = 'Surname'
    Department          = 'Department'
    JobTitle            = 'Title'
    Company             = 'Company'
    EmployeeNumber      = 'EmployeeID'
    WorkAddress         = 'StreetAddress'
    City                = 'City'
    State               = 'State'
    Zip                 = 'PostalCode'
    Country             = 'Country'
    Location            = 'Office'
    WorkstationLocation = 'LogonWorkstations'
    EmailAddress        = 'EmailAddress'
}

这个哈希表将位于代码的顶部,在循环之外,然后您可以使用它的键来迭代对象的属性并检查它们的值是否为null或空:

foreach($ADObjectToUpdate in Import-Csv path\to\csv) {
    $setSplat = @{}
    # for each key in our correlation table
    foreach($key in $map.Keys) {
        # here we get the value of each property
        # of the csv
        $value = $ADObjectToUpdate.$key
        # then we can check if its not null or empty
        if([string]::IsNullOrWhiteSpace($value)) {
            # and if its not, we can assign it to the splatting hash
            $setSplat[$map[$key]] = $value
        }
    }

    # unclear how these 2 are obtained but here,
    # you would need an additional condition for them
    if($DescriptionString) {
        $setSplat['Description'] = $DescriptionString
    }

    if($ADManager) {
        $setSplat['Manager'] = $ADManager
    }

    # now you need to be certain that there is something to update
    # for this user, for this, check if the `$setSplat` has something in it
    if($setSplat.Keys.Count) {
        # unclear how `$CurrentADUser` is obtained here
        Set-ADUser -Identity $CurrentADUser @setSplat
    }
}

相关问题