PowerShell Get-ADUser,使用格式化的 DateTime 输出到 JSON

Posted

技术标签:

【中文标题】PowerShell Get-ADUser,使用格式化的 DateTime 输出到 JSON【英文标题】:PowerShell Get-ADUser, output to JSON with formatted DateTime 【发布时间】: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"

【问题讨论】:

【参考方案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" '?

以上是关于PowerShell Get-ADUser,使用格式化的 DateTime 输出到 JSON的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell Get-ADUser,使用格式化的 DateTime 输出到 JSON

如何从我的 Powershell 脚本中的 Get-ADUser 过滤器获取结果,以便验证该用户是不是存在?

按密码到期日期对Get-ADUser输出进行排序

在AD中导出所有用户资料

powershell查询没有邮箱的账号

powershell批量修改aduser的displayname属性