Как создать теневую копию VSS в Powershell, используя только командлеты CIM (не командлеты WMI)?

Новичок в 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?


person Binarus    schedule 07.09.2020    source источник


Ответы (1)


Я только начал играть с этим, но эта команда, кажется, работает:

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

Как вы заметили, вы не можете вызывать методы CIM непосредственно на экземпляре. Поскольку командлеты Cim работают через удаленное взаимодействие, экземпляры не работают (некоторые говорят, что обезвожены), а методы удалены. Следовательно, не содержит метод с именем... 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 и выполнить эти настройки по мере их появления...

Введение в командлеты CIM

Сценаристы CIM против WMI

person Steven    schedule 07.09.2020
comment
Спасибо большое. Ваш ответ, конечно, очень полезен: Я все сделал за минуту... Ну, я и сам сталкивался с (...).CimClassMethods, но так как методы задокументированы, то мне это и не понадобилось. Для меня ключевым моментом в вашем ответе является Invoke-CimMethod. Я уже читал об этом, но не пробовал, потому что был уверен, что и с методом Create он не сработает. - person Binarus; 07.09.2020
comment
Рад слышать, что ты делаешь успехи. Я добавил несколько ресурсов, которые тоже помогли мне лучше понять. Между прочим, я избегал Cim и придерживался WMI... долгое время. После прочтения этих строк я написал несколько надежных утилит на основе команд Cim, одноразовых сценариев и т. Д. Если вам удобно, примите ответ. Спасибо. - person Steven; 07.09.2020