エイリアスのコレクションを Exchange サーバーに追加しようとしています。これは、Powershell コマンドレットを介してのみ実行できます。Microsoftにはpowershellの下にラッパーがあり、分散呼び出しは実行空間でのみ実行できるため、これにはSystem.Management.Automationユーティリティを使用します。エイリアスを追加するコマンドは次のようになります。
Set-Mailbox -Identity john@contoso.com -EmailAddresses @{add=”john@northamerica.contoso.com”}
Set-Mailbox がコマンドである場合、他のすべてのフィールドはパラメーターであり、@add は新しい要素を既存のコレクションに追加することを示しています。
Exchange 実行空間が PSLanguageMode.NoLanguage モードで実行されているため、実行できるのはコマンドのみで、スクリプトは実行できません。このアプローチでは例外が発生します。
Command addAliasCommand = new Command("Set-Mailbox -Identity john@contoso.com -EmailAddresses @{add=”john@northamerica.contoso.com”}", true);
パラメーターを指定した clear コマンドのみを実行できます。
Command addAliasCommand = new Command("Set-Mailbox", true);
addAliasCommand.Parameters.Add("identity", "test@test.onmicrosoft.com");
addAliasCommand.Parameters.Add("EmailAddresses", "testing.alias10@test.onmicrosoft.com, testing.alias11@test.onmicrosoft.com");
しかし、新しいものを追加/削除したいときに、エイリアスのコレクションを完全に書き換えるというこのアプローチの問題。
問題は、これらの値が ProxyAddressCollection の既存のコレクションに追加されたことを示すポインタ @Add を追加する方法です。
完全なコード:
System.Security.SecureString secureString = new System.Security.SecureString();
foreach (char c in Password)
secureString.AppendChar(c);
PSCredential credential = new PSCredential(AdminLogin, secureString);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo(new Uri("https://ps.outlook.com/PowerShell"), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential);
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
connectionInfo.SkipCACheck = true;
connectionInfo.SkipCNCheck = true;
connectionInfo.MaximumConnectionRedirectionCount = 4;
IList<string> gmResults = null;
using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
runspace.Open();
using (Pipeline plPileLine = runspace.CreatePipeline())
{
try
{
Command addAliasCommand = new Command("Set-Mailbox", true);
addAliasCommand.Parameters.Add("identity", "test@test.onmicrosoft.com");
addAliasCommand.Parameters.Add("EmailAddresses", "testing.alias10@test.onmicrosoft.com, testing.alias11@test.onmicrosoft.com");
var rsResultsresults = plPileLine.Invoke();
if (!string.IsNullOrEmpty(resultObjectName))
{
gmResults =
rsResultsresults.Select(obj => obj.Members[resultObjectName].Value.ToString()).ToList();
}
plPileLine.Stop();
}
catch (Exception e)
{
return null;
}
finally
{
runspace.Close();
runspace.Dispose();
}
}
runspace.Close();
}