C# 从PsObject[long]到DateTime的较短强制转换
我很好奇。有可能删掉这个代码吗C# 从PsObject[long]到DateTime的较短强制转换,c#,powershell,casting,C#,Powershell,Casting,我很好奇。有可能删掉这个代码吗 using (PowerShell powerShell = PowerShell.Create()) { powerShell.AddScript("Get-ADUser " + Login + " -Properties msDS-UserPasswordExpiryTimeComputed | Select -Expand \"msDS-UserPasswordExpiryTimeComputed\""
using (PowerShell powerShell = PowerShell.Create())
{
powerShell.AddScript("Get-ADUser " + Login + " -Properties msDS-UserPasswordExpiryTimeComputed | Select -Expand \"msDS-UserPasswordExpiryTimeComputed\"");
Collection<PSObject> psObjects;
psObjects = powerShell.Invoke();
long PasswordExpireTemp = long.Parse(psObjects.FirstOrDefault().ToString());
userViewModel.PasswordExpire = DateTime.FromFileTimeUtc(PasswordExpireTemp);
}
我的意思是,跳过创建长密码ExpiretEMP。
PsObject是Object[long]。
userViewModel.PasswordExpire是DateTime吗?当然可以,如果您继续在PowerShell中执行此工作:
$var = (Get-ADUser [MyUserName] -Properties msDS-UserPasswordExpiryTimeComputed | Select-Object -ExpandProperty msDS-UserPasswordExpiryTimeComputed)
if ($var -and $var -ne [int64]::MaxValue) {
## Do something with the value
} else {
## Value is either $null or -eq to the Max Value of a Signed 64-bit integer
}
## OR
if ($var -and $var -ge 0 -and $var -lt [datetime]::MaxValue.ToFileTimeUtc()) {
$true
## Do something
}
powerShell.AddScript[datetime]::FromFileTimeUtcGet ADUser+Login+-Properties msDS UserPasswordExpiryTimeComputed |选择-Expand\msDS UserPasswordExpiryTimeComputed\
但是,这两位代码都将返回日期时间:1601年1月1日星期一12:00:00 AM;在“msDS UserPasswordExpiryTimeComputed”为“0”或null的情况下:
如果需要任何ADS_UF_智能卡,ADS_UF_不会过期\u PASSWD,
ADS\u UF\u工作站\u信任\u帐户、ADS\u UF\u服务器\u信任\u帐户、,
ADS_UF_域间_信任_帐户位设置为!userAccountControl,
然后发送到!msDS UserPasswordExpiryTimeComputed=0x7FFFFFFFFFFFFFFF
否则,如果TO!pwdLastSet=null或TO!pwdLastSet=0,则
到!msDS UserPasswordExpiryTimeComputed=0
否则,如果有效MaximumPasswordAge=0x80000000000000,则
到!msDS UserPasswordExpiryTimeComputed=0x7FFFFFFFFFFFFFFFFF其中
[MS-SAMR]第3.1.1.5节定义了有效最大假设值
否则,到!msDS UserPasswordExpiryTimeComputed=TO!pwdLastSet+
有效MaximumPasswordAge,其中有效MaximumPasswordAge为
定义见[MS-SAMR]第3.1.1.5节
您好,Hoshie,您说得对,我丢失了将内部命令包装在其自身中的括号。尽可能多的错误,请参见下面的编辑:
PS C:\Windows\system32> (Get-ADUser [MyUserAccount] -Properties msDS-UserPasswordExpiryTimeComputed | Select-Object -ExpandProperty msDS-UserPasswordExpiryTimeComputed)
9223372036854775807
PS C:\Windows\system32> [int64]::MaxValue 9223372036854775807
PS C:\Windows\system32> [datetime]::MaxValue
Friday, December 31, 9999 11:59:59 PM
PS C:\Windows\system32> [datetime]::MaxValue.ToFileTimeUtc()
2650467743999999999
PS C:\Windows\system32> [datetime]::MaxValue.ToFileTime()
2650467743999999999
因此,您遇到的问题是,从该属性返回的值可能大于DateTime对象所接受的最大可能值。请参阅MSDN文章,了解该值返回Int64.MaxValue为“9223372036854775807”0x7FFFFFFFFFFFFFFFFFFFFF的所有条件
您必须在PowerShell或C中处理此可能性。以下是如何在PowerShell中解决此问题的示例:
$var = (Get-ADUser [MyUserName] -Properties msDS-UserPasswordExpiryTimeComputed | Select-Object -ExpandProperty msDS-UserPasswordExpiryTimeComputed)
if ($var -and $var -ne [int64]::MaxValue) {
## Do something with the value
} else {
## Value is either $null or -eq to the Max Value of a Signed 64-bit integer
}
## OR
if ($var -and $var -ge 0 -and $var -lt [datetime]::MaxValue.ToFileTimeUtc()) {
$true
## Do something
}
您确定这是正确的条目吗?PsObjest为null。我在结尾处发现了一个错误,并尝试了…Computed\;但仍然为null。@Hoshie,我没有将Get ADUser包装到一对额外的中。但是,在许多情况下,此值可以返回表示64位的最大值,这将l引发异常,但不转换为DateTime类型。