【问题标题】:Get Drive letter from Volume ID从卷 ID 获取驱动器号
【发布时间】:2021-09-20 21:03:17
【问题描述】:

我想使用驱动器号而不是卷 ID,如下所示。我该怎么做?

谢谢,

我的输出:

VolumeName                                                  OriginatingMachine  InstallDate
\\?\Volume{3c0a6eed-1b4c-4e90-a25b-8af1af46e368}\           app01.contoso.com   4/13/2021 6:03:34 PM
\\?\Volume{de5c18ac-56e1-4efa-afb4-abaf476a99a9}\           app01.contoso.com   4/13/2021 6:03:34 PM

我想要的输出:

VolumeName  OriginatingMachine  InstallDate
E:          app01.contoso.com   4/13/2021 6:03:34 PM
X:          app01.contoso.com   4/13/2021 6:03:34 PM

命令:

Get-CimInstance Win32_ShadowCopy | Where InstallDate -lt ([datetime]::Now.AddDays(-5)) | Select-Object VolumeName,OriginatingMachine,InstallDate

Get-CimInstance Win32_ShadowCopy 输出:

Caption            :
Description        :
InstallDate        : 9/17/2021 9:22:06 PM
Name               :
Status             :
ClientAccessible   : False
Count              : 11
DeviceObject       : \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1234
Differential       : True
ExposedLocally     : False
ExposedName        :
ExposedPath        :
ExposedRemotely    : False
HardwareAssisted   : False
ID                 : {3C8DAB36-F083-4C68-84BA-E339B8A18AF3}
Imported           : False
NoAutoRelease      : True
NotSurfaced        : False
NoWriters          : False
OriginatingMachine : app01.contoso.com
Persistent         : True
Plex               : False
ProviderID         : {B5946137-7B9F-4925-AF80-51ABD60B20D5}
ServiceMachine     : app01.contoso.com
SetID              : {D3D15CE2-9FFC-4A22-B03C-77D7FCB7D40E}
State              : 12
Transportable      : False
VolumeName         : \\?\Volume{85e62cfa-2e9c-4a46-af5a-f0748acd60b6}\
PSComputerName     :

【问题讨论】:

  • 你可以尝试访问DeviceObject吗?即Select-Object DeviceObject,OriginatingMachine,InstallDate
  • 我想使用驱动器号而不是卷 ID,如下所示。不是设备对象。我已经上传示例 Get-CimInstance Win32_ShadowCopy 输出:

标签: powershell


【解决方案1】:

Win32_ShadowCopy 命令返回Win32_ShadowCopy 对象,其中有多个字段all described here.

ShadowCopy 中提供的某些字段恰好与其他具有驱动器号信息的 WMI 类相匹配,即 VolumeName 字段。这个字段恰好也出现在 ShadowCopyWin32_Volume 类中,后者具有我们需要的驱动器号属性!

我们所要做的就是查找所有卷影副本,然后查找机器上的所有卷,然后我们可以遍历副本以找到匹配的卷。如果您有一些非常复杂的挂载逻辑,则需要在 foreach 部分添加一些额外的逻辑。

所以我们会做一个快速的小函数来为我们做这个查找,它看起来像这样:

function Get-Win32ShadowVolumeDiskInfo{
    $shadowCopies = Get-CimInstance Win32_ShadowCopy
    $volumes = Get-CimInstance Win32_Volume
    $returnObject = @()

    foreach ($copy in $shadowCopies){
        $matchingVolume = $volumes | Where DeviceID -eq $copy.VolumeName
        $returnObject += [PSCustomObject]@{
            VolumeName=$matchingVolume.Name;
            OriginatingMachine = $copy.OriginatingMachine;
            InstallDate = $copy.InstallDate}
    }

    $returnObject
}


【讨论】:

  • 谢谢顺便说一句,我们如何添加“Where InstallDate -lt ([datetime]::Now.AddDays(-5))”?
  • 你会运行这个:Get-Win32ShadowVolumeDiskInfo | Where InstallDate -lt ([datetime]::Now.AddDays(-5))
  • 我希望([datetime]::Now.AddDays(-5).Date) 将该参考日期设置为午夜。另外,请不要做$returnObject += [PSCustomObject]@{..},而是让循环简单地输出[PSCustomObject]。除此之外,+ 1
  • 这里也必须同意@Theo。也 +1!
  • 好建议!谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2010-09-19
  • 2013-10-11
  • 1970-01-01
  • 2019-09-28
相关资源
最近更新 更多