что это за формат секунд XXXXXXX.XXXXX:XXX (Win32_NetworkLoginProfile)

Запрос объекта WMi на

$colItems = Get-WmiObject Win32_NetworkLoginProfile -Namespace "root\CIMV2" 
                  | Where-Object {$_.name -match "Name"} | Select-Object name,PasswordAge

согласно MSDN

PasswordAge

Тип данных: datetime
Тип доступа: Только чтение
Длительность действия пароля. Это значение измеряется количеством секунд, прошедшим с момента последней смены пароля.
Пример: 00001201000230.000000 000

я осознаю

00000068235223.000000:000

Итак, я попытался применить это к TimeSpanи DateTime безуспешно. что представляет двоеточие, как получить число часов, которое оно представляет.


Спасибо. Добавление имени класса WMI в заголовок для следующего бедняги, которого смущает формулировка документации.


вот что работает

Это сработало отлично $str = 00000068235223.000000:000 $ts = [System.Management.ManagementDateTimeConverter]::ToTimeSpan($str)

Дни: 68 часов: 23 минуты: 52 секунды: 23 Миллисекунды: 0 клещей: 59611430000000 Всего в общей времени: 68.9947106481481 Totalhours: 1655.87305555556 TotalMinutes: 99352.3833333333 Totalseconds: 5961143 Totalmilliseconds: 5961143000


person user1088352    schedule 07.07.2015    source источник
comment
возможный дубликат Как преобразовать длинный строка даты и времени в днях в C#   -  person Black Frog    schedule 07.07.2015
comment
Фактический формат PasswordAge — это "ddddddddHHmmss.ffffff:000", то есть 8 цифр дней, затем 2 цифры часов, затем минуты, затем секунды, затем дроби. Они говорят использовать [TimeSpan]::ParseExact($string,"ddddddddHHmmss.ffffff:000",$null), но я не могу заставить его работать на моей PS4/Win7. Очень странно.   -  person Vesper    schedule 07.07.2015
comment
@Vesper: см. мой комментарий ниже.   -  person PaulF    schedule 07.07.2015


Ответы (3)


Это формат интервала времени DMTF, документированный здесь< /а>. В основном это строка, которая кодирует промежуток времени в форме ddddddddHHMMSS.mmmmmm:000. Обратите внимание, что для временных интервалов окончание всегда :000.

Из документов:

В следующем примере показан формат интервала даты и времени. ddddddddHHMMSS.mmmmmm:000
В следующей таблице перечислены поля интервала даты и времени.
Описание поля
dddddddd Восемь цифр, обозначающих количество дней (от 00000000 до 99999999).
HH Two- цифра часа в 24-часовом формате (от 00 до 23).
MM Двузначное число минут в часе (от 00 до 59).
SS Двузначное число секунд в минуте (00 до 59).
mmmmmm Шестизначное количество микросекунд в секундах (от 000000 до 999999).

Я считаю, что документация для этого поля несколько вводит в заблуждение, поскольку подразумевает, что целые числа представляют собой полные секунды, но на самом деле это строковый формат, представляющий дни, часы, минуты, секунды и т. д.

Вы должны использовать [System.Management.ManagementDateTimeConverter]::ToTimeSpan для преобразования этой строки в .NET Timespan, однако по какой-то причине я фактически получил массив вместо строки для PasswordAge, поэтому мне пришлось использовать это:

$p = gwmi Win32_NetworkLoginProfile
[System.Management.ManagementDateTimeConverter]::ToTimeSpan($p.PasswordAge[1])
person Mike Zboray    schedule 07.07.2015

Чтобы добавить ко всем предыдущим ответам, правильная процедура для создания чего-то из строк этого типа - вызов [System.Management.ManagementDateTimeConverter]::ToTimeSpan($string). Это создаст объект [System.TimeSpan], который вы сможете лучше проанализировать.

Кредит для класса для преобразования идет на этот ответ.

person Vesper    schedule 07.07.2015
comment
Я бы упомянул об этом в своем ответе, однако мои попытки всегда приводили к ошибке, говорящей о том, что значение выходит за пределы диапазона допустимых значений. - person Mike Zboray; 07.07.2015
comment
Это сработало отлично $str = 00000068235223.000000:000 $ts = [System.Management.ManagementDateTimeConverter]::ToTimeSpan($str) $ts 12 Days: 68 Hours: 23 Minutes: 52 Seconds: 23 Milliseconds: 0 Ticks: 59611430000000 TotalD6 TotalHours: 1655.87305555556 TotalMinutes: 99352.3833333333 TotalSeconds: 5961143 TotalMilliseconds: 5961143000 - person user1088352; 07.07.2015
comment
Хорошо, по какой-то причине PasswordAge для меня это массив, не знаю почему, но это работает. - person Mike Zboray; 07.07.2015

Это CIM_DATETIME значения или Значения интервалов. Формат определяется стандартом CIM, на котором построен WMI.

При обычных значениях даты и времени объект WMI предоставляет функцию конвертера. Например:

$_.ConvertToDateTime($_.PasswordExpires);

Но это не работает для интервалов, которыми является PasswordAge.

В документе MS, на который вы указываете, указано, что значение равно количеству секунд, но я считаю, что это означает точность до секунды, а не то, что значение буквально в секундах. Мой текущий пароль говорит, что ему 43 года, если это было так, например, и это невозможно. Поэтому он должен использовать формат Interval.

я бы сделал так:

$PasswordAge = New-TimeSpan -Days $_.PasswordAge.Substring(0,8) `
    -Hours $_.PasswordAge.Substring(8,2) `
    -Minutes $_.PasswordAge.Substring(10,2) `
    -Seconds $_.PasswordAge.Substring(12,2);

Не забудьте использовать $PasswordAge.TotalHours, а не только $PasswordAge.Hours, если вы хотите, чтобы фактическое значение возраста выражалось в часах, а не только часовое значение временного промежутка.

Изменить: @Vesper прав. Вы можете просто использовать:

[System.Management.ManagementDateTimeConverter]::ToTimeSpan($_.PasswordAge);
person Bacon Bits    schedule 07.07.2015