How to get associated objects

This topic shows how to get objects that are associated with a given object.

[!Important]
The object being used is the example Win32_Process object defined in the CIM Class Overview topic.

 

In this example, we want to get a list of processes that are using a given file. In CIM, the relationship between Process and File is represented through an association class called CIM_ProcessExecutable.

Get-Win32Process –ProcessFile <CimInstance#CIM_DataFile>

Here we want to find the list of processes for a given logon session (instance of Win32_LogonSession class). The Name and Id parameters have been removed to keep the example simple.

<PowerShellMetadata xmlns="https://schemas.microsoft.com/cmdlets-over-objects/2009/11">
  <Class ClassName="root\cimv2\Win32_Process">
    <Version>2.0.0.0</Version>
    <DefaultNoun>Win32Process</DefaultNoun>
    <InstanceCmdlets>
      <GetCmdletParameters/>
       <GetCmdlet>
        <CmdletMetadata Verb="Get" HelpUri="http://link.to.online.help"/>
         <GetCmdletParameters DefaultCmdletParameterSet="ByName">
          <QueryableAssociations>
           <Association Association="CIM_ProcessExecutable" ResultRole="Dependent" SourceRole="Antecedent">
            <AssociatedInstance>
              <Type PSType="Microsoft.Management.Infrastructure.CimInstance"    ETSType="Microsoft.Management.Infrastructure.CimInstance#root\cimv2\CIM_DataFile"/>
              <CmdletParameterMetadata PSName="ProcessFile" ValueFromPipeline="true" CmdletParameterSets="ByName ByLiteralName"/>
            </AssociatedInstance>
          </Association>
        </QueryableAssociations>
        </GetCmdletParameters>
      </GetCmdlet>           
     </InstanceCmdlets>
  </Class>
</PowerShellMetadata>

Here is how you would use the sample CDXML in PowerShell.

#Save the sample file as CDXML (for example, Win32Process.cdxml)
#Import this file in PS
Import-module .\win32Process.cdxml
#check the imported cmdlets
Get-command –module win32process* -syntax
#run the cmdlet
Get-Win32Process
#Create a local instance of CIM_File class to pass to Get-Win32Process
$file = New-CimInstance -ClassName CIM_DataFile -Namespace root/cimv2 -Property @{Name="C:\Windows\System32\wininet.dll"} -Key Name -ClientOnly 
#NOTE: In most of the cases, there would be another cmdlet to get instances of CIM_DataFile
Get-Win32Process –ProcessFile $file