Windows Management Instrumentarion или просто WMI в PowerShell V2 так же претерпел изменения, а точнее дополнения по сравнению с версией 1.0. Я планирую более подробно описать новые и обновлённые параметры командлета Get-WMIObject:
1) -List - ключ. Позволяет получать список классов для системы или список свойств и методов для конкретного класса:
PS C:\> Get-WmiObject -List NameSpace: ROOT\cimv2 Name Methods Properties ---- ------- ---------- __NotifyStatus {} {StatusCode} __ExtendedStatus {} {Description, Operation, ParameterInfo, ProviderName...} Win32_PrivilegesStatus {} {Description, Operation, ParameterInfo, PrivilegesNotHeld...} Win32_JobObjectStatus {} {AdditionalDescription, Description, Operation, ParameterIn... __SecurityRelatedClass {} {} __Trustee {} {Domain, Name, SID, SidLength...} Win32_Trustee {} {Domain, Name, SID, SidLength...} __NTLMUser9X {} {Authority, Flags, Mask, Name...} ....
По умолчанию, без указания других параметров, параметр -List выводит список классов, которые расположены в контейнере по умолчанию Root\CimV2. Но можно указывать и другие контейнеры при помощи параметра -NameSpace. Например:
Get-WmiObject -Namespace root\default -List
Или для конкретного класса:
PS C:\> Get-WmiObject Win32_share -List | select * | fl Name : Win32_Share __GENUS : 1 __CLASS : Win32_Share __SUPERCLASS : CIM_LogicalElement __DYNASTY : CIM_ManagedSystemElement __RELPATH : Win32_Share __PROPERTY_COUNT : 10 __DERIVATION : {CIM_LogicalElement, CIM_ManagedSystemElement} __SERVER : THOR __NAMESPACE : ROOT\cimv2 __PATH : \\THOR\ROOT\cimv2:Win32_Share Path : \\THOR\ROOT\cimv2:Win32_Share Derivation : {CIM_LogicalElement, CIM_ManagedSystemElement} Methods : {Create, SetShareInfo, GetAccessMask, Delete} Scope : System.Management.ManagementScope Options : System.Management.ObjectGetOptions ClassPath : \\THOR\ROOT\cimv2:Win32_Share Properties : {AccessMask, AllowMaximum, Caption, Description...} SystemProperties : {__GENUS, __CLASS, __SUPERCLASS, __DYNASTY...} Qualifiers : {CreateBy, DeleteBy, dynamic, Locale...} Site : Container : PS C:\>
здесь мы видим доступные методы (Create, SetShareInfo и другие), а так же свойства объекта класса (AccessMask, AllowMaximum, Caption и другие). Можно и более подробно посмотреть методы или свойства объекта:
Get-WmiObject Win32_share -List | %{$_.methods} # получение подробных сведений о методах объекта класса Get-WmiObject Win32_share -List | %{$_.properties} # получение подробных сведений о свойствах объекта класаа
Кстати говоря, в PowerShell 1.0 параметр -List не работал для конкретных классов, а только для перечисления самих классов. Т.е. приведённые выше 2 команды в 1.0 не работают. Теперь этот недостаток исправлен.
2) -AsJob - ключ. Позволяет выполнять команду в фоновом режиме. Это новая возможность в PowerShell V2, которая позволяет запускать некоторые команды в фоновом режиме не блокируя при этом саму консоль. Коллега, Вася Гусев, уже делал скринкаст по фоновым работам в PowerShell (и не только о них) на TechDays.ru (потребуется авторизация с помощью LiveID или OpenID). И я так же планирую обсудить в своём блоге этот вопрос в обозримом будущем.
3) -Authentication - параметр. Позволяет задавать уровень аутентификации к удалённой машине. Возможные уровни аутентификации могут быть:
В версии 1.0 можно было изменять уровни аутентификации, но там были свои сложности. Например, при первом подключении нельзя было указывать свой уровень аутентификации, а только при последующих обращениях к серверу. Например так:
$a = Get-WmiObject Win32_share -filter "Name = 'sharename'" $a.PSBase.Scope.Options.Authentication = 6 # или PacketPrivacy
4) -Authority - параметр. Позволяет клиенту выбирать, кто будет его аутентифицировать (например, LSA удалённой машины или сервер Active Directory) при указании параметра -Credentials.
5) -DirectRead - ключ. Если указывается, то производится прямой доступ к классу без привязки к нему более высших или производных классов. Реальной пользы я тут пока что не вижу.
6) -Impersonation - параметр. В этом параметре можно указывать уровень имперсонализации при удалённых подключениях. Может иметь следующие значения:
В версии 1.0 так же можно было изменять уровень имперсонализации с теми же сложностями, которые были и у параметра Authentication. А именно - нельзя было изменять этот уровень при первом подключении к WMI. Делалось это так:
$a = Get-WmiObject Win32_share -filter "Name = 'sharename'" $a.PSBase.Scope.Options.Impersonation = 4 # или Delegate
7) -EnableAllPrivileges - ключ. Данный ключ включает все привилегии безопасности (семейство SeSecurity Privilege), которыми обладает пользователь. Я уже не раз отмечал, что при работе в системе из графической оболочки Explorer, LSA (Local Security Authority) прозрачно для пользователя включает привилегии при необходимости. Однако, в целях безопасности для скриптов LSA по умолчанию не включает их. Привилегии безопасности нужны для многих операций, как смена владельца объектов, редактирования списков ACL множества объектов, выполнение критических для системы операции как удаление журналов событий, восстановления системы из точек восстановления и т.д. И только WMI нам предлагает интерфейс для их использования. Причём теперь это делается простым указанием ключа при использовании командлета Get-WmiObject. В общем смысле в версии 1.0 нельзя было из скриптов включать привилегии, хотя по факту данный функционал был заложен и активно использовался:
$a = Get-WmiObject Win32_share -filter "Name = 'sharename'" $a.PSBase.Scope.Options.EnablePrivileges = $true
В этом отношении PowerShell является менее безопасным, чем, к примеру, VBS, который позволяет включать только необходимые привилегии безопасности (например для смены владельца объекта только SeRestorePrivilege и SeTakeOwnershipPrivilege). Причём VBS может очень гибко работать с подключаемыми привилегиями, что делает код более безопасным. В PowerShell они включаются все сразу и отдельные привилегии включать нельзя.
Вот, в принципе и рассмотрели основые полезные и интересные нововведения в командлет Get-WmiObject для работы с WMI в PowerShell V2 CTP3. Я допускаю, что эти параметры к релизу вряд ли претерпят существенные изменения и будут справедливы и в финальной версии V2.
Comments: