我正忙于一项简单的任务,需要社区帮助。我正在C#代码中运行PowerShell脚本,需要将输出转换为字典。代码是
private void button_datecheck_Click(object sender, EventArgs e)
{
var script = "Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "Displayname",@{Name="ExpiryDate";Expression={[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed")}}";
var ps = PowerShell.Create().AddScript(script);
var temp_list = ps.Invoke().ToList();
using (TextWriter tw = new StreamWriter("C:\c#\test_output.txt"))
{
foreach (dynamic item in temp_list)
{
tw.WriteLine(item);
}
}
不确定PSObject是否可以直接转换为字典,所以先将其转换为List(另外,看看我从PS得到了什么样的输出(输出看起来像
@{Displayname=Name Surname; ExpiryDate=1/02/2022 9:24:48 am} @{Displayname=Name1 Surname1; ExpiryDate=2/02/2023 11:20:27 am}
这里我被卡住了,不知道如何将其转换为字典,或者可能有一种方法可以在不使用列表的情况下直接将其转换成字典?
感谢的帮助
Get-ADUser
输出ADUser
实例。我会删除脚本管道的Select-Object
部分,并使用C#访问您想要的属性。
我没有一个可以测试的域,但它应该看起来像这样。。。
var script = "Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False} –Properties "DisplayName", "msDS-UserPasswordExpiryTimeComputed"";
var ps = PowerShell.Create().AddScript(script);
var userList = ps.Invoke().ToList();
foreach (dynamic user in userList)
{
Dictionary<string, object> userProperties = new Dictionary<string, object>();
userProperties["DisplayName"] = user["displayName"].Value;
userProperties["ExpiryDate"] = DateTime.FromFileTime((long) user["msDS-UserPasswordExpiryTimeComputed"].Value);
// Use userProperties for this user...
}
更好的方法是在C#项目中引用Microsoft.ActiveDirectory.Management
程序集,然后可以直接作为ADUser
访问user
,而不使用dynamic
。
powershell是c#程序经常使用的东西,还是用于此特定任务?我之所以这么问,是因为使用pwsh来获取用户看起来非常乏味和不可接受。
然而。。如果你真的想这样做,最好的方法可能是从powershell输出json并导入到c。您可以通过在输出到任何文件之前附加|convertto-json
来实现这一点。通过这种方式,您可以反序列化并序列化到可以处理的objects
。
最好的方法可能是使用某种c#ldap库。甚至activedirectory
模块也使用某种c#库:如何从active directory中获取用户列表?