我正在用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
。所以我可以在调试器中看到更多......评论代码显示了我想做的事情。
Microsoft.ActiveDirectory.Management.ADUser
的程序集。我需要将哪些内容添加到项目中?答案 0 :(得分:0)
通过寻找更通用的方法自己找到解决方案:我怎样才能弄明白,我通过管道得到了什么?你通常会得到比字符串对象更复杂的东西......
解决方案是,powershell中的参数属于PSObject
或PSCustomObject
类型。见MSDN Library
这些类具有可以迭代的名为Members
和Properties
的好集合。
对于我的上述示例,我执行了以下操作:
将参数声明为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);
}
当在C#中编写cmdlet时,所有这些都是System.Management.Automation
程序集的一部分,无论如何都是必需的。