0

我被一个简单的任务困住了,需要社区帮助。我在 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}

在这里我被卡住了,不知道如何将其转换为字典,或者也许有一种方法可以直接将其转换为字典而不使用列表?

谢谢你的帮助

4

2 回答 2

2

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...
}

更好的是Microsoft.ActiveDirectory.Management在您的 C# 项目中引用程序集,然后您可以user直接访问ADUser而不使用dynamic.

于 2022-02-21T01:17:36.307 回答
0

powershell 是 c# 程序经常使用的东西,还是用于这个特定任务?我之所以这样问,是因为使用 pwsh 来“仅仅”获得用户似乎真的很乏味和不切实际。

但是..如果您真的想这样做,处理此问题的最佳方法可能是从 powershell 输出为 json 并导入到 c#。|convertto-json您可以通过在输出到任何文件之前附加来做到这一点。通过这种方式,您可以反序列化并序列化为objects您可以处理的。

可能最好的方法是使用某种 c# ldap 库。甚至该activedirectory模块也使用某种 c# 库:如何从活动目录中获取用户列表?

于 2022-02-21T00:46:23.473 回答