2.4.4.17.6 Relational Operator Tokens

msdn link

Each relational operator examines one or more attribute values and evaluates to TRUE, FALSE or UNKNOWN, according to the defined behavior of the operator in the following table. In addition to the TRUE and FALSE values specified for each operator in the table, each relational operator MUST return "UNKNOWN" if the attribute tested does not exist in the security context.

For all operators other than the relational operators ==, Contains, and Any_of, and the logical operator Exists, when multivalued attributes are on the left- and/or right-hand side of an operator, the operation will fail and produce an UNKNOWN value.

If any processing rule returns an error, then the entire conditional expression evaluates to UNKNOWN, regardless of the rest of the expression.

Unary Relational Operators:

The operand type MUST be either a SID literal, or a composite, each of whose elements is a SID literal.

The operand for unary operators is the variable on the top of the evaluation stack as specified in the EvaluateAceCondition algorithm in section 2.5.3.1.5.

Token Type

Byte-Code

Processing

Member_of

0x89

SDDL Form: Member_of operand

Return TRUE if SIDs[] array (section 2.5.2) contains all of the SIDs in the operand; FALSE otherwise.

Device_Member_of<57>

0x8a

SDDL Form: Device_Member_of operand

Return TRUE if DeviceSIDs[] array (section 2.5.2) contains all of the SIDs in the operand; FALSE otherwise.

Member_of_Any<58>

0x8b

SDDL Form: Member_of_Any operand

Return TRUE if SIDs[] array (section 2.5.2) contains any of the SIDs in the operand; FALSE otherwise.

Device_Member_of_Any<59>

0x8c

SDDL Form: Device_Member_of_Any operand

Return TRUE if DeviceSIDs[] array (section 2.5.2) contains any of the SIDs in the operand; FALSE otherwise.

Not_Member_of<60>

0x90

SDDL Form: Not_Member_of operand

Logical inverse of Member_of.

Not_Device_Member_of<61>

0x91

SDDL Form: Not_Device_Member_of operand

Logical inverse of Device_Member_of.

Not_Member_of_Any<62>

0x92

SDDL Form: Not_Member_of_Any operand

Logical inverse of Not_Member_of_Any.

Not_Device_Member_of_Any<63>

0x93

SDDL Form: Not_Device_Member_of_Any operand

Logical inverse of Device_Member_of_Any.

Binary Relational Operators

Binary relational operators compare left-hand-side (LHS) and right-hand-side (RHS) operands. The LHS MUST contain an attribute name in simple or @Prefixed form.<64> The RHS MUST contain an attribute in @Prefixed form or literals representing values of the same value type as the attribute variable on the LHS. If the LHS and RHS operands are of different types, then the entire conditional expression evaluates to UNKNOWN. Note, however, that BOOLEAN values TRUE and FALSE can be compared to the literal integers "1" and "0", but only when using the == or != operators.

Relational operators that compare string and octet string values compare each string operand byte by byte, terminating when the compared bytes differ in value. If a string is a prefix of a string it is compared to, the longer string is considered greater. The comparison is case-insensitive, unless the CLAIM_SECURITY_ATTRIBUTE_VALUE_CASE_SENSITIVE flag value is set in the CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 structure (section 2.4.10.1).<65>

If the type of an operand is "Result Value" then the operation returns an error.

If the type of an operand is "Local Attribute", "Resource Attribute", "Device Attribute" or "User Attribute" and the value is null then the logical value of the operand is UNKNOWN.

If the value of either operand is UNKNOWN then the operation returns UNKNOWN.

In the following processing rules, the LHS is the second variable on the stack and the RHS is the top of the stack as specified in the EvaluateAceCondition algorithm in section 2.5.3.1.5.

Token Type

Byte-Code

Processing

==

0x80

SDDL form: (LHS == RHS)

MUST evaluate to TRUE if the argument on the RHS evaluates to the exact value (single or set value) of the argument on the LHS; otherwise, FALSE.

!=

0x81

SDDL form: (LHS != RHS)

MUST evaluate to FALSE if the argument on the RHS evaluates to the exact value of the argument on LHS; otherwise, TRUE.

<

0x82

SDDL form: (LHS < RHS)

MUST evaluate to TRUE if the argument on the LHS is less than the argument on the RHS; otherwise, FALSE.

<=

0x83

SDDL form: (LHS <= RHS)

MUST evaluate to TRUE if the argument on the LHS is less than, or equal to, the argument on the RHS; otherwise, FALSE.

>

0x84

SDDL form: (LHS > RHS)

MUST evaluate to TRUE if the argument on the LHS is greater than the argument on the RHS; otherwise, FALSE.

>=

0x85

SDDL form: (LHS >= RHS)

MUST evaluate to TRUE if the argument on the LHS is greater than, or equal to, the argument on the RHS; otherwise, FALSE.

Contains

0x86

SDDL Form: LHS Contains RHS

LHS MUST be an attribute name in simple or @Prefixed form.

RHS MUST be a set of one or more literals, or an attribute name in @Prefixed form.

MUST evaluate to TRUE if the value(s) for the specified LHS includes value(s) identical to each of the value(s) specified by the RHS; otherwise, FALSE.<66>

Any_of

0x88

SDDL Form: LHS Any_of RHS

LHS MUST be an attribute name in simple or @Prefixed form. RHS MUST be a set of one or more literals, or an attribute name in @Prefixed form.

MUST evaluate to TRUE if the RHS value set includes one or more of the value(s) of the specified LHS; otherwise, FALSE. RHS can be either a set or a single value.<67>

Not_Contains<68>

0x8e

SDDL Form: LHS Not_Contains RHS

Logical inverse of Contains.

Not_Any_of<69>

0x8f

Form: LHS Not_Any_of RHS

Logical inverse of Any_of.