【发布时间】:2018-06-22 10:23:35
【问题描述】:
我想知道用户使磁盘脱机的时间。有没有办法通过 WMI 类或其他方式知道这一点?
【问题讨论】:
我想知道用户使磁盘脱机的时间。有没有办法通过 WMI 类或其他方式知道这一点?
【问题讨论】:
如果您无法通过 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/wdm/ne-wdm-_fsinfoclass
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724280.aspx
https://blogs.msdn.microsoft.com/joshpoley/2007/12/19/datetime-formats-and-conversions/
【讨论】: