【发布时间】:2018-12-14 19:48:10
【问题描述】:
我能够使用 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 类中)。
【问题讨论】:
-
大概 O365 会有一个您可以使用的 API?
-
我应该使用 PSCmdlets
-
如果我使用
PowerShell类,那也比上面的方法太慢了 -
我得到了和你一样的结果,即使使用像 Get-Process 这样的东西。事实证明,我必须去删除 CustomPSHostRawUserInterface 和 CustomPsHostUI.cs 中的任何 throw NotImplementedExceptions。我不确定这里内部发生了什么,但我认为对于每个异常,System.Management.Automation 必须进行大量额外处理。运行代码时,观察调试输出窗口,看看是否有很多异常。然后运行另一个命令,例如 Get-ChildItem,它应该有更少的异常。 GCI 的执行时间要快得多。
标签: c# powershell azure office365 azure-active-directory