簡體   English   中英

在C#中更快地調用PowerShell cmdlet

[英]Invoking PowerShell cmdlets more quickly in C#

我可以使用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類中)。

似乎最好的解決方案是將腳本合並為盡可能少的腳本,以減少管道數量。 我也建議使用PowerShell對象代替Runspaces

同樣,為了在調用后獲得最終Collection中的所有結果,請使用.AddStatement()方法。 如下所示。 AddStatement的文檔

這將需要針對您的環境進行修改,因為我只是簡單地獲取兩次日期以演示將兩個日期都返回到最終集合中。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM