Новичок в Powershell, поэтому, пожалуйста, потерпите меня, если следующий вопрос будет глупым...
Я хотел бы создать моментальный снимок VSS в Powershell и нашел много примеров, в которых для этого используются функции WMI. Общие шаблоны
# Pattern 1
$class=[WMICLASS]"root\cimv2:win32_shadowcopy"
$class.create("C:\", "ClientAccessible")
# Pattern 2
(gwmi -List Win32_ShadowCopy).Create("C:\", "ClientAccessible")
Весь код, который я видел, использовал командлеты Powershell WMI. Однако у меня сложилось впечатление, что нам больше не следует использовать командлеты WMI, согласно целому ряду ссылок (например, здесь).
Поэтому я попытался выяснить, как создать моментальный снимок VSS, используя только командлеты CIM, но безуспешно. Первая идея заключалась в том, чтобы создать новый экземпляр 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) командлеты CIM не возвращают объекты, для которых может быть вызван метод 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-cimclass
и get-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?