2017-04-25 2 views
0

さまざまな理由から、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 
      } 
     } 
    } 
} 

答えて

0

:デシリアライズは、(タイプPSObject)私の知る限り、元のスクリプトが生成されたPowerShellがオブジェクトと新しいものを作成し、元のオブジェクトのデータではなく、メソッドを破壊します。

回避策は、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> 
***INSERT HERE Powershell-Cmdlets to do the things you need*** 

# 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 
      } 
     } 
    } 
} 
+0

を、それはASP.NET MVCアプリケーションの一部だとして、私は実際にはC#の部分には、そのオブジェクトを必要と私は情報を表示する必要があります。私の解決策は、型をチェックすることです(元の型の 'outputItem.ToString()'を使用しています)。 'outputItem.Properties ['key'] .Value'を使用して属性にアクセスします。 – Seth

関連する問題