PowerShell + WMI – Métodos estáticos e de instância

Um tem que começar seus pés molhados com WMI quando vem a controlar ConfigMgr com PowerShell. Como o ConfigMgr usa WMI? Não só ConfigMgr, mas para outros produtos se você aproveitar WMI com PowerShell, em seguida, compreender o que são Static & Instância métodos é importante.

Mas há muitos lugares onde as pessoas tropeçam (eu também). Abaixo está uma pergunta feita em Hyderabad PowerShell User Group (PSHUG) mostrando um do ponto comum de confusão.

Se você é um Administrador ConfigMgr, então você já sabe que no cliente SCCM temos muitas ações do Cliente que podem ser acionadas remotamente. Abaixo estão as ações disponíveis do cliente SCCM (em CM 2012):

Voltando à questão, o código abaixo funcionará, o que está desencadeando “Inventário de Software” em uma máquina $ remota:

001
002
$ Client1 = $ ( [WmiClass] “\\ $ Machine \ ROOT \ ccm: SMS_Client” )
$ Client1 . TriggerSchedule ( “{00000000-0000-0000-0000-000000000021}” )

Mas por que não somos capazes de ver o método quando fazemos o abaixo:

001
002
$ Client2 = Get-WmiObject -ComputerName $ Machine -Namespace root \ ccm -Class SMS_Client
$ Client2 | Get-Member -MemberType *

Observação – Há duas variáveis $ Client1 & $ Client2

Antes de irmos mais longe, gostaria de esclarecer uma coisa primeiro, um pode obter o WMI Class Object usando o cmdlet Get-WMIObject propriamente dito com a opção -List
Então, se eu fizer o abaixo .. tome nota do -List mudar no final:

 

001
$ Client3 = Get-WmiObject -Class SMS_client-Namespace Root \ CCM -ComputerName $ machine -List

 

Vá em frente e veja por si mesmo que os dois objetos $ Client1 e $ Client3 são essencialmente os mesmos 🙂

A resposta para a razão pela qual o método TriggerSchedule não aparece quando nós canalizá-lo para Get-Member é realmente simples, basta comparar o tipo de ambos os objetos que você tem à mão

Assim, a partir de cima, deduzimos que esses dois são essencialmente 2 objetos diferentes para que você não vai encontrar o método TriggerSchedule no $ Client2;)

Isso se torna óbvio se pensarmos sobre ele -> [ WmiClass ] tipo acelerador dá-lhe o objeto de classe WMI de volta não a instância WMI

Explicação detalhada

Para esclarecer as coisas um pouco mais a classe ($ Client1) é uma definição de objetos e instância (Client2) é a manifestação da classe.

Em nossa pergunta $ Client1 é Classe e $ Client2 é uma instância da classe.

Agora uma classe pode ter 2 tipos de métodos:

  1. Métodos estáticos (somente disponível na turma)
  2. Métodos de instância (disponível nas instâncias da classe)
Então, como vamos continuar recebendo essa peça chave de informação, se é um método estático ou não?
Depois de ter o objeto de classe ($ Client1) você pode explorá-lo.
Então, uma vez que temos o WMI Class Object, podemos fazer o abaixo para dar uma olhada nos métodos e os qualificadores:
  PS> $ Client1 |  Select -ExpandProperty métodos |  Selecionar nome, qualificadores

 Qualificadores de Nome
 -benzóico.
 ResetPolicy {implementado, estático}
 RequestMachinePolicy {implementado, estático}
 EvaluateMachinePolicy {implementado, estático}
 TriggerSchedule {implementado, estático}
 RepairClient {implementado, estático}
 SetAssignedSite {implementado, estático}
 GetAssignedSite {implementado, estático}
 SetGlobalLoggingConfiguration {implementado, estático}
 ResetGlobalLoggingConfiguration {implementado, estático}
 SetClientProvisioningMode {implementado, estático}

Observe que todos os métodos na classe são estáticos.

Para resumir tudo, vamos ter uma classe com o método Static e instância, por exemplo, Win32_Share

  PS> Get-WmiObject -Class WIn32_Share -List |  Select -ExpandProperty métodos |  Selecionar nome, qualificadores

 Qualificadores de Nome
 -benzóico.
 Criar {Construtor, Implemented, MappingStrings, Static}
 SetShareInfo {Implementado, MappingStrings}
 GetAccessMask {Implemented, MappingStrings}
 Excluir {Destructor, Implemented, MappingStrings}

Portanto, o único método que é estático é o Create Method e rest são estáticos.

Verifique se isso está correto obtendo as instâncias do WMI e usando o Get-Member

  PS> Get-WmiObject -Class WIn32_Share |  Método Get-Member -MemberType -Force


    TypeName: System.Management.ManagementObject # root \ cimv2 \ Win32_Share

 Nome Definição de Tipo de Membro
 -benzóico.
 Método Delete System.Management.ManagementBaseObject Excluir ()
 Método GetAccessMask System.Management.ManagementBaseObject GetAccessMask ()
 SetShareInfo Method System.Management.ManagementBaseObject SetShareInfo (System.UInt32 MaximumAllowed, System.St ...

Observe que o método Create não aparece na instância WMI causa é um método estático na classe 🙂

Mas ele aparecer no objeto de classe WMI

  PS> Get-WmiObject -Class win32_Share -ComputerName $ Machine -List |  Método Get-Member -MemberType


    TypeName: System.Management.ManagementClass # ROOT \ cimv2 \ Win32_Share

 Nome Definição de Tipo de Membro
 -benzóico.
 Método Create System.Management.ManagementBaseObject Create (System.String Path, System.String Name, System.UInt3 ...

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s