Tarefas WMI: datas e horas

Há várias classes do WMI e um objeto de script para analisar ou converter o formato de data e hora do CIM. Para obter outros exemplos, consulte o TechNet ScriptCenter em https://www.microsoft.com/technet

Os exemplos de script mostrados neste tópico obtêm dados somente do computador local. Para obter mais informações sobre como usar o script para obter dados de computadores remotos, consulte Conectando-se a WMI em um computador remoto.

Para executar um script:

O procedimento a seguir descreve como executar um script.

  1. Copie o código e salve-o em um arquivo com uma extensão .vbs, como filename.vbs. Certifique-se de que seu editor de texto não adicione uma extensão .txt ao arquivo.
  2. Abra uma janela do prompt de comando e navegue até o diretório onde você salvou o arquivo.
  3. Digite cscript filename.vbs no prompt de comando.
  4. Se você não puder acessar um log de eventos, verifique se está executando em um prompt de comando elevado. Alguns Logs de Eventos, como o Log de Eventos de Segurança, podem ser protegidos por Controles de Acesso do Usuário (UAC).

Observação

Por padrão, cscript exibe a saída de um script na janela do prompt de comando. Como os scripts WMI podem produzir grandes quantidades de saída, talvez você queira redirecionar a saída para um arquivo. Digite cscript filename.vbs > outfile.txt no prompt de comando para redirecionar a saída do script filename.vbs para outfile.txt.

A tabela a seguir lista exemplos de script que podem ser usados para obter vários tipos de dados do computador local.

Como fazer... Classes ou métodos WMI
...converter datas WMI em datas e horas padrão?
Use o objeto SWbemDateTime para convertê-los em datas e horas regulares.
VB
Set dtmInstallDate = CreateObject("WbemScripting.SWbemDateTime")
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each strOS in objOS
    dtmInstallDate.Value = strOS.InstallDate
    Wscript.Echo dtmInstallDate.GetVarDate
Next

Ou faça com que seu código execute a tarefa manualmente.

VB
Function WMIDateStringToDate(dtmInstallDate) 
    WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & Mid(dtmInstallDate, 7, 2) _
                        & "/" & Left(dtmInstallDate, 4) & " " & Mid (dtmInstallDate, 9, 2) & ":" _
                        & Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate,13, 2)) 
End Function 

...determinar a hora atualmente configurada em um computador?

Use a classe Win32_LocalTime .

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")
For Each objItem in colItems
    Wscript.Echo "Day:           " & objItem.Day & VBNewLine _
               & "Day Of Week:   " & objItem.DayOfWeek & VBNewLine _
               & "Hour:          " & objItem.Hour & VBNewLine _
               & "Minute:        " & objItem.Minute & VBNewLine _
               & "Month:         " & objItem.Month & VBNewLine _
               & "Quarter:       " & objItem.Quarter & VBNewLine _
               & "Second:        " & objItem.Second & VBNewLine _
               & "Week In Month: " & objItem.WeekInMonth & VBNewLine _
               & "Year:          " & objItem.Year 
Next

PowerShell
# Especifica o computador e obtém a hora local = "." $times = Get-WmiObject Win32_LocalTime -computer $computer 

<# Agora exibe o resultado #>

Foreach ($time in $times) { "Day : {0}" -f $Time.Day "Day Of Week : {0}" -f $Time.DayOfWeek "Hour : {0}" -f $Time.Hour "Minute : {0}" -f $Time.Minute "Month : {0}" -f $Time.Month "Quarter : {0}" -f $Time.Quarter "Second : {0}" -f $time.Second "Week In Month: {0}" -f $Time.WeekInMonth "Year : {0}" -f $Time.Year }

...determinar o nome do fuso horário em que um computador está sendo executado?

Use a classe Win32_TimeZone e verifique o valor da propriedade Description.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_TimeZone")
For Each objItem in colItems
    Wscript.Echo "Description:   " & objItem.Description
    Wscript.Echo "Daylight Name: " & objItem.DaylightName
    Wscript.Echo "Standard Name: " & objItem.StandardName
    Wscript.Echo
Next
PowerShell
$Computer = "."  
$timezone = Get-WMIObject -class Win32_TimeZone -ComputerName $computer  
  
<# Display details  #>
if ($computer -eq ".") {$computer = Hostname}  
"Time zone information on computer `"{0}`"" -f $computer  
"Time Zone Description   : {0}" -f $timezone.Description  
"Daylight Name           : {0}" -f $timezone.DaylightName  
"Standard Name           : {0}" -f $timezone.StandardName  

...garantir que "10/02/2000" seja interpretado como 2 de outubro de 2000, não "10 de fevereiro de 2000"?

Gerencie datas no formato CIM DATETIME e use métodos SWbemDateTime, como GetVarDate, para convertê-las de e para os formatos FILETIME ou VT_Date. Como o formato DATETIME é independente da localidade, você pode escrever um script que é executado em qualquer máquina. Use o objeto SWbemDateTime para convertê-los em datas e horas regulares. Consulte Formato de data e hora para obter mais informações sobre a conversão de datas e horas.

...converter uma data e hora WMI em um valor DateTime do .NET?

Analise manualmente a cadeia de caracteres e coloque os valores recuperados em um objeto DateTime .

PowerShell
function WMIDateStringToDateTime( [String] $strWmiDate ) 
{ 
    $strWmiDate.Trim() > $null 
    $iYear   = [Int32]::Parse($strWmiDate.SubString( 0, 4)) 
    $iMonth  = [Int32]::Parse($strWmiDate.SubString( 4, 2)) 
    $iDay    = [Int32]::Parse($strWmiDate.SubString( 6, 2)) 
    $iHour   = [Int32]::Parse($strWmiDate.SubString( 8, 2)) 
    $iMinute = [Int32]::Parse($strWmiDate.SubString(10, 2)) 
    $iSecond = [Int32]::Parse($strWmiDate.SubString(12, 2)) 
<# decimal point is at $strWmiDate.Substring(14, 1) #> 
    $iMicroseconds = [Int32]::Parse($strWmiDate.Substring(15, 6)) 
    $iMilliseconds = $iMicroseconds / 1000 
    $iUtcOffsetMinutes = [Int32]::Parse($strWmiDate.Substring(21, 4)) 
    if ( $iUtcOffsetMinutes -ne 0 ) 
    { 
        $dtkind = [DateTimeKind]::Local 
    } 
    else 
    { 
        $dtkind = [DateTimeKind]::Utc 
    } 
    return New-Object -TypeName DateTime ` 
                      -ArgumentList $iYear, $iMonth, $iDay, ` 
                                    $iHour, $iMinute, $iSecond, ` 
                                    $iMilliseconds, $dtkind 
} 

Tarefas do WMI para scripts e aplicativos

Exemplos de aplicativos C++ WMI

Formato Data e Hora

TechNet ScriptCenter

`