为什么此代码占用太多磁盘空间?

时间:2019-05-07 18:15:29

标签: powershell

我正试图从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将其限制为大约4千个用户,我认为这不会花这么长时间才能运行,而且我也不知道正在消耗多少磁盘空间。

谢谢!

1 个答案:

答案 0 :(得分:1)

稍微增加代码即可达到所需的结果:

ComboBox

在原始代码中,如果您没有为$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" 选择特定的用户对象,则$ groups包含所有已启用AD用户的所有组。这是因为get-aduser将为$user.memberof数组中的每个用户返回所有组。想象每个用户有5000个用户的10个组。您的CSV中每个用户将有50000个组。

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