【问题标题】:How to get the timestamp of when a disk is made offline from diskmgmt or other ways in windows?如何通过diskmgmt或Windows中的其他方式获取磁盘何时脱机的时间戳?
【发布时间】:2018-06-22 10:23:35
【问题描述】:

我想知道用户使磁盘脱机的时间。有没有办法通过 WMI 类或其他方式知道这一点?

【问题讨论】:

    标签: windows winapi wmi


    【解决方案1】:

    如果您无法通过 Win32 API/WMI 或其他方式找到方法,我确实知道您可以将其视为最后的替代方法。

    在 FileFsVolumeInformation 类中使用 NtQueryVolumeInformationFile 怎么样?您可以这样做来检索有关卷的数据,然后通过FILE_FS_VOLUME_INFORMATION 结构访问数据。这包括创建时间。


    在文章的最后,我留下了一些资源链接供您阅读以了解更多信息,以便您可以按照自己喜欢的方式完成它;不过,我确实需要快速解决一些重要的问题,即文档将引导您 _FSINFOCLASS 的枚举定义,但只是从 MSDN 复制粘贴它,它可能不起作用。您需要手动将枚举定义的第一个条目设置为 1,否则会搞砸,NtQueryVolumeInformationFile 将返回错误状态STATUS_INVALID_INFO_CLASS(因为第一个条目将被识别为 0 而不是 1,然后后面的所有条目除非您手动设置 = 1),否则它们应该是 -1)。

    这是应该可以工作的编辑版本。

    typedef enum _FSINFOCLASS {
        FileFsVolumeInformation = 1,
        FileFsLabelInformation,
        FileFsSizeInformation,
        FileFsDeviceInformation,
        FileFsAttributeInformation,
        FileFsControlInformation,
        FileFsFullSizeInformation,
        FileFsObjectIdInformation,
        FileFsDriverPathInformation,
        FileFsVolumeFlagsInformation,
        FileFsSectorSizeInformation,
        FileFsDataCopyInformation,
        FileFsMetadataSizeInformation,
        FileFsMaximumInformation
    } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
    

    一旦你打开了磁盘的句柄,你就可以像这样调用 NtQueryVolumeInformationFile:

    NTSTATUS NtStatus = 0;
    HANDLE FileHandle = NULL;
    IO_STATUS_BLOCK IoStatusBlock = { 0 };
    FILE_FS_VOLUME_INFORMATION FsVolumeInformation = { 0 };
    
    ...
    Open the handle to the disk here, and then check that you have a valid handle.
    ...
    
    NtStatus = NtQueryVolumeInformationFile(FileHandle,
        &IoStatusBlock,
        &FsVolumeInformation,
        sizeof(FILE_FS_VOLUME_INFORMATION),
        FileFsVolumeInformation);
    
    ...
    

    如果 NtStatus 表示成功的 NTSTATUS 错误代码(例如 STATUS_SUCCESS),那么您可以使用 FsVolumeInformation 变量访问 FILE_FS_VOLUME_INFORMATION 结构的 VolumeCreationTime (LARGE_INTEGER) 字段。


    此时您的最后一项任务是使用名为 VolumeCreationTime 的 LARGE_INTEGER 字段来收集正确的时间/日期信息。文章末尾包含两个链接,它们专注于该主题,它们应该可以帮助您解决问题。


    有关详细信息,请参阅以下内容。

    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntifs/nf-ntifs-ntqueryvolumeinformationfile

    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/ne-wdm-_fsinfoclass

    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddk/ns-ntddk-_file_fs_volume_information

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms724280.aspx

    https://blogs.msdn.microsoft.com/joshpoley/2007/12/19/datetime-formats-and-conversions/

    【讨论】:

    • 非常感谢。但是我正在通过用户或其他方式寻找“当卷脱机时”的时间戳。 FileFsVolumeInformation 类只有创建时间。
    • @DebjyotiGhoshal 对于误解我深表歉意 - 如果我留下上述内容以防其他人认为它有用,可以吗?关于卷“脱机”时的时间戳,我认为 Windows 不会存储该信息,但我可能错了。
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2010-12-19
    • 2011-07-01
    相关资源
    最近更新 更多