2

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.

Select-Object を使用すると問題なく動作するので、なぜ Group-Object を使用してそのエラーが発生するのだろうかと思います。

どんな助けでも大歓迎です。

編集

Select-Object を使用して実行すると、正常に動作します。

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
4

3 に答える 3

2

@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#でコードがどのように表示されるかを説明することはできません。ローカルランスペースを作成し、その中でグループ化する必要があると思います。

更新:これを使用すると、リモートセッションで使用できるコマンドレットを見つけることができます。

Invoke-Command $session { Get-Command }

Exchangeコマンドレットのほかに、リモートセッションには5つのPowerShellコアコマンドレットがあります:Exit-PSSession、、、、。これらのコマンドレットは、制限されたエンドポイントの一部です。それら以外にコアコマンドレットは存在しません。Get-FormatDataMeasure-ObjectOut-DeafultSelect-Object

于 2012-05-02T16:03:52.187 に答える
2

Exchange が提供するリモート管理セッションでこれを実行していますか? その場合、Exchange が提供するコマンドレットしか実行できず、Group-Object はそれらの 1 つではありません。

于 2012-05-02T07:28:51.510 に答える
0

group-object を実行できなかったため、コマンドレットを次のように変更する必要がありました。

                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());
            }
于 2012-05-03T06:14:17.323 に答える