我有一组文件,表示Active Directory安全组成员的导出。这些文件包含用户电子邮件地址。我想使用PowerShell扫描所有文件(~300(,并使用Get-ADUser cmdlet根据存储在这些文件中的电子邮件地址查找用户帐户名,然后将输出保存在另一个文件夹中的新文件中。
我当然可以做一个不同的AD导出,获取用户帐户名而不是电子邮件地址,但在这种情况下没有帮助,因为我正在将用户访问权限从一个AD域移植到另一个AD域名(两者之间没有任何信任(,唯一能帮助我的是,在旧域中,用户帐户被修改为包含新域的电子邮件地址,因此新旧域中的电子邮件地址都匹配,由于我现在每个AD组都有一个文本文件,其中的电子邮件地址与新域匹配,我可以使用这些地址从新域中获取用户的新帐户名。
到目前为止,我能够列出文件,并使用以下代码进行电子邮件到帐户名称的映射:
$directory = 'c:tempgroupsall'
$files = Get-ChildItem -Path $directory -File *.txt -Recurse | Select -expand fullname
ForEach ($file in $files)
{
Get-Content $file |ForEach-Object
{Get-ADUser -Filter {mail -like $_} -properties mail | Select-Object SamAccountName}
}
然而,现在我正试图弄清楚如何将更改输出回与原始文件同名但放在不同文件夹中的文本文件中。
我相信上面的代码可以做得更好;请耐心听我说,我是初学者。
我希望我能正确理解您的问题,即您希望在新的文件夹路径中为每个组创建一个新文件
这些文件应包含SamAccountName和用户的电子邮件地址,并且每个文件应与输入文件具有相同的名称。
在这种情况下,请尝试:
$directory = 'c:tempgroupsall'
$targetPath = 'C:tempgroupsaccounts'
# create the target directory if not already exists
$null = New-Item -Path $targetPath -ItemType Directory -Force
# get a list of your input files
$files = Get-ChildItem -Path $directory -File -Filter *.txt -Recurse
foreach ($file in $files) {
# read the file, skip empty or whitespace-only lines and skip the first two lines
# loop trhough the content and collect the wanted objects in variable $group
$group = Get-Content -Path $file.FullName | Where-Object { $_ -match 'S' } |
Select-Object -Skip 2 | ForEach-Object {
$mail = $_.Trim()
# try and find a user with this email address
# the -Filter parameter actually takes a string
$user = Get-ADUser -Filter "mail -like '$mail'" -Properties mail
if ($user) {
# output an object with both email address and SamAccountName
$user | Select-Object SamAccountName, mail
}
else {
# output a similar object where SamAccountName contains 'User Not Found'
[PsCustomObject]@{SamAccountName = 'User Not Found'; mail = $mail }
}
}
# now export the result to a new (csv) file in the target directory with the same name as the input file
$targetFile = Join-Path -Path $targetPath -ChildPath ('(0}.csv' -f $file.BaseName)
$group | Export-Csv -Path $targetFile -NoTypeInformation -UseCulture
}
- 通过创建CSV文件,您可以将每个用户的属性保存在一起,这比文本文件中只有一个属性的单行信息要丰富得多
- Export Csv上的
-UseCulture
开关可确保Csv使用本地安装的Excel所需的分隔符,因此,如果需要,您只需双击这些文件即可在Excel中打开