1

这里是Powershell新手,所以如果以下问题很愚蠢,请多多包涵......

我想在 Powershell 中创建一个 VSS 快照,并找到了许多使用 WMI 函数来执行此操作的示例。常见的模式是

# Pattern 1
$class=[WMICLASS]"root\cimv2:win32_shadowcopy"
$class.create("C:\", "ClientAccessible")

# Pattern 2
(gwmi -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")

我看到的所有代码都是使用 Powershell 的 WMI cmdlet。但是,根据大量参考资料(例如此处,我的印象是我们不应再使用 WMI cmdlet 。

因此,我试图找出如何仅使用 CIM cmdlet 创建 VSS 快照,但没有成功。第一个想法是创建一个新Win32_ShadowCopy实例,根据需要设置它的属性并调用Create它的方法。这在第一步中失败了:

PS C:\Users\Administrator> New-CimInstance Win32_ShadowCopy
New-CimInstance : Not supported 
At line:1 char:1
+ New-CimInstance Win32_ShadowCopy
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotImplemented: (Win32_ShadowCopy:CimInstance) [New-CimInstance], CimException
    + FullyQualifiedErrorId : HRESULT 0x8004100c,Microsoft.Management.Infrastructure.CimCmdlets.NewCimInstanceCommand

显然New-CimInstance没有为Win32_ShadowCopy.

在进一步研究期间,还发现(与 WMI cmdlet 相比)CIM cmdlet 不返回Create可以调用该方法的对象(我已从以下代码的输出中删除了一些空行):

PS C:\Users\Administrator> get-cimclass -Class Win32_ShadowCopy

   NameSpace: ROOT/cimv2

CimClassName                        CimClassMethods      CimClassProperties                                                 
------------                        ---------------      ------------------                                                 
Win32_ShadowCopy                    {Create, Revert}     {Caption, Description, InstallDate, Name...}                       

PS C:\Users\Administrator> get-wmiobject -List Win32_ShadowCopy

   NameSpace: ROOT\cimv2

Name                                Methods              Properties                                                         
----                                -------              ----------                                                         
Win32_ShadowCopy                    {Create, Revert}     {Caption, ClientAccessible, Count, Description...}                 

据我了解,以上显示返回的对象get-cimclassget-wmiobject两者都应该公开相​​同的方法。但是,当我们尝试调用该Create方法时:

PS C:\Users\Administrator> $(get-wmiobject -List win32_shadowcopy).Create("C:\", "ClientAccessible")

__GENUS          : 2
__CLASS          : __PARAMETERS
__SUPERCLASS     : 
__DYNASTY        : __PARAMETERS
__RELPATH        : 
__PROPERTY_COUNT : 2
__DERIVATION     : {}
__SERVER         : 
__NAMESPACE      : 
__PATH           : 
ReturnValue      : 0
ShadowID         : {8918619B-BE7F-4FE2-9B9C-C6B3B71CC749}
PSComputerName   : 

PS C:\Users\Administrator> $(get-cimclass -Class Win32_ShadowCopy).Create("C:\", "ClientAccessible")
Method invocation failed because [Microsoft.Management.Infrastructure.CimClass] does not contain a method named 'Create'.
At line:1 char:3
+ $(get-cimclass -Class Win32_ShadowCopy).Create("C:\", "ClientAccessib ...
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

显然,我不能get-cimclass用来创建卷影副本。对于get-ciminstance;也是如此。后者失败并显示相同的错误消息,就get-cimclass好像至少一个快照已经存在,否则会抛出另一个错误,因为返回的对象是空的。

那么我需要做什么才能仅使用 CIM cmdlet 创建卷影副本?

4

1 回答 1

2

我刚开始玩这个,但这个命令似乎有效:

Invoke-CimMethod -MethodName Create -ClassName Win32_ShadowCopy -Arguments @{ Volume= "C:\\" }

正如您注意到的那样,您不能直接在实例上调用 CIM 方法。由于 Cim cmdlet 通过远程处理来工作,因此实例不是实时的(有人说是脱水的)并且这些方法被删除了。因此,“不包含名为...的方法” Invoke-CimMethod 旨在解决此问题。

我确实发现发现有时会很棘手,但它是可行的。例如,我以前从未使用过此类,但很容易找到可能的调用示例,例如:

(Get-CimClass Win32_ShadowCopy).CimClassMethods

Name   ReturnType Parameters                  Qualifiers
----   ---------- ----------                  ----------
Create     UInt32 {Context, Volume, ShadowID} {constructor, implemented, static}
Revert     UInt32 {ForceDismount}             {implemented}

我在一分钟内完成了所有...

注意:您是正确Get-WMIObject的,类似的东西已被弃用,并已从 PowerShell 7+ 中删除。最好继续使用 Cim cmdlet,并在它们出现时完成这些调整......

CIM Cmdlet 简介

脚本专家 CIM 与 WMI

于 2020-09-07T15:33:13.580 回答