【问题标题】:Expanding MemberOf扩展成员
【发布时间】:2016-11-22 06:59:16
【问题描述】:

目前正在为数据保险库/安全审计系统开发 PowerShell 脚本。

我目前在使用以下脚本时遇到了一些困难

$table_user = @()
$record_user = [ordered]@{
    "ObjectGUID"         = ""
    "SamAccountName"     = ""
    "Name"               = ""
    "Surname"            = ""
    "GivenName"          = ""
    "Created"            = ""
    "Modified"           = ""
    "LastLogon"          = ""
    "Enabled"            = ""
    "Office"             = ""
    "Company"            = ""
    "Department"         = ""
    "MemberOf"           = ""
    "HomeDirectory"      = ""
}
$Users = Get-AdUser -Filter * -Properties * |
         select ObjectGUID, SamAccountName, Name, Surname, GivenName,
                @{Name='Created';Expression={$_.Created.ToString("yyyy\/MM\/dd HH:mm:ss")}},
                @{Name='Modified';Expression={$_.Modified.ToString("yyyy\/MM\/dd HH:mm:ss")}},
                @{Name="LastLogon";Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp).ToString('yyyy\/MM\/dd HH:mm:ss')}},
                Enabled, Office, Company, Department, MemberOf, HomeDirectory

foreach ($user in $users) {
    $Record_User."ObjectGUID"     = $User.ObjectGUID
    $Record_User."SamAccountName" = $User.SamAccountName
    $Record_User."Name"           = $User.Name
    $Record_User."Surname"        = $User.Surname
    $Record_User."GivenName"      = $User.GivenName
    $Record_User."Created"        = $User.Created
    $Record_User."Modified"       = $User.Modified
    $Record_User."LastLogon"      = $User.LastLogon
    $Record_User."Enabled"        = $User.Enabled
    $Record_User."Office"         = $User.Office
    $Record_User."Company"        = $User.Company
    $Record_User."Department"     = $User.Department
    $Record_User."MemberOf"       = $User.MemberOf
    $Record_User."HomeDirectory"  = $User.HomeDirectory

    $objRecord = New-Object PSObject -Property $Record_User
    $table_User += $objRecord
}

我希望每一行都包含一个唯一的MemberOf,例如;

谁能帮助我如何分隔MemberOf 组,以便每个唯一组在导出时位于单独的行上?

【问题讨论】:

    标签: powershell active-directory active-directory-group


    【解决方案1】:

    使用嵌套循环

    ForEach ($user in $users)
    {
        ForEach ($group in $user.memberOf) 
        {
            # your code to build a CSV row here
        }
    }
    

    注意。 $table_User += $objRecord 非常慢,每次你添加一些东西时它都会对整个数组进行内存复制——所以它变得越来越慢。使用:

    $table_User = foreach (...) {}
    

    使用语法来收集 foreach 循环的输出。

    【讨论】:

      【解决方案2】:

      将您的选择导入ForEach-Object 并使用嵌套循环复制每个MemberOf 条目的对象,同时通过calculated property 替换MemberOf 属性。

      $Users = Get-AdUser -Filter * -Properties * |
               select ... |
               ForEach-Object {
                 if ($_.MemberOf) {
                   foreach ($member in $_.MemberOf) {
                     $_ | Select-Object -Property *,@{n='MemberOf';e={$member}} -Exclude MemberOf
                   }
                 } else {
                   $_   # pass object without memberships as-is
                 }
               }
      

      【讨论】: