Scripts/new-criteria.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
param (
    [Parameter(Position=0,Mandatory=$true)]
    [Microsoft.EnterpriseManagement.Configuration.ManagementPackClass]$class,
    [Parameter(Position=1,Mandatory=$true)][scriptblock]$sb,
    [Parameter()][switch]$xmlonly
    )

$mpName = $class.GetManagementPack().Name
$mpVers = $class.GetManagementPack().Version
$mpKey  = $class.GetManagementPack().KeyToken
$clName = $class.Name

if ( $mpKey ) { $TokenString = "PublicKeyToken='${mpKey}'" }
else { $TokenString = "" }

$mpId = $class.GetManagementPack().Id
$clId = $class.Id

[string]$CriteriaString = @"
<Criteria xmlns="http://Microsoft.EnterpriseManagement.Core.Criteria/">
  <Reference Id="${mpName}" Version="${mpVers}" ${TokenString} Alias="myMP" />
"@


[array]$conditions = (($sb.tostring() -replace " -and ","`r").split("`r"))
if ( $conditions.count -gt 1 )
{
    $CriteriaString += "`r`n<Expression><And>"
}
foreach ( $condition in $conditions )
{
    $left,$operator,$right = $condition.trim().split()
    $right = ([string]$right).trim().trim("""")
    $CEMO = new-object Microsoft.EnterpriseManagement.Common.CreatableEnterpriseManagementObject $class.ManagementGroup,$class
    $propertyCollection = $CEMO.GetProperties()|%{$_.name} 
    # tidy up
    # old way - not the right way because CEMOs have all the properties and classes miss base class info
    #$propertyCollection = $class.propertycollection|%{$_.name}
    if ( $propertyCollection -notcontains "Id" )
    {
    $propertyCollection += "Id"
    }
    remove-item Variable:CEMO
    [string]$propertyName = $propertyCollection -eq $left
    $left = $propertyName
    if ( ! $propertyName )
    {
        throw "$left is not a property of $clName"
    }

    switch ( $operator )
    {
        '-eq' { $opName = "Equal"; break }
        '-like' { $opName = "Like"; break }
        '-notlike' { $opName = "NotLike"; break }
        '-isnull' { $opName = "IsNull"; break }
        '-isnotnull' { $opName = "IsNotNull"; break }
        default { throw "Only Equals supported"; break }
    }

    $leftValue = '$Target/Property[Type=''myMP!{0}'']/{1}$' -f ${clname},${left} 

    if ( $opName -match "Null" )
    {
    $EXPRESSION = @"
      <Expression>
        <UnaryExpression>
          <ValueExpression>
            <Property>${leftValue}</Property>
          </ValueExpression>
          <Operator>${opName}</Operator>
        </UnaryExpression>
      </Expression>
"@

    }
    else
    {
    $EXPRESSION = @"
  <Expression>
    <SimpleExpression>
      <ValueExpressionLeft>
        <Property>${leftValue}</Property>
      </ValueExpressionLeft>
      <Operator>$opName</Operator>
      <ValueExpressionRight>
        <Value>$right</Value>
      </ValueExpressionRight>
    </SimpleExpression>
  </Expression>
"@

}

  $CriteriaString += "`r`n${EXPRESSION}"
}
if ( $conditions.count -gt 1 )
{
    $CriteriaString += "`r`n</And></Expression>"
}
$CriteriaString += "`r`n</Criteria>"
$CRITERIATYPE = "Microsoft.EnterpriseManagement.Common.EnterpriseManagementObjectCriteria"
if ( $xmlonly )
{
$CriteriaString
}
else
{
new-object $CRITERIATYPE $CriteriaString,$class,$class.ManagementGroup
}