【问题标题】:Powershell cmdlets invoking Only once - C#Powershell cmdlet 仅调用一次 - C#
【发布时间】:2018-12-17 01:36:38
【问题描述】:

我只需要调用一次 PowerShell cmdlet,但我想使用 C# 获取所有 cmdlet 中的所有信息。

例如:

Get-AzureADUser
Get-AzureADUserMembership
Get-AzureADUserLicenseDetail

这所有的 cmdlet 只能被调用一次。但我应该得到所有的信息。 如何在 C# 中使用 PowerShell 类来减少花费的时间?

尝试多次调用:

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());
    }

}

【问题讨论】:

  • 您的实际问题是什么?您是说它们偶然被多次调用,还是您只是在寻找某人为您完成工作,为您提供解决任务所需的代码?如果您有正在使用的代码,请编辑您的问题以包含它。
  • 这和链接的问题一样吗?
  • @ivcubr 是,但没有回应
  • @saravananks 你确定这不是 Azure 的响应时间吗?由于等待 Azure,可能每个命令都需要很长时间。从 Powershell 命令行手动执行它们是否更快? (只需排查问题,看看它是 C# 优化还是 Azure 需要多长时间)

标签: c# powershell azure office365


【解决方案1】:

按照@ivcubr 所说,将所有脚本组合在一起并调用一次,并且在某种程度上比以前的方法更好

public static void Display()
    {
        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        PowerShell UserDetailsPipe = PowerShell.Create();
        UserDetailsPipe.Commands.AddScript("Get-AzureADUser");

        Console.WriteLine("\n{0,-20}{1,-45}{2,-30}{3,-30}", "DisplayName", "UserPrincipalName", "MemberOf", "Licenses");
        Console.WriteLine("{0,-20}{1,-45}{2,-30}{3,-30}", "-----------", "-----------------", "--------", "--------");


        var Users = UserDetailsPipe.Invoke();

        foreach (var info in Users)
        {
            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
            PowerShell newPipe = PowerShell.Create();
            newPipe.Runspace = runspace;
            newPipe.AddScript("Get-AzureADUserMembership -ObjectId '" + UserPrincipalName + "' ; $license = Get-AzureADUserLicenseDetail -ObjectId '" + UserPrincipalName + "' | select ServicePlans ;$license.ServicePlans");
            var AllInfo= newPipe.Invoke();



            try
            {

                foreach (var licensenames in AllInfo)
                {
                    if (licensenames.Members["DisplayName"]!=null)
                        Groups.Add(licensenames.Members["DisplayName"].Value.ToString());
                    if (licensenames.Members["ServicePlanName"] != null)
                        Licenses.Add(licensenames.Members["ServicePlanName"].Value.ToString());
                }
            }

            catch (Exception)
            {

            }


            //Displaying UsersInfo
            for (int groupIndex = 0, licenseIndex = 0; groupIndex < Groups.Count || licenseIndex < Licenses.Count; groupIndex++, licenseIndex++)
            {
                if (groupIndex == 0 && licenseIndex == 0)
                {
                    Console.Write("{0,-20}{1,-45}", DisplayName, UserPrincipalName);
                }
                else
                {
                    Console.Write("{0,-20}{1,-45}", " ", " ");
                }
                if (groupIndex < Groups.Count)
                {
                    Console.Write("{0,-30}", Groups[groupIndex]);
                }
                else
                {
                    Console.Write("{0,-30}", " ");
                }
                if (licenseIndex < Licenses.Count)
                {
                    Console.Write("{0,-30}", Licenses[licenseIndex]);
                }
                else
                {
                    Console.Write("{0,-30}", " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2020-06-27
    • 2014-02-11
    相关资源
    最近更新 更多