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

时间:2016-03-27 06:16:52

标签: 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
{
[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的调试器中,我可以看到所有道具甚至全部扩展。但是如何访问它们?

1 个答案:

答案 0 :(得分:0)

通过寻找更通用的方法自己找到解决方案:我怎样才能弄明白,我通过管道得到了什么?你通常会得到比字符串对象更复杂的东西......

解决方案是,powershell中的参数属于PSObjectPSCustomObject类型。见MSDN Library

这些类具有可以迭代的名为MembersProperties的好集合。

对于我的上述示例,我执行了以下操作:

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

  2. 迭代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);
        }
    
  3. 当在C#中编写cmdlet时,所有这些都是System.Management.Automation程序集的一部分,无论如何都是必需的。