我可以使用 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 的文档 https://learn.microsoft.com/en-us/dotnet/api/system.management.automation.powershell.addstatement?view=powershellsdk-1.1.0
这需要根据您的环境进行修改,因为我只是获取日期两次以演示将两个日期返回到最终集合。
using (PowerShell powershell = PowerShell.Create()) {
powershell.AddScript("Get-Date");
powershell.AddStatement().AddScript("Get-Date");
Collection<PSObject> result = powershell.Invoke();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)