WMI タスク: 日付と時刻

いくつかの WMI クラスと、CIM datetime 形式を解析または変換するためのスクリプト オブジェクトがあります。 その他の例については、TechNet ScriptCenter (https://www.microsoft.com/technet) を参照してください。

このトピックに示すスクリプトのサンプルでは、ローカル コンピューターからのみデータを取得します。 スクリプトを使用してリモート コンピューターからデータを取得する方法の詳細については、「モート コンピューター上の WMI への接続」を参照してください。

スクリプトを実行するには

以下の手順ではスクリプトの実行方法を説明します。

  1. コードをコピーし、拡張子が .vbs のファイル (filename.vbs など) に保存します。 テキスト エディターによってファイルに .txt 拡張子が追加されていないことを確認します。
  2. コマンド プロンプト ウィンドウを開き、ファイルを保存したディレクトリに移動します。
  3. コマンド プロンプトで「cscript filename.vbs」と入力します。
  4. イベント ログにアクセスできない場合は、管理者特権でのコマンド プロンプトから実行しているかどうかを確認します。 セキュリティ イベント ログなどの一部のイベント ログは、ユーザー アクセス制御 (UAC) によって保護されている場合があります。

Note

既定では、スクリプトは出力をコマンド プロンプト ウィンドウに表示します。 WMI スクリプトでは大量の出力が生成される場合があるため、出力をファイルにリダイレクトすることが必要になることがあります。 コマンド プロンプトで「cscript filename.vbs > outfile.txt」と入力して、filename.vbs スクリプトの出力を outfile.txt にリダイレクトします。

次の表では、ローカル コンピューターからさまざまな種類のデータを取得するために使用できるスクリプトの例を示しています。

操作方法 WMI のクラスまたはメソッド
WMI の日付を標準の日付と時刻に変換する方法
SWbemDateTime オブジェクトを使用して、これらを正規の日付と時刻に変換します。
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

または、コードにタスクを手動で実行させます。

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 

コンピューターで現在構成されている時間を確認する方法

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
# Specify computer and get Local Time $Computer = "." $times = Get-WmiObject Win32_LocalTime -computer $computer 

<# Now display the result #>

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 }

コンピューターが実行されているタイム ゾーンの名前を確認する方法

Win32_TimeZone クラスを使用し、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  

「10/02/2000」が「2000 年 2 月 10 日" ではなく 2000 年 10 月 2 日と読み取られていることを確認します。

日付を CIM DATETIME 形式で管理し、GetVarDate などの SWbemDateTime メソッドを使用して、FILETIME 形式または VT_Date 形式に変換します。 DATETIME 形式はロケールに依存しないため、任意のコンピューターで実行されるスクリプトを記述できます。 SWbemDateTime オブジェクトを使用して、これらを正規の日付と時刻に変換します。 日付と時刻の変換の詳細については、「日付と時刻の形式」を参照してください。

WMI datetime を .NET DateTime 値に変換する方法

文字列を手動で解析し、取得した値を 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 
} 

スクリプトとアプリケーションの WMI タスク

WMI C++ アプリケーションの例

日付と時刻の形式

TechNet ScriptCenter

`