【问题标题】:Set title based off employeeid根据employeeid设置标题
【发布时间】:2018-07-30 13:53:31
【问题描述】:

我编写了一个脚本,我想读取一个 CSV 文件并对员工 ID 进行评分,并根据员工 ID 设置用户标题。我在每次通过 CSV 运行时循环所有 samaccount 名称的脚本遇到问题。

$CSVFiles = Import-CSV "C:\T2\SetUserAttributes\EIDTitle.csv"

ForEach($CSVFile in $CSVFiles) { Get-ADUser -Filter * -Properties employeeid | ? {(($CSVFile.EmployeeID))} | Select SamAccountName -ExpandProperty SamAccountName | Sort-Object SamAccountName }

这就是 CSV 文件的样子

EmployeeID  Title
109216  Associate
109215  Vice President
108686  Vice President

【问题讨论】:

  • 这是非常低效的。您应该在循环之前将 AD 查询存储在变量中,而不是在循环的每次迭代中搜索所有用户的通配符。
  • 问题只是速度慢吗?

标签: arrays powershell import-csv


【解决方案1】:

根据您的示例,您似乎想知道如何有效地执行 If 语句。 TheIncorrigible1 在 cmets 中指出,在 foreach 中调用 Get-ADUser 效率极低。您可以调用一次 Get-AdUser 并将输出通过管道传输到“If”,该“If”会针对 EmployeeID 属性查找 Contains。

$Titles = Import-CSV "C:\T2\SetUserAttributes\EIDTitle.csv"
Get-ADUser -Filter * -Properties employeeid | ?{
    $Titles.EmployeeID.Contains($_.EmployeeId)
}

但是当我阅读完整的帖子时,我看到您想要更改 AD 中的标题以对应 CSV 文件中的标题。差异不是 a if 我们将转到 foreach-object 语句将 AD-Users 放入名为 $Users 的 var 中,然后对 CSV 变量执行 where 语句。此时我们将使用 Set-ADUser 设置标题并将信息输出到控制台。

$Titles = Import-CSV "C:\T2\SetUserAttributes\EIDTitle.csv"
Get-ADUser -Filter * -Properties employeeid | %{
    $User = $_
    $Titles | Where{$_.EmployeeID -eq $USer.EmployeeID} | Set-ADUser $User -Title $_.Title | %{Write-Output "$($User.SamAccountName) : $($_.Title)"}
} 

【讨论】:

  • 我无法让您的代码在没有错误的情况下执行。我最终收集了与提交的 ID 匹配的 SamAccountName 和 EmployeeId。将它们放入 CSV 执行 vlookup 将数据复制到新的 CSV。并将其导入以完成用户标题的设置。
  • @JRN 你遇到了什么错误?
猜你喜欢
  • 2017-06-19
  • 2018-06-25
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多