扩大成员
Expanding MemberOf
目前正在为数据保险库/安全审计系统编写 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
组,以便每个唯一的组在导出时都在单独的行上?
使用嵌套循环
ForEach ($user in $users)
{
ForEach ($group in $user.memberOf)
{
# your code to build a CSV row here
}
}
注意。 $table_User += $objRecord
非常慢,每次添加内容时它都会对整个数组进行内存复制 - 所以它变得越来越慢。使用:
$table_User = foreach (...) {}
改为语法,以收集 foreach 循环的输出。
将您的选择输入 ForEach-Object
并使用嵌套循环复制每个 MemberOf
条目的对象,同时通过 [=14= 替换 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
}
}
目前正在为数据保险库/安全审计系统编写 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
组,以便每个唯一的组在导出时都在单独的行上?
使用嵌套循环
ForEach ($user in $users)
{
ForEach ($group in $user.memberOf)
{
# your code to build a CSV row here
}
}
注意。 $table_User += $objRecord
非常慢,每次添加内容时它都会对整个数组进行内存复制 - 所以它变得越来越慢。使用:
$table_User = foreach (...) {}
改为语法,以收集 foreach 循环的输出。
将您的选择输入 ForEach-Object
并使用嵌套循环复制每个 MemberOf
条目的对象,同时通过 [=14= 替换 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
}
}