Более короткое приведение PsObject [long] к DateTime - PullRequest
0 голосов
/ 10 марта 2020

Мне любопытно. Можно ли вырезать этот код?

        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);
        }

Я имею в виду, пропустить создание long PasswordExpireTemp . PsObject - это Object [long. userViewModel.PasswordExpire - это DateTime?

1 Ответ

1 голос
/ 10 марта 2020

уверен, если вы продолжите выполнять работу в PowerShell:

powerShell.AddScript ("[datetime] :: FromFileTimeUt c ((Get-ADUser" + Login + "-Properties msDS-UserPasswordExpiryTimeComputed) | Выберите -Expand \ "msDS-UserPasswordExpiryTimeComputed \" ")));

Однако оба бита кода вернут дату и время: понедельник, 1 января, 1601, 12:00:00; в условиях, когда 'MSDS-UserPasswordExpiryTimeComputed' является '0' или нуль:!

Если какой-либо из ADS_UF_SMARTCARD_REQUIRED, ADS_UF_DONT_EXPIRE_PASSWD, ADS_UF_WORKSTATION_TRUST_ACCOUNT, ADS_UF_SERVER_TRUST_ACCOUNT, ADS_UF_INTERDOMAIN_TRUST_ACCOUNT бит установлен в TO UserAccountControl, потом MSDS -UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF.

Иначе, если TO! PwdLastSet = null или TO! PwdLastSet = 0, то TO! MsDS-UserPasswordExpiryTimeComputed = 0.

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 затем TO! msDS-UserPasswordExpiryTimeComputed = 0x7FFFFFFFFFFFFFFF (где Effective-MaximumPasswordAge определен в разделе [MS-SAMR] 3.1.1.5).

Иначе, TO! msDS-UserPasswordExpiryTimeComputed = TO! pwdLastSet = TO! pwdLastS где Effective-MaximumPasswordAge определено в разделе 3.1.1.5 [MS-SAMR].

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/f9e9b7e2-c7ac-4db6-ba38-71d9696981e9

Hi Ho shie , вы правы, мне не хватало скобок внутренняя команда в своем собственном. Что касается возможных ошибок, см. Редактирование ниже:

    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' (0x7FFFFFFFFFFFFFFF).

Эту возможность необходимо обрабатывать либо в 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...