Exchange 2010上的C#和powershell-术语';组对象';不被承认

Exchange 2010上的C#和powershell-术语';组对象';不被承认,c#,.net,powershell,exchange-server,C#,.net,Powershell,Exchange Server,我必须列出exchange 2010服务器中的所有数据库及其邮箱 在Powershell中我可以运行这个 Get-Mailbox -Server Exc2010 | Group-Object Database | Select-Object name,count Name Count ---- ----- DB01 16 DB04 3 DB02 2 DB03 5 但是如果我在C#中尝试同样的方法 如果我使用Select

我必须列出exchange 2010服务器中的所有数据库及其邮箱

在Powershell中我可以运行这个

Get-Mailbox -Server Exc2010 | Group-Object Database | Select-Object name,count


Name       Count
----       -----
DB01       16
DB04       3
DB02       2
DB03       5
但是如果我在C#中尝试同样的方法

如果我使用Select对象,它可以正常工作,所以我想知道为什么我使用Group对象会出现这种错误

任何帮助都将不胜感激

编辑

如果我使用“选择对象”运行它,它可以正常工作:

Command myCommand = new Command("Get-MailboxDatabase");
myCommand.Parameters.Add("Server", "Exc2010");
Command myCommand2 = new Command("Select-Object");
myCommand2.Parameters.Add("Property", "Name");

pipeLine.Commands.Add(myCommand);
pipeLine.Commands.Add(myCommand2);
Result = pipeLine.Invoke();

PSObject PSResult = Result.FirstOrDefault();
Console.WriteLine("DB Name: " + PSResult.Properties["Name"].Value.ToString());
我知道

The term 'Group-Object' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
DB Name: DB01

您是否在Exchange提供的远程管理会话中运行此会话?如果是这种情况,则只能运行Exchange提供的cmdlet,并且组对象不是其中之一。

是否在Exchange提供的远程管理会话中运行此命令?如果是这种情况,则只能运行Exchange提供的cmdlet,并且组对象不在其中。

@David是对的。只有Exchange命令在远程端点中可用。你需要找到另一个解决方案。下面是我在PowerShell中的实现方式:

$s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://ex1/PowerShell/ -Authentication Basic -Credential (Get-Credential)
Invoke-Command $s { Get-Mailbox } | Group-Object Database -NoElement
请注意,分组发生在邮箱对象到达之后。我不是微软的开发者,所以我不能告诉你C#中的代码应该是什么样子。我想您需要创建一个本地运行空间并在其中进行分组

更新:您可以通过以下方式找到远程会话中可用的cmdlet:

Invoke-Command $session { Get-Command }

除了Exchange cmdlet之外,远程会话中还有5个PowerShell核心cmdlet:
退出PSSession
获取FormatData
度量对象
Out Deafult
选择对象
。这些cmdlet是受限端点的一部分。除此之外,不存在任何核心cmdlet

@大卫是对的。只有Exchange命令在远程端点中可用。你需要找到另一个解决方案。下面是我在PowerShell中的实现方式:

$s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://ex1/PowerShell/ -Authentication Basic -Credential (Get-Credential)
Invoke-Command $s { Get-Mailbox } | Group-Object Database -NoElement
请注意,分组发生在邮箱对象到达之后。我不是微软的开发者,所以我不能告诉你C#中的代码应该是什么样子。我想您需要创建一个本地运行空间并在其中进行分组

更新:您可以通过以下方式找到远程会话中可用的cmdlet:

Invoke-Command $session { Get-Command }

除了Exchange cmdlet之外,远程会话中还有5个PowerShell核心cmdlet:
退出PSSession
获取FormatData
度量对象
Out Deafult
选择对象
。这些cmdlet是受限端点的一部分。除此之外,不存在任何核心cmdlet

我无法运行组对象,因此我必须以以下方式更改cmdlet:

                Pipeline pipeLine = rsRemoteRunspace.CreatePipeline();
                Command myCommand = new Command("Get-Mailbox");
                myCommand.Parameters.Add("Server", Server);

                pipeLine.Commands.Clear();
                pipeLine.Commands.Add(myCommand);
                Mailboxes = pipeLine.Invoke();

                foreach (PSObject obj in Mailboxes)
                {
                    if (mbCount.ContainsKey(obj.Members["Database"].Value.ToString()))
                    {
                        mbCount[obj.Members["Database"].Value.ToString()] += 1;
                    }
                    else
                    {
                        mbCount.Add(obj.Members["Database"].Value.ToString(), 1);
                    }
                }
                pipeLine = null;
            }

            foreach (String Database in mbCount.Keys)
            {
                Console.WriteLine("Database : " + Database + " Mailboxes : " + mbCount[Database].ToString());
            }

我无法运行组对象,因此必须以以下方式更改cmdlet:

                Pipeline pipeLine = rsRemoteRunspace.CreatePipeline();
                Command myCommand = new Command("Get-Mailbox");
                myCommand.Parameters.Add("Server", Server);

                pipeLine.Commands.Clear();
                pipeLine.Commands.Add(myCommand);
                Mailboxes = pipeLine.Invoke();

                foreach (PSObject obj in Mailboxes)
                {
                    if (mbCount.ContainsKey(obj.Members["Database"].Value.ToString()))
                    {
                        mbCount[obj.Members["Database"].Value.ToString()] += 1;
                    }
                    else
                    {
                        mbCount.Add(obj.Members["Database"].Value.ToString(), 1);
                    }
                }
                pipeLine = null;
            }

            foreach (String Database in mbCount.Keys)
            {
                Console.WriteLine("Database : " + Database + " Mailboxes : " + mbCount[Database].ToString());
            }

你能分享更多的代码吗?@ShayLevy,我添加了代码。谢谢你确定你可以使用选择对象吗?@ShayLevy,请查看我的版本,它可以使用选择对象。更新了我的答案,看看为什么选择对象可用。你能分享更多代码吗?@ShayLevy,我添加了代码。谢谢你确定你可以使用选择对象吗?@ShayLevy,请看我的版本,它使用选择对象工作。更新了我的答案,看看为什么选择对象可用。@David,有支持的命令列表吗。请参阅我的上一个版本,我想知道为什么支持Select对象而不支持Group对象。在这里可以找到它们:@m0dest0您可以使用以下命令获得可用cmdlet的列表:Invoke Command$session{get Command}。令人惊讶的是,选择对象在列表中@大卫,有没有一种支持的命令列表。请参阅我的上一个版本,我想知道为什么支持Select对象而不支持Group对象。在这里可以找到它们:@m0dest0您可以使用以下命令获得可用cmdlet的列表:Invoke Command$session{get Command}。令人惊讶的是,选择对象在列表中!