在C#中更快地调用PowerShell cmdlet

时间:2018-07-06 08:45:03

标签: c# powershell azure office365 azure-active-directory

我能够使用C#中的Powershell cmdlet从O365获取用户详细信息。 问题是获取时间。太慢了。

每个用户需要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 :(得分:1)

看来最好的解决方案是将脚本合并为尽可能少的脚本,以减少管道数量。我也建议使用PowerShell对象而不是Runspaces

此外,为了在调用后的最后Collection中获得所有结果,请使用.AddStatement()方法。如下所示。 Documentation for AddStatement

这将需要针对您的环境进行修改,因为我只是简单地获取了两次日期以演示将两个日期都返回到最终集合中。

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

    Collection<PSObject> result = powershell.Invoke();
}