加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中更快地调用PowerShell cmdlet

发布时间:2020-12-15 22:52:08 所属栏目:百科 来源:网络整理
导读:我可以使用C#中的Power shell cmdlet从O365获取用户详细信息. 问题是取货时间.那太慢了. 每个用户需要2秒钟,因此如果我拥有大量用户,则会导致时间问题. 在这里,我只想打印所有用户的信息,如名称,组详细信息,许可证. 我怎样才能更快地完成? 尝试过一个: Run
我可以使用C#中的Power shell 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类中).

解决方法

看来最好的解决方案是尽可能少地组合脚本以减少管道数量.我还建议使用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();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读