【问题标题】:PowerShell Get-ADUser, output to JSON with formatted DateTimePowerShell Get-ADUser,使用格式化的 DateTime 输出到 JSON
【发布时间】:2021-08-17 00:30:50
【问题描述】:

我首先要说的是,我对 PowerShell 的经验不是很丰富,所以很多事情对我来说并不明显。

我有以下命令:

$JSON = Get-ADUser -Filter "SAMAccountName -eq 'jdray'" -Properties SAMAccountName,
    Name,
    DisplayName,
    Manager,
    SAMAccountType,
    pwdLastSet,
    Created,
    AccountExpirationDate,
    lastLogonTimestamp,
    DistinguishedName|Select-object -Property SAMAccountName,
                                    Name,
                                    @{name='Manager';expression={ ([ADSI]"LDAP://$($_.manager)").displayname }},
                                    Enabled,
                                    DistinguishedName,
                                    Created,
                                    AccountExpirationDate,
                                    LastLogonTimestamp,
                                    PasswordLastSet|ConvertTo-Json

这个输出是:

{
    "SAMAccountName":  "jdray",
    "Name":  "Ray, James",
    "Manager":  "Lady, Boss",
    "Enabled":  true,
    "DistinguishedName":  "CN=Ray\\, James,OU=...[yadda yadda yadda]...DC=com",
    "Created":  "\/Date(1554387070000)\/",
    "AccountExpirationDate":  "\/Date(1643702400000)\/",
    "LastLogonTimestamp":  132732539928955494,
    "pwdLastSet":  132729945927805005
}

首先,我很困惑为什么AccountExpirationDateCreated 有一种格式,但LastLogonTimestamppwdLastSet 的格式不同。

我真正想要的是以人类可读的DateTime 格式输出所有DateTime 对象。我试过-ExpandProperty,但不知道如何让它工作。它似乎在输出的末尾添加了一个名为DateTime 的属性,格式合理:"DateTime": "Thursday, April 4, 2019 7:11:10 AM",但它没有命名它。关于这个主题的Microsoft documentation 对有用的示例非常简单,网络的其他部分也是如此。

我尝试遵循 Manager 表达式的 @{} 格式,该表达式是从其他人的脚本中复制而来的。不幸的是,我的 PowerShell 不够强大,无法找出合理的表达方式。在 C# 中,Created.ToShortDateString() 之类的就足够了(假设 CreatedDateTime)。

那么,我如何在 JSON 数组中始终如一地输出命名的、人类可读的 DateTime 属性值?

编辑

使用下面的建议答案,我使用相同的模式修改了四个时间戳字段:

@{n='Created';e={[DateTime]::FromFileTime($_.Created)}},
@{n='AccountExpirationDate';e={[DateTime]::FromFileTime($_.AccountExpirationDate)}},
@{n='LastLogonTimestamp';e={[DateTime]::FromFileTime($_.lastLogonTimestamp)}},
@{n='pwdLastSet';e={[DateTime]::FromFileTime($_.pwdLastSet)}}

这是我得到的(令人沮丧的)结果:

 "Created":  "\/Date(1554387070000)\/",
 "AccountExpirationDate":  "\/Date(1643702400000)\/",
 "LastLogon":  {
                   "value":  "\/Date(1628780392895)\/",
                   "DateTime":  "Thursday, August 12, 2021 7:59:52 AM"
               },
 "pwdLastSet":  132729945927805005

另外值得注意的是,这是四个 DateTime 字段在转换为 JSON 之前的输出:

Created               : 4/4/2019 7:11:10 AM
AccountExpirationDate : 2/1/2022 12:00:00 AM
LastLogonTimestamp    : 8/12/2021 7:59:52 AM
PasswordLastSet       : 8/9/2021 7:56:32 AM

为什么该格式适用于一个 DateTime 实例而不适用于其余实例?

如何从pwdLastSet字段的格式中提取DateTime,这显然是另一种动物?

如何获得简单的property:value 对,例如"LastLogonTimestamp": "Thursday, August 12, 2021 7:59:52 AM"

【问题讨论】:

    标签: json powershell formatting get-aduser


    【解决方案1】:

    使用 DateTime.FromFileTime(LastLogonTimestamp) $JSON=Get-ADUser -Filter {Enabled -eq $true} -Properties Name,Manager,LastLogon | Select-Object Name,Manager,@{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}}

    【讨论】:

    • 在哪里?在表达式中,如@{Name='LastLogonTimestamp';expression=DateTime.FromFileTime(LastLogonTimestamp)}??
    • 试过了(在我之前的评论中)但没有用。
    • $JSON= Get-ADUser -Filter {Enabled -eq $true} -Properties Name,Manager,LastLogon | Select-Object Name,Manager,@{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}}
    • 看起来很有希望,但请format your post properly
    • 确实很有希望。修改为正确的字段名,它返回"LastLogonTimestamp": { "value": "\/Date(1629122614234)\/", "DateTime": "Monday, August 16, 2021 7:03:34 AM" }。如何让它返回 ` "LastLogonTimestamp": "Monday, August 16, 2021 7:03:34 AM" '?
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多