Более быстрый вызов командлетов PowerShell в C # - PullRequest
0 голосов
/ 06 июля 2018

Я могу получить информацию о пользователе из O365, используя командлеты Powershell в C #. Проблема в получении времени. Это слишком медленно.

Каждому пользователю требуется 2 секунды, поэтому если у меня будет масса пользователей, то возникнет проблема со временем.

Здесь я просто хочу напечатать всю информацию пользователя, такую ​​как имя, сведения о группе, лицензии. Как я могу сделать это быстрее?

Пробовал:

        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Pipeline UserDetailsPipe = runspace.CreatePipeline();
        UserDetailsPipe.Commands.AddScript("Get-AzureADUser");
        foreach (PSObject info in UserDetailsPipe.Invoke())  /////////*******
        {
            ArrayList Groups = new ArrayList();   // to hold memberOf
            ArrayList Licenses = new ArrayList(); // to hold of licenses

            string UserPrincipalName = info.Members["UserPrincipalName"].Value.ToString();
            string DisplayName = info.Members["DisplayName"].Value.ToString();

            //Getting MemberOf
            Pipeline memberPipe = runspace.CreatePipeline();
            memberPipe.Commands.AddScript("Get-AzureADUser -ObjectId '" + UserPrincipalName + "'| Get-AzureADUserMembership");

            //Getting Licenses
            Pipeline licensePipe = runspace.CreatePipeline();
            licensePipe.Commands.AddScript("$license = Get-AzureADUserLicenseDetail -ObjectId '" + UserPrincipalName + "' | select ServicePlans ");
            licensePipe.Commands.AddScript("$license.ServicePlans");


                foreach (var licensenames in licensePipe.Invoke())////////*****
                {
                    Licenses.Add(licensenames.Members["ServicePlanName"].Value.ToString());
                }

            foreach (var memberOf in memberPipe.Invoke())////////*******
            {
                Groups.Add(memberOf.Members["DisplayName"].Value.ToString());
            }
       }

Я знаю, что я использую множество конвейеров. Итак, как получить мои ответы, используя только один вызов? (Это может быть и в классе PowerShell).

1 Ответ

0 голосов
/ 09 июля 2018

Похоже, что лучшим решением будет объединить как можно меньше скриптов, чтобы уменьшить количество конвейеров. Я бы также предложил использовать объект PowerShell вместо Runspaces

Также, чтобы получить все результаты в финальном Collection после вызова, используйте метод .AddStatement(). Это продемонстрировано ниже. Документация для AddStatement

Это необходимо изменить в вашей среде, поскольку я просто получаю дату дважды, чтобы продемонстрировать возвращение обеих дат в окончательную коллекцию.

using (PowerShell powershell = PowerShell.Create()) {
    powershell.AddScript("Get-Date");
    powershell.AddStatement().AddScript("Get-Date");

    Collection<PSObject> result = powershell.Invoke();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...