首页 > 解决方案 > [PowerShell]获取内容并添加列条目?

问题描述

我正在尝试将用户列表输入 PowerShell 并获取附加到用户帐户的特定安全组。目前,我有两个部分 - 一个包含多条数据的 Excel 表,以及一个仅包含用户用户名的 .txt。我目前的脚本只是从 .txt 中输入用户的用户名,并从他们的帐户中获取与特定前缀匹配的安全组,但是我注意到这样做并没有给出任何特定的顺序。即使用户按特定顺序(完全从 excel 文档复制和粘贴),实际输出也不能很好地返回。

所以,这就是我现在想做的,我只是不知道怎么做。我想从Excel文档中获取内容,取所有的用户名,像我现在一样做Get-ADPrincipalGroupMembership,然后将安全组写回与用户名匹配的行。例如,如果我在 SG 中查找 msnow,它将获取 msnow 的 SG,然后将 SG 写回具有 msnow 的行,并继续遍历列表。它不只是做一个 Out-GridView,它实际上会将它写入 Excel 文档。

对完成这项工作有任何帮助吗?

这是我现在拥有的代码。

Import-Module ActiveDirectory

$Names = Get-Content C:\Temp\Users.txt
$Records = @()

Foreach ($ADUsers in $Names) {
    Try {
        $SG = Get-ADPrincipalGroupMembership -Identity $ADUsers | Select Name | Where {$_.Name -Like "SG - *"}
        $SGName = $SG.Name
    }
    Catch [ADIdentityNotFoundException] {
        $SGName = "User not found"
    }
    $Records += New-Object PSObject -Property @{"UserName" = $ADUsers;"Security Group" = $SGName}
}

Write-Host "Generating CSV File..."
$Records | Out-GridView

谢谢!

标签: powershell

解决方案


如果您将 Excel 保存为 CSV,那么它看起来像

"用户名","安全组","InsideInfo"
"bloggsj","","高个子"
"ftastic","","没什么值得一提的"

事情不应该那么难做。

$out = 'D:\Test\Updated_usersandgroups.csv'
$csv = Import-Csv -Path 'D:\Test\usersandgroups.csv'

Write-Host "Updating CSV File..."
foreach ($user in $csv) {
    try {
        $SG = Get-ADPrincipalGroupMembership -Identity $user.UserName -ErrorAction Stop
        # if more groups are returned, combine them into a delimited string
        # I'm using ', ' here, but you can change that to something else of course
        $SGName = ($SG | Where-Object {$_.Name -Like "SG - *"}).Name -join ', '
    }
    catch [ADIdentityNotFoundException] {
        $SGName = "User $($user.UserName) not found"
    }
    catch {
        # something else went wrong?
        $SGName = $_.Exception.Message
    }
    # update the 'Security Group' value
    $user.'Security Group' = $SGName
}

Write-Host "Generating updated CSV File..."
$csv | Export-Csv -Path $out -UseCulture -NoTypeInformation

# show output on screen
$csv | Format-Table -AutoSize  # or -Wrap if there is a lot of data

# show as GridView (sorts by column)
$csv | Out-GridView

控制台中的输出看起来像

用户名安全组 InsideInfo              
-------- -------------- ----------              
bloggsj SG - Group1, SG - Group1 高个子                
ftastic SG - Group1 没什么值得一提的

注意:我不知道您的 Excel 在保存到 CSV 文件时使用什么分隔符。在我的荷兰机器上,它使用分号;,所以如果在您的情况下这不是逗号,请将分隔符作为参数添加到Import-Csvcmdlet:-Delimiter ';'

Excel 使用您的语言环境中设置的任何内容作为分隔符的 ListSeparator。在 PowerShell 中,您可以通过执行(Get-Culture).TextInfo.ListSeparator. 在输出时,-UseCulture开关将确保它使用该分隔符,以便 Excel 能够理解


推荐阅读