【问题标题】:List user details from Username从用户名列出用户详细信息
【发布时间】:2017-03-13 15:39:51
【问题描述】:

我正在尝试创建一个脚本,该脚本将检查用户名列表并显示用户全名和 AD 中的一些属性设置。基本上,我收到了一份用户名列表,这些用户名只是数字,管理层想知道每个用户名的用户全名。他们还想知道他们工作的部门。

下面是我创建的脚本,它不起作用。

$csv = Import-Csv "C:\temp\users.csv"

foreach ($user in $csv) {
    $name = $user.myid
    Get-ADUser -Filter {EmployeeID -eq $name} -Properties * |
        Get-ADUser -Division $user.Programme
} | Export-Csv "C:\Temp\Results.csv"

【问题讨论】:

    标签: powershell csv active-directory


    【解决方案1】:

    所以我假设在您的 csv 文件中有一个名为 myid 的列,其中包含您需要查找的 id。假设是这种情况,您需要在此处进行一些更改。您需要删除第二个 get-aduser,因为它并没有真正为您做任何事情,并且没有可用于 get-aduser cmdlet 的 -division 开关,如果您需要将结果限制为您的一些设置可以使用 -properties 开关和管道进行选择,如下所示。请记住,如果用户没有在其 AD 帐户上设置“employeeid”和“division”属性,这一切都无关紧要,这在我的经验中相当罕见,但如果贵公司在创建帐户时作为政策问题这样做应该没事。如果您将脚本中的 get-aduser 行替换为该行,它应该会获取任何具有与电子表格中匹配的 EmployeeID 属性的用户的帐户,然后将该人的全名、部门和员工 ID 输出到您的 CSV 文件.

    Get-ADUser -Filter {EmployeeID -eq $name} -Properties "displayname","division","employeeid" | Select-Object "employeeid","displayname","division"
    

    【讨论】:

    • 谢谢,我没有意识到 -Properties。我放弃了这个部门,因为我需要的信息也在 extensionAttribute 上。我最终根据他们的 SamAccountName 来查看我从 HR 发送的 CSV 文件,格式无处不在,并设法获得了他们的显示名称和扩展属性。我只是喜欢 HR 角色推出新的 AD 集成系统。
    【解决方案2】:

    如有疑问,请阅读documentationGet-ADUser 没有参数 -Division。您需要在输出文件中select 所需的属性。另外,foreach loops don't pass output into the pipeline。如果您想将输出直接传递到Export-Csv,则需要一个ForEach-Object 循环:

    Import-Csv 'C:\temp\users.csv' |
        ForEach-Object {
            $name = $_.myid
            Get-ADUser -Filter "EmployeeID -eq $name" -Properties *
        } |
        Select-Object SamAccountName, DisplayName, Division |
        Export-Csv 'C:\Temp\Results.csv' -NoType
    

    否则需要将输出收集到一个变量中:

    $users = foreach ($user in $csv) {
        $name = $user.myid
        Get-ADUser -Filter "EmployeeID -eq $name" -Properties *
    }
    $users | Export-Csv 'C:\Temp\Results.csv' -NoType
    

    或在subexpression 中运行循环:

    $(foreach ($user in $csv) {
        $name = $user.myid
        Get-ADUser -Filter "EmployeeID -eq $name" -Properties *
    }) | Export-Csv 'C:\Temp\Results.csv' -NoType
    

    【讨论】:

      【解决方案3】:

      这是一种通用代码结构,可针对您的场景量身定制,适用于数据收集/枚举和生成 CSV 文件。我们在我的工作场所使用类似的。它包含一些错误处理 - 您最不想要的是 CSV 文件中的结果不准确。

      # Create an array from a data source:
      $dataArray = import-csv "C:\temp\users.csv"
      
      # Create an array to store results of foreach loop:
      $arrayOfHashtables = @()
      
      # Loop the data array, doing additional work to create our custom data for the CSV file:
      foreach($item in $dataArray)
      {
          try
          {
              $ADObject = Get-ADUser -Filter { EmployeeID -eq $item.MyID } -Properties DisplayName,Division -ErrorAction Stop
          }
          catch
          {
              Write-Output "$($item.MyID): Error looking up this ID. Error was $($Error[0].Exception.Message)"
          }
      
          if($ADObject)
          {
              # Create a hashtable to store information about a single item:
              $hashTable = [ordered]@{
                  EmployeeID=$item.myID
                  DisplayName=$ADObject.DisplayName
              }
      
              # Add the hashtable into the results array:
              $arrayOfHashtables += (New-Object -TypeName PSObject -Property $hashTable)
          }
          else
          {
              Write-Output "$($item.MyID): No result found for this ID."
          }
      }
      
      # If the results array was populated, export it:
      if($arrayOfHashtables.Count -gt 0)
      {
          $arrayOfHashtables | Export-CSV -Path "C:\Temp\Results.csv" -Confirm:$false -NoTypeInformation
      }
      

      如其他地方所述,除法不是 AD 对象的属性,因此您可能需要在其他地方查找此数据。如果您可以在 foreach 循环中使用另一行 PowerShell 来执行此操作,则可以将其添加到您的哈希表对象中,如下所示:

      $hashTable = [ordered]@{
          EmployeeID=$item.myID
          DisplayName=$ADObject.DisplayName
          Division=$DivisionFromOtherSource
      }
      

      【讨论】:

      • 在循环中追加到数组必然会表现不佳,因为每次追加操作都会重新创建数组(大小增加一)并复制所有现有元素。不推荐使用这种方法,而且很少有必要(如果有的话)。
      • 谢谢您-知道这很有用。但是,针对约 200 个 Windows 服务器、550 个 VM 和 30,000 个用户的 AD 运行此代码结构的多个实例,在用于整理报告数据的 4GB、2vCPU Windows 服务器上没有明显的性能问题(并且在下游没有报告的数据)服务器)。我们使用这种基本结构的主要原因是因为它可以被 PowerShell 初学者理解并且很容易适应。再次感谢您。
      • 给你一个粗略的估计:$a = 1..10000 | %{$_} vs $a = @(); 1..10000 | %{$a += $_} 的执行时间是 0.3 秒 vs 4.1 秒。
      • 很有趣,但第一个示例只是将数据发送到标准输出流。当您想将该数据存储在其他地方(例如 CSV 文件)时会发生什么?在第二个示例中,$a 可以通过管道传输到 Export-CSV。第一个结果是否会在 CSV 文件中添加 10000 个“-append”?
      • 这两个示例都将一个包含 10000 个整数的列表分配给变量 $a。后者附加在一个循环中,前者分配管道输出。导出到 CSV 与此评估无关。该示例只是为您提供与直接分配性能相比附加性能的大致数字。在您的场景中,差异可能无关紧要,但无论如何都要牢记这一点。
      猜你喜欢
      • 2012-09-26
      • 2014-11-08
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2019-02-28
      相关资源
      最近更新 更多