さまざまな理由から、EWS APIを使用する代わりに、C#コードのリモートPowerShellコマンドを使用してユーザーのメールボックス自動応答設定を照会する必要があります。C#を使用してリモートPowerShellコードを実行すると、シリアル化によって情報が失われますか?
私はかなりこれを行うためのテンプレートとしてthis articleを使用しています。私は私の周りを包み込むことができないという問題にぶつかっています。具体的には、リモートPowerShellコマンドのシリアル化/逆シリアル化プロセスで失われた情報があるようです。だから私は別の型にキャストすることはできませんし、C#コードで使用します。回避策を見つけたり、これを回避する方法を知っている人はいますか?
下に、PowerShellコードを実行してオブジェクトを返し、それを使って何かをしようとするコードがあります。問題はBaseObject
タイプがPSCustomObject
であるため、キャスト/チェックが機能しないことです。カスタムオブジェクトによって公開されている属性にもどうやってアクセスすればよいか分かりません。 VSのデバッグツールを使用すると、実際にはすべてのデータが含まれていることがわかります。 PowerShellで直接コードを実行すると、$configuration
のデータ型はDeserialized.Microsoft.Exchange.Data.Storage.Management.MailboxAutoReplyConfiguration
になることがわかります。だから私はそれが実際にシリアル化中にそのオブジェクトの情報の一部を失うと思いますか?
私がまだチェックしていない別の問題は、このコードを実行しているシステムにExchangeアセンブリがインストールされていないことです。それで私は型を参照することができないのでタイプをチェックし、is
を使用するために、ぼんやりしたBaseObject.GetType().ToString()
メソッドを使用しています。しかし、私は実際には、PowerShellオブジェクトから十分なデータ構造を得ることを期待しています。これがどのように機能するのか間違っていますか?
using (PowerShell PowerShellInstance = PowerShell.Create())
{
// add a script that creates a new instance of an object from the caller's namespace
PowerShellInstance.AddScript(@"
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionURI <URI>
Import-PSSession $session
$configuration = Get-MailboxAutoReplyConifguration -identity <E-Mail>
# Put it on the output stream
$configuration
");
// invoke execution on the pipeline (collecting output)
Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
// loop through each output object item
foreach (PSObject outputItem in PSOutput)
{
if (outputItem != null)
{
if(outputItem.BaseObject.GetType().ToString() == "Microsoft.Exchange.Data.Storage.Management.MailboxAutoReplyConfiguration"){
# We have a decrepancy here as the above is the Exchange API class and
# below would be the EWS API class. As they expose the same attributes I'd expect it to work.
OofSettings settings = outputItem.BaseObject as OofSettings
}
}
}
}
を、それはASP.NET MVCアプリケーションの一部だとして、私は実際にはC#の部分には、そのオブジェクトを必要と私は情報を表示する必要があります。私の解決策は、型をチェックすることです(元の型の 'outputItem.ToString()'を使用しています)。 'outputItem.Properties ['key'] .Value'を使用して属性にアクセスします。 – Seth