2

我正在将用户从旧系统迁移到 Active Directory,并且需要将他们添加到 AD 组中。两个系统之间的用户名不匹配(或有任何逻辑!),所以我有一个包含旧用户名和新用户名的 csv:

输入.csv:

SamAccountName,LegacyUsername
ChristopherSpraggons,CSprag
JakeSquirrell,JakeSq
GeorgeCornish,CornishG

我已经编写了 powershell 来进行查找并将用户添加到组中,但理想情况下需要它来报告任何无法匹配到 txt 文件的用户,以便可以手动完成。我完全坚持如何做到这一点。

这是我到目前为止所拥有的:

$ImportCSV = C:\TEST.csv
Import-module ActiveDirectory 
$InputCSV=get-content $ImportCSV
$MatchedUsers = Import-CSV 'Input.csv' | Where{$InputCSV -match $_.LegacyUsername} | ForEach-Object {Add-ADGroupMember -Identity "ADGroupName" -Member $_.SamAccountName}

TEST.csv 只是一个没有标题的旧用户名列表。

4

2 回答 2

2

不要在循环之前过滤 CSV 数据。相反,在循环中放置一个条件并将不匹配的名称添加到第二个数组中:

Import-Module ActiveDirectory

$legacyNames = Get-Content 'C:\TEST.csv'

$NonMatchedUsers = @()
$MatchedUsers = Import-CSV 'Input.csv' | % {
    if ( $legacyNames -contains $_.LegacyUsername ) {
      Add-ADGroupMember -Identity "ADGroupName" -Member $_.sAMAccountName
      $_.sAMAccountName
    } else {
      $NonMatchedUsers += $_.sAMAccountName
    }
  }

不过,我会重命名TEST.csv为类似LegacyNames.txt的名称,因为它首先不是 CSV。

编辑:由于您想TEST.csv成为实际的输入,我建议采用稍微不同的方法。加载Input.csv到哈希表(字典)中并TEST.csv为管道输入:

Import-Module ActiveDirectory

$mapping = @{}
Import-Csv 'Input.csv' | % { $mapping[$_.LegacyUsername] = $_.sAMAccountName }

$NonMatchedUsers = Get-Content 'TEST.csv' | % {
    if ( $mapping.contains($_) ) {
      Add-ADGroupMember -Identity "ADGroupName" -Member $mapping[$_]
    } else {
      $_
    }
  }
于 2013-06-07T11:07:23.137 回答
0

假设您的 CSV 中有标题,您应该能够轻松地使用 PowerShell 的数组方法,而无需重复手动枚举两个 CSV。

$ImportCSV = C:\TEST.csv
Import-Module ActiveDirectory
$InputCSV = Get-Content $ImportCSV | `
 ForEach-Object {
if ($ImportCSV -notcontains $_.UserName) {
 $_ | Out-File C:\MissingNames.txt -Append
} }
于 2013-06-07T10:37:05.987 回答