【问题标题】:C#. Write PowerShell output as a dictionaryC#。将 PowerShell 输出写为字典
【发布时间】:2022-02-21 09:37:56
【问题描述】:

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

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

感谢您的帮助

【问题讨论】:

    标签: c# powershell dictionary active-directory get-aduser


    【解决方案1】:

    Get-ADUseroutputsADUser 实例。我会删除脚本管道中的 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

    【讨论】:

      【解决方案2】:

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

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

      可能最好的方法是使用某种 c# ldap 库。甚至 activedirectory 模块也使用某种 c# 库:How can I get a list of users from active directory?

      【讨论】:

      • 老实说,我对 C# 还是很陌生,从没想过我可以在 C# 中使用 AD 模块。这肯定会是一个更容易的解决方案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多