Почему я использую слишком много дискового пространства с этим кодом? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь извлечь из 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”

Он работает довольно долго и заполняет последние 40 ГБ на диске и выдает ошибки по мере исчерпания пространства.

Я знаю, что в прошлом у меня были подстановочные знаки - свойства и я сталкивался с подобными проблемами (теперь я понимаю, что это понятно), но я не уверен, что является причиной проблемы на этот раз.

{Enabled -eq $true} & -SearchBase ограничивают его примерно 4 тысячами пользователей, и я не думаю, что это займет так много времени, и я понятия не имею, что занимает дисковое пространство.

Заранее спасибо!

1 Ответ

1 голос
/ 07 мая 2019

Небольшое увеличение в вашем коде может привести к желаемым результатам:

$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 возвращает все группы для каждого пользователя в массиве $user.Представьте себе 10 групп на пользователя на 5000 пользователей.У вас будет 50000 групп на пользователя в вашем CSV.

-Properties добавляет атрибуты для возврата из объектов, которые вы запрашиваете.Это не влияет на количество возвращаемых вами объектов, только на размер возвращаемого результата.-Properties * против -Properties Attribute1,Attribute2, вероятно, будет использовать больше памяти, но не повлияет на ваш CSV, так как вы выбираете (Select-Object) атрибуты, которые вы хотите вывести.Если вы запустите Get-ADUser username, он вернет список атрибутов по умолчанию, который, например, не включает mail.Если вы хотите увидеть значение почты вместе с атрибутами по умолчанию, вы должны запустить Get-ADUser username -Properties Mail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...