为什么我在此代码中使用了太多磁盘空间?



我正在尝试从AD中提取一些可读变量,以下工作。

$user = get-aduser "username" -Properties memberof, emailAddress, extensionattribute2, manager, physicalDeliveryOfficeName, url
$groups = ForEach ($group in $user.memberof){(Get-ADGroup $group).Name}
$groupStr = $groups -join "; " #Change "; " to "`r`n" for line break seperator
$user | Select-Object `
@{N="firstName";E={$_.GivenName}}, `
@{N="lastName";E={$_.Surname}}, `
@{N="email";E={$_.EmailAddress}}, `
@{N="businessArea";E={$_.extensionattribute2}}, `
@{N="accountName";E={$_.SamAccountName}}, `
@{N="manager";E={$_.Manager -replace '^CN=|,.*$'}}, `
@{N="office";E={$_.physicalDeliveryOfficeName}}, `
@{N="standardProfile";E={$_.url}}, `
@{n='Groups'; e={$groupStr}} | Export-CSV -NoTypeInformation "c:out.csv"

但是,当我Get-aduser "username"交换为:Get-aduser -Filter {Enabled -eq $true} -SearchBase “ou=redacted,ou=UserAccounts,dc=redacted,dc=com”

它运行了相当长的时间,并填满了磁盘上的最后 40gb,并在空间不足时出错。

我知道过去我已经通配了 -Properties 并遇到了类似的问题(现在我明白了),但我不确定这次是什么导致了这个问题。

{Enabled -eq $true}-SearchBase将其限制为大约 4000 个用户,我认为运行时间不会花这么长时间,而且我不知道是什么占用了磁盘空间。

提前感谢!

代码中的轻微增强可以实现您想要的结果:

$users = get-aduser -filter "Enabled -eq '$true'" -Properties memberof, emailAddress, extensionattribute2, manager, physicalDeliveryOfficeName, url
$users | Foreach-Object {
$groups = ForEach ($group in $_.memberof) {
(Get-ADGroup $group).Name
}
$groupStr = $groups -join "; " #Change "; " to "`r`n" for line break separator
$_ | Select-Object @{N="firstName";E={$_.GivenName}},
@{N="lastName";E={$_.Surname}},
@{N="email";E={$_.EmailAddress}},
@{N="businessArea";E={$_.extensionattribute2}},
@{N="accountName";E={$_.SamAccountName}},
@{N="manager";E={$_.Manager -replace '^CN=|,.*$'}},
@{N="office";E={$_.physicalDeliveryOfficeName}},
@{N="standardProfile";E={$_.url}},
@{n='Groups'; e={$groupStr}}
} | Export-CSV -NoTypeInformation "c:out.csv"

在原始代码中,如果未为get-aduser选取特定用户对象,则$groups包含所有已启用的 AD 用户的所有组。这是因为$user.memberof将返回$user数组中每个用户的所有组。想象一下,每个用户有 10 个组,5000 个用户。CSV 中每个用户将有 50000 个组。

-Properties添加要从要查询的对象返回的属性。它不会影响您返回的对象数,而只影响返回结果的大小。-Properties *vs.-Properties Attribute1,Attribute2可能会使用更多内存,但不会影响您的 CSV,因为您正在选择要输出的属性(Select-Object)。如果运行Get-ADUser username,它将返回默认的属性列表,其中不包括mail例如。如果要查看邮件值以及默认属性,则必须运行Get-ADUser username -Properties Mail

最新更新