2016-03-27 11 views
0

私はC#でPowershellモジュールを作成しています。いくつかのコマンドレットは、MicrosoftのAD Powershellモジュールからの入力を処理します。私はPowerShellでこのような何かをしたい:c#のpowershellコマンドレット - ProcessRecordのADオブジェクトにアクセスする方法

Get-ADUser MyUser | New-MyCmdlet 

だから、ADのユーザーMyUserと「私のコマンドレット「新-MyCmdlet」に渡されます。私は私のプロジェクトでADUserを取得する方法がわからないので、私はタイプobjectの入力パラメータを宣言

namespace MyCmdlet 
{ 
[Cmdlet(VerbsCommon.New, "MyAdUserOperation")] 
public class NewAdUserOperationCmdlet : Cmdlet 
{ 
    [Parameter(
     Mandatory = true, 
     ValueFromPipeline = true, 
     ValueFromPipelineByPropertyName = true, 
     HelpMessage = "ADUser object from AD to be stored on database.")] 
    public object AdUser { get; set; } 

    protected override void ProcessRecord() 
    { 
     base.ProcessRecord(); 

     if (AdUser != null) 
     { 
      // do something with the props, e.g: 
      // var dn = AdUser.DistinguishedName; 
      // var pwLastSet = AdUser.PasswordLastSet 
      // etc..... 
     } 
    } 
} 
} 

:MyUserとは、次のようにMicrosoft.ActiveDirectory.Management.ADUser

C#クラスが見えるタイプのものです。だから私はもう少しデバッガで見ることができます....コメントしたコードは、私が何をしたいのかを示しています。

  • 質問1:Microsoft.ActiveDirectory.Management.ADUserのアセンブリが見つかりません。私のプロジェクトに何を追加する必要がありますか?
  • 質問2:アセンブリがない場合、このADUserオブジェクトのすべてのプロパティにどのようにアクセスできますか? VS 2015のデバッガでは、すべての小道具がすべて拡張されています。しかし、どうすればそれらにアクセスできますか?
  • 答えて

    0

    さらに一般的なアプローチを探して解決策を見つけました。どうすれば実際にパイプを通過するのか分かりますか?文字列オブジェクトよりも複雑なものが普通です.....

    解決策は、powershellのパラメータがPSObjectまたはPSCustomObjectの場合です。 MSDN Library

    これらのクラスは、反復可能なMembersPropertiesという素晴らしいコレクションを持っています。私の上記のサンプルについて

    、私は次のようでした:

    1. ではなく、そのような

      if (AdUser != null) 
          { 
           List<string> strList = new List<string>(); 
           var userProps = AdUser.Properties; 
           foreach (var prop in userProps) 
           { 
            string data = String.Format("property: {0} | value: {1}", prop.Name, prop.Value.ToString()); 
            strList.Add(data); 
           } 
           WriteObject(strList); 
          } 
      
    2. ように内部が何であるかを発見するために AdUser.Properties繰り返し処理オブジェクト public PSObject AdUser { get; set; }

    3. のPSObjectなどのパラメータを宣言

    すべてこれは一部です​​アセンブリのC#でコマンドレットを作成する場合は、とにかく必要です。

    関連する問題