1

我首先要说的是,我对 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
}

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

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

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

那么,如何DateTime在 JSON 数组中持续输出命名的、人类可读的属性值?

编辑

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

@{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实例而不适用于其他实例?

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

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

4

1 回答 1

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

于 2021-08-17T01:08:20.140 回答