Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从PsObject[long]到DateTime的较短强制转换_C#_Powershell_Casting - Fatal编程技术网

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类型。