【问题标题】:Powershell & ActiveDirectory - trying to output users in a group and their membershipPowershell & ActiveDirectory - 尝试输出组中的用户及其成员资格
【发布时间】:2015-02-03 07:04:31
【问题描述】:

我是 Powershell 和 Active Directory 的新手,但只有我想要的一半。我正在尝试输出用户列表的组成员身份。该脚本可以做到这一点 - 但我卡住的地方是我想在会员页面的每一行旁边列出用户名(以及逗号或一些分隔符),以便之后我可以在 Excel 中进行一些更简单的排序。我希望输出是

用户1,会员项目1
user1,membershipitem2
user2、membershipitem1 等

我现在才明白

用户1
会员项目1
会员项目2

用户2
会员项目1等

$myDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$users = Get-Content $srcfilename

$users | ForEach-Object{
$_ | Out-File $outfilename -Append

foreach ($domain in $myDomain.Forest.Domains) 
{
$output = Get-ADPrincipalGroupMembership $_ -server $domain.name | Get-ADGroup -Properties * | select name
}

#Trying to append the username at the beginning of each line of their membership, doesn't work properly
$output = $output | Out-String
$output | foreach-object {$_ + "blah"}
$output | Out-File $outfilename -Append
$output = ''
}

【问题讨论】:

    标签: string powershell active-directory


    【解决方案1】:

    .memberof 属性可以为您提供用户的组成员身份,而无需调用另一个 cmdlet。 此外,您可以创建一个 powershell 对象数组,而不是搞乱输出格式,这样可以轻松输出您喜欢的方式或导出到 csv。

    $col = @()
    foreach($user in (Get-ADUser -filter * -Properties memberof )) {
        $user.memberof | %{ 
            $object = [PSCustomObject]@{ 
              Name = $user.name 
              Group = (Get-ADGroup $_ ).name           
            } 
            $col+=$object
        }
    }
    $col 
    $col | Export-Csv -NoTypeInformation c:\somefile.csv
    

    Powershell v3 代码还假设每个用户始终至少有组成员资格,这是一个安全的假设。

    【讨论】:

    • 不要过度使用-Properties * 做属性,您正在回调很多您没有使用。在这种情况下应该只是-Properties memberof
    • 我在运行您的代码时得到以下信息,是否缺少某些内容? cmdlet Get-ADUser 在命令管道位置 1 为以下参数提供值:(键入 !? 表示帮助。)过滤器:!?
    • 另外,我之前有我的时髦循环的原因是用户可能位于不同的域中,是否有类似的方法可以使用您的代码搜索多个域?谢谢!
    • 需要-filter * 来获取所有域用户。纠正了这一点。 Get-Aduser 可用于不同的域
    【解决方案2】:

    另一个答案很可能是更好的方法(阅读我对* 的评论)。如果你只有 PowerShell 2.0,或者如果这个脚本只是图片的一小部分,我想展示一种使用你当前代码逻辑的方法。

    $users | ForEach-Object{
        $singleUser = $_ 
    
        foreach ($domain in $myDomain.Forest.Domains) 
        {
            Get-ADPrincipalGroupMembership $_ -server $domain.name | Get-ADGroup -Properties * | select -expand name | ForEach-Object{
                "$singleUser,$_"
            }
        }
    } | Add-Content $outfilename
    

    这里有很多循环,但我们所做的只是将$singleUser 添加到我们必须遍历每个组成员的输出行中。 Add-Content 也将优于 Out-File 并默认附加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多