c#中的powershell cmdlet-如何访问ProcessRecord中的AD对象

c#中的powershell cmdlet-如何访问ProcessRecord中的AD对象,c#,powershell,cmdlets,C#,Powershell,Cmdlets,我正在用C#编写一个Powershell模块。某些cmdlet处理来自Microsofts AD Powershell模块的输入。我喜欢在Powershell中做这样的事情: Get-ADUser MyUser | New-MyCmdlet 因此,AD用户“MyUser”被传递到我的Cmdlet“New MyCmdlet”。MyUser的类型为Microsoft.ActiveDirectory.Management.ADUser c#类将如下所示: namespace MyCmdlet { [

我正在用C#编写一个Powershell模块。某些cmdlet处理来自Microsofts AD Powershell模块的输入。我喜欢在Powershell中做这样的事情:

Get-ADUser MyUser | New-MyCmdlet
因此,AD用户“MyUser”被传递到我的Cmdlet“New MyCmdlet”。MyUser的类型为Microsoft.ActiveDirectory.Management.ADUser

c#类将如下所示:

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.....
        }
    }
}
}
我声明了类型为
object
的输入参数,因为我不知道如何在项目中获取
ADUser
。所以我可以在调试器中看到更多。。。。注释代码显示了我想要做的事情

  • 问题1:我找不到Microsoft.ActiveDirectory.Management.ADUser的程序集。我需要在我的项目中添加什么
  • 问题2:如果没有程序集,如何访问此ADUser对象的所有属性?在VS 2015的调试器中,我可以看到所有道具,甚至所有扩展道具。但我如何才能访问它们

通过寻找一种更通用的方法,我自己找到了解决方案:我如何才能弄清楚,我到底从管道中得到了什么?您通常会得到比字符串对象更复杂的东西

解决方案是,powershell中的参数类型为
PSObject
PSCustomObject
。看

这些类有很好的集合,名为
成员
属性
,可以迭代

对于我的上述样本,我做了以下工作:

  • 将参数声明为PSObject,而不是Object
    public PSObject AdUser{get;set;}

  • 迭代
    AdUser.Properties
    ,以发现其中的内容

        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);
        }
    
    if(AdUser!=null)
    {
    List strList=新列表();
    var userProps=AdUser.Properties;
    foreach(userProps中的var prop)
    {
    string data=string.Format(“属性:{0}|值:{1}”,prop.Name,prop.value.ToString());
    添加(数据);
    }
    WriteObject(strList);
    }
    
  • 所有这些都是
    System.Management.Automation
    程序集的一部分,在用C编写cmdlet时,这是必需的#