【问题标题】:Exporting certain users' samAccountName from AD to csv with only EmployeeNumbers known将某些用户的 samAccountName 从 AD 导出到 csv,只知道 EmployeeNumbers
【发布时间】:2022-01-23 04:21:02
【问题描述】:

我正在尝试将某些用户的 SamAccountName 和 EmployeeNumber 从 AD 导出到 csv。我在 csv 文件中只有 HR 的 EmployeeNumbers,并且必须将其与 AD 中的 SamAccountName 匹配。我的代码在“如果”条件下不起作用。当我回显输出时,字符串类型的 $a 和 $b 都有相同的值。此文件 C:\temp\UsersToDisable.csv 包含列名为“EmployeeNumber”的 4 和 3 数字。这就是我想出的:

Import-Module ActiveDirectory
$Nums = Import-Csv "C:\powershell\EmployeeNumbers.csv"
$Users = Get-ADUser -Filter "*" -Property EmployeeNumber -SearchBase 
"DC=my,DC=example,DC=com" | Where { $_.EmployeeNumber -ne $null }  | 
Select SamAccountName,EmployeeNumber
Foreach ($user in $Users)
{
$EmployeeNumber = $user.EmployeeNumber

foreach ($Line in $Nums)
    {   
         $number = $line.EmployeeNumber
         $a = $number.toString() 
         $b = $EmployeeNumber.toString()
        echo $a $b
        if($a -eq $b) 
            {
                echo $user.SamAccountName
                $result += ,(Get-ADUser $user.SamAccountName -Properties * | Select SamAccountName,employeeNumber)
            }
    }
} $result | Export-CSV "C:\temp\CCI_All_Users.csv" -NoTypeInformation

感谢您的建议!

【问题讨论】:

    标签: powershell csv attributes export


    【解决方案1】:

    出于性能原因,从目录中加载所有用户,然后再次搜索目录中的同一用户并不是一个理想的解决方案。

    试试下面的代码。对于输入文件中的每个号码,在目录中搜索具有当前 EmployeeNumber 的用户,请求加载 EmployeeNumber 属性。然后仅选择所需的属性并将其导出为 CSV。

    Import-Module ActiveDirectory
    $Nums = Import-Csv "C:\powershell\EmployeeNumbers.csv"
    $Nums | ForEach-Object {
        Get-ADUser -LdapFilter "(EmployeeNumber=$_)" -Property EmployeeNumber -SearchBase "DC=my,DC=example,DC=com" |
        Select-Object SamAccountName, EmployeeNumber
    } | Export-CSV "C:\temp\CCI_All_Users.csv"
    

    【讨论】:

      【解决方案2】:

      Hazrelle's 的替代有用答案,非常相似,但不是循环遍历 CSV 的每一行,而是在一些字符串操作的帮助下利用 LDAPFilter 功能:

      # This assumes there is a column named "EmployeeNumber" in the CSV
      
      $Nums = (Import-Csv "C:\powershell\EmployeeNumbers.csv").EmployeeNumber
      
      # Assuming Nums is an Array with Employee Numbers. i.e.:
      # $Nums => A123,A456,A789
      # $filter would look like this:
      # (|(employeenumber=A123)(employeenumber=A456)(employeenumber=A789))
      
      $filter = [string]::Format(
          '(|(employeenumber={0}))',
          ($Nums -join ')(employeenumber=')
      )
      $params = @{
          Properties = 'EmployeeNumber'
          SearchBase = 'DC=my,DC=example,DC=com'
          LDAPFilter = $filter
      }
      
      Get-ADUser @params | Select-Object samAccountName, EmployeeNumber |
      Export-CSV "C:\temp\CCI_All_Users.csv" -NoTypeInformation
      

      值得一提的是,$result += ,(Get...不推荐

      【讨论】:

      • 感谢您的回复,但脚本返回了空的 csv 文件。我有其他代码确实返回了一些东西,但因为员工编号包含 3 位和 4 位数字,它与其他用户混淆。包含这 3 个数字的行。 Import-Module ActiveDirectory $Nums = Import-Csv "C:\powershell\EmployeeNumbers.csv" foreach ($Line in $Nums) { $num = $Line.EmployeeNumber get-aduser -filter "EmployeeNumber -like '*$num*'" -properties employeeNumber -SearchBase "DC=my,DC=example,DC=com" | Export-CSV "C:\temp\All_Users.csv" -NoTypeInformation -Append }
      • @Watcher 我的回答是从 CSV 上提供的 EmployeeNumber 中找到完全匹配的,您的示例使用的是 -like *..*,这将带来不正确的信息。
      猜你喜欢
      • 2017-01-17
      • 2014-01-23
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2020-07-04
      • 2015-12-13
      • 2018-09-19
      • 2017-09-12
      相关资源
      最近更新 更多