【发布时间】: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
}
首先,我很困惑为什么AccountExpirationDate 和Created 有一种格式,但LastLogonTimestamp 和pwdLastSet 的格式不同。
我真正想要的是以人类可读的DateTime 格式输出所有DateTime 对象。我试过-ExpandProperty,但不知道如何让它工作。它似乎在输出的末尾添加了一个名为DateTime 的属性,格式合理:"DateTime": "Thursday, April 4, 2019 7:11:10 AM",但它没有命名它。关于这个主题的Microsoft documentation 对有用的示例非常简单,网络的其他部分也是如此。
我尝试遵循 Manager 表达式的 @{} 格式,该表达式是从其他人的脚本中复制而来的。不幸的是,我的 PowerShell 不够强大,无法找出合理的表达方式。在 C# 中,Created.ToShortDateString() 之类的就足够了(假设 Created 是 DateTime)。
那么,我如何在 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