Команда получения пользователя Sitecore powershell

У нас более 200 тысяч пользователей в нашей системе sitecore. Мне нужно экспортировать список пользователей, соответствующих определенным критериям. Я использую для этого сценарий powershell и использую команду get-user для получения пользователей. Затем я просматриваю список пользователей и выбираю тех, которые соответствуют моим критериям; в моем случае это пользователи старше 18 лет. Затем я записываю результат в файл csv, используя export-csv. Я считаю, что это занимает более 1,5 часов.

Мой вопрос: есть ли способ получить пользователя и указать мои критерии возраста старше 18 лет? Поле age хранится в пользовательском свойстве. Кроме того, какие-либо другие эффективные способы (кроме powershell) выполнить то, что я пытаюсь сделать здесь?

Вот исходный код:

function export($user)
{
    $age = $user.profile.GetCustomProperty("age")

    if{$age -gt 18)
    {
        $id = $user.profile.GetCustomProperty("id")
        $firstname = $user.profile.GetCustomProperty("first name")

        $user | select-object -property @{Name="First Name";Expression={$firstname}}, 
            @{Name="Age";Expression={$age}}, 
            @{Name="ID";Expression={$id}} |
        Export-CSV -Path c:\temp\out.csv -Append -NoTypeInformation
    }
}

$users = get-user -Filter * 

if($users -ne $null)
{
    $users | foreach {export($_)}
}

person degmo    schedule 24.01.2016    source источник
comment
Не могли бы вы предоставить пример сценария, показывающий, что вы делаете сейчас для запроса пользователей и фильтрации?   -  person Coding101    schedule 25.01.2016
comment
Спасибо за код. Я обновил свой ответ примером, который должен сработать для вас. Ключи чувствительны к регистру для пользовательских свойств.   -  person Coding101    schedule 26.01.2016


Ответы (2)


Обновление:

Основываясь на вашем примере, я понимаю, почему это занимает так много времени. Вы экспортируете в CSV для каждой итерации.

Попробуй это:

$users = Get-User -Filter * | Where-Object { $_.Profile.GetCustomProperty("age") -gt 18 } 

$property = @(
    "Name",
    @{Name="First Name";Expression={$PSItem.Profile.GetCustomProperty("first name")}}, 
    @{Name="Age";Expression={$PSItem.Profile.GetCustomProperty("age")}}, 
    @{Name="ID";Expression={$PSItem.Profile.GetCustomProperty("id")}}
)
$users | Select-Object -Property $property | Export-CSV -Path c:\temp\out.csv -Append -NoTypeInformation

Старые комментарии:

Чем больше я смотрю на это, я сомневаюсь, что это можно сделать. Свойство age должно быть сериализовано и сохранено в профиле. Если нет более быстрого способа извлечь дату профиля, я не уверен, что еще можно сделать, чтобы ускорить процесс.

Я подозреваю, что вы делаете что-то вроде этого:

Get-User -Filter * | Where-Object { $_.Profile.GetCustomProperty("Age") -gt 18 }

Я не знаю более быстрого способа, чем этот.

person Coding101    schedule 25.01.2016
comment
Я добавил свой исходный код в вопрос. Я изменил свой код, как вы предложили, и он определенно работает быстрее. Теперь это занимает около 30 минут по сравнению с более чем 1,5 часами с исходным кодом. Могу ли я сделать так, чтобы команда Get-User возвращала только интересующие меня поля? Это должно улучшить производительность еще больше, нет? - person degmo; 25.01.2016
comment
Спасибо, что приняли. Сколько теперь бегать? - person Coding101; 26.01.2016
comment
теперь это занимает 20-25 минут; значительное улучшение. Спасибо за помощь. - person degmo; 26.01.2016
comment
Милая. Спасибо, что поделился. Я также добавил ваш образец в книгу здесь: sitecorepowershell.gitbooks.io/sitecore-powershell-extensions/ . Вы также должны удалить -Append из моего примера, так как он будет продолжать добавляться к существующему файлу. - person Coding101; 26.01.2016

Затем я просматриваю список пользователей и выбираю тех, которые соответствуют моим критериям.

Вы не должны этого делать. Вместо этого фильтруйте пользователей напрямую с помощью Get-User

Get-User -Filter * -ResultSize Unlimited | Where-Object {$_.age -ge 18}

В качестве другого примера я буду фильтровать пользователей старше 18 лет, чье имя начинается с «Ste».

Get-User -Filter * -ResultSize Unlimited | Where-Object {$_.age -ge 18 -and $_.FirstName -like "Ste*"}
person sqone2    schedule 25.01.2016
comment
Я вижу несколько проблем с вашими примерами. 1) ResultSize не является свойством, доступным для команды. 2) Возраст является настраиваемым свойством и должен быть доступен из профиля. - person Coding101; 25.01.2016
comment
Вы уверены? Ознакомьтесь с примером 1 — technet.microsoft.com /en-us/library/aa996896(v=exchg.160).aspx - person sqone2; 25.01.2016
comment
@sqone2 Речь идет не о командлете Get-User - это - person Mathias R. Jessen; 25.01.2016