【问题标题】:Using WMI from PowerShell or C# - how can I get remote host time, including milliseconds?从 PowerShell 或 C# 使用 WMI - 如何获取远程主机时间,包括毫秒?
【发布时间】:2019-05-17 22:37:54
【问题描述】:

我需要使用 WMI 获取远程主机日期和时间,包括毫秒。

以下还不够:

Get-WmiObject Win32_UTCTime -ComputerName MY_REMOTE_HOST

由于 Win32_CurrentTime 类中没有实现毫秒,该类由 Win32_UTCTime 类派生:

毫秒

数据类型:uint32

访问类型:只读

未实施。

此属性继承自 Win32_CurrentTime。

(https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmitimepprov/win32-currenttime)

如果有任何其他使用 WMI 从 Powershell 或 C# 获取此信息的建议,我将不胜感激。

【问题讨论】:

    标签: c# powershell time wmi get-wmiobject


    【解决方案1】:

    WMI 类 win32_operatingsystem 包含一个名为 LocalDateTime 的属性,该属性还包含毫秒。不过,您需要转换它们。

    简单示例:

    $OS = Get-WmiObject win32_operatingSystem
    $OS.ConvertToDateTime($OS.LocalDateTime)
    

    输出是一个包含毫秒的 DateTime 对象。

    【讨论】:

    • 这似乎可行,但我想知道 - 我们怎么可能从一个内部似乎没有时间字段的对象中提取时间?我刚刚运行“Get-WmiObject Win32_operatingsystem -ComputerName MY_REMOTE_HOST”,返回的字段是:(SystemDirectory,Organization,BuildNumber,RegisteredUser,SerialNumber,Version)
    • 默认情况下,您在 Powershell 中请求的许多 WMI 对象仅显示属性的子集(因为 Powershell 内置了许多“模板”来过滤数据)。通过将命令传送到 fl * (fl 是格式列表的别名),您可以看到它们。使用 Get-Member,您还可以查看属性和数据类型(但看不到值)。
    【解决方案2】:

    @bluuf 的答案是您应该使用的答案,但作为一种更复杂的替代方法,您可以从性能计数器 WMI 类中获取当前日期/时间,如下所示:

    $perfTime = Get-CimInstance -Query "Select * FROM Win32_PerfRawData_PerfOS_Processor WHERE Name = '0'"
    (Get-Date "01/01/1601").AddTicks($perfTimeime.Timestamp_Sys100NS)
    

    【讨论】:

      【解决方案3】:

      尝试 PowerShell 远程处理:

      $sess = New-PSSession -Credential (Get-Credential)
      $dateTime = Invoke-Command -Session $sess -ScriptBlock { Get-Date -Format "o" }
      

      要启用远程处理,请参阅link

      希望对您有所帮助。

      【讨论】:

      • 谢谢,但解决方案必须通过 WMI
      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多