Exchange 2010 上的 C# 和 powershell - 无法识别术语“组对象”
本文关键字:术语 识别 对象 组对象 上的 2010 powershell Exchange | 更新日期: 2023-09-27 18:32:48
我必须列出 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# 中尝试相同的方法,
//Running cmdlets remotely
WSManConnectionInfo wsConnectionInfo = new WSManConnectionInfo(new Uri("https://" + ExchangeSite + "/powershell"),
"http://schemas.microsoft.com/powershell/Microsoft.Exchange", getCredential());
wsConnectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
wsConnectionInfo.SkipCACheck = true;
wsConnectionInfo.SkipCNCheck = true;
wsConnectionInfo.SkipRevocationCheck = true;
rsRemoteRunspace = RunspaceFactory.CreateRunspace(wsConnectionInfo);
rsRemoteRunspace.Open();
Collection<PSObject> Result = null;
Pipeline pipeLine = rsRemoteRunspace.CreatePipeline();
Command myCommand = new Command("Get-MailboxDatabase");
myCommand.Parameters.Add("Server", "Exc2010");
Command myCommand2 = new Command("Group-Object");
myCommand2.Parameters.Add("Property", "Database");
pipeLine.Commands.Add(myCommand);
pipeLine.Commands.Add(myCommand2);
Result = pipeLine.Invoke();
我明白,
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.
如果我使用选择对象,它工作正常,所以我想知道为什么我在使用组对象时会收到该错误。
任何帮助将不胜感激。
编辑
如果我使用选择对象运行它,它可以正常工作:
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());
我明白,
DB Name: DB01
您是否在 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:Exit-PSSession
、Get-FormatData
、Measure-Object
、Out-Deafult
和 Select-Object
。这些 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());
}