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
首先,我很困惑为什么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"
?
【问题讨论】:
【参考方案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