我正在调用office365的get-msoluser cmdlet,我在powershell中使用以下cmdlet
Get-MsolUser -UserPrincipalName user@organization.onmicrosoft.com | ForEach-Object{ $_.licenses}
输出是许可证的集合,我希望在c#中运行相同的脚本。所以我写了如下代码
private void displayLicenses(){
Command cmd = new Command("Get-MsolUser");
cmd.Parameters.Add("UserPrincipalName","user@organization.onmicrosoft.com");
Command cmd2 = new Command("ForEach-Object");
cmd2.Parameters.Add("$_.licenses.AccountSku");
Pipeline pipe = Office365Runspace.CreatePipeline();
pipe.Commands.Add(cmd);
pipe.Commands.Add(cmd2);
Console.WriteLine("Before invoking the pipe");
ICollection<PSObject> result = pipe.Invoke();
CheckForErrors(pipe);
Console.WriteLine("Executed command {0} + {1} with no error", cmd.CommandText, cmd2.CommandText);
foreach(PSObject obj in result){
foreach(PSPropertyInfo propInfo in obj.Properties){
Console.WriteLine(propInfo.Name+": "+propInfo.Value+" "+propInfo.MemberType);
}
}
}
但是我仍然在执行此函数时出错
未处理的例外情况: System.Management.Automation.CommandNotFoundException:该术语 “ForEach-Object”未被识别为cmdlet函数的名称, 脚本文件或可操作程序。检查名称的拼写,或 如果路径被包含在内,请验证路径是否正确并尝试 试。
我检查过我的项目是否包含对包含ForEach-Object cmdlet的System.management.Automation.dll文件的引用。
我在powershell中找到了使用此cmd的dll
(Get-Command ForEach-Object).dll
谢谢, 萨蒂亚
答案 0 :(得分:1)
我找出了造成这个问题的问题。这是由于我创建了错误配置的运行空间。
InitialSessionState initalState = InitialSessionState.Create();
initalState.ImportPSModule(new String[] { "msonline" });
//initalState.LanguageMode = PSLanguageMode.FullLanguage;
Office365Runspace = RunspaceFactory.CreateRunspace(initalState);
Office365Runspace.Open();
我正在用空的创建initalstate,当我将其更改为默认值时,它工作正常。在创建默认值时,它包含默认获取的所有模块。
InitialSessionState initalState = InitialSessionState.CreateDefault();
它运作良好。
谢谢, 萨蒂亚
答案 1 :(得分:0)
听起来你正试图在Exchange服务器的远程会话中运行它。这些是NoLanguage约束会话,这意味着您只能在这些会话中运行Exchange cmdlet。如果要使用PowerShell核心语言cmdlet(如foreach-object),则必须在本地会话中执行此操作,并使用Import-PSSession将Exchange函数导入本地会话(隐式远程处理),或使用Invoke-Command并将其指向Exchange服务器上的远程会话。