如何在Powershell中仅使用CIM cmdlet(而非WMI cmdlet)创建VSS卷影副本



Powershell新手,如果下面的问题很傻,请耐心等待。。。

我想在Powershell中创建一个VSS快照,并发现了许多使用WMI函数来实现这一点的示例。常见的模式是

# Pattern 1
$class=[WMICLASS]"rootcimv2: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:UsersAdministrator> 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

显然,CCD_ 3不是为CCD_ 4实现的。

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

PS C:UsersAdministrator> get-cimclass -Class Win32_ShadowCopy
NameSpace: ROOT/cimv2
CimClassName                        CimClassMethods      CimClassProperties                                                 
------------                        ---------------      ------------------                                                 
Win32_ShadowCopy                    {Create, Revert}     {Caption, Description, InstallDate, Name...}                       
PS C:UsersAdministrator> get-wmiobject -List Win32_ShadowCopy
NameSpace: ROOTcimv2
Name                                Methods              Properties                                                         
----                                -------              ----------                                                         
Win32_ShadowCopy                    {Create, Revert}     {Caption, ClientAccessible, Count, Description...}                 

据我所知,以上内容表明get-cimclassget-wmiobject返回的对象应该公开相同的方法。但是,当我们尝试调用Create方法时:

PS C:UsersAdministrator> $(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:UsersAdministrator> $(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创建卷影副本呢?

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

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

正如您所注意到的,您不能直接在实例上调用CIM方法。由于Cim cmdlet通过远程处理来工作,因此实例不活动(有些人说已脱水(,并且方法已删除。因此;不包含名为…的方法"InvokeCimMethod就是为了解决这个问题。

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

(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 Cmdlets 简介

Scripting Guys CIM Vs WMI

相关内容

  • 没有找到相关文章

最新更新