Skip to content

OP-024: Expand group membership from Active Directory, optionally recursive and optionally including disabled accounts

GetUsersByGroup is invoked over the Security route on SAIF.Services.WCF.Services.Security.SecurityService; this page documents the process end to end, from route dispatch to the message the caller receives.

Field Value
Operation ID OP-024
Trigger Caller invokes GetUsersByGroup over the Security route.
Entry operation GetUsersByGroup
Owning component SAIF.Services.WCF.Services.Security.SecurityService.GetUsersByGroup
Inputs Request message parts listed below
Outputs A de-duplicated, ascending array of sAMAccountName values for the group's membership.
Failure behavior Generic SOAP fault, per Faults and error pipeline

Request and response

Direction Element Type Declared in Notes
Request groupName string BCL (System) Directory group to expand. (Yes)
Request ldap string BCL (System) LDAP path used to open the DirectoryEntry for the membership search. (Yes)
Request domain string BCL (System) Domain used to resolve groupName. (No (default "saif"))
Request recurse bool BCL (System) Whether nested groups are expanded recursively. (No (default true))
Request includeDisabled bool BCL (System) Whether disabled accounts are included in the result. (No (default false))
Response string[] string[] BCL (System) A de-duplicated, ascending array of sAMAccountName values for the group's membership.

Steps

  1. LogRequestDetails logs the operation name and arguments (BR-WCF-032).
  2. new ADService(), then GetUsersByGroup: open a PrincipalContext on the supplied domain (default "saif") and resolve the group; a missing group returns null, not an empty array (BR-WCF-035).
  3. Open a DirectoryEntry on the supplied ldap string and run GetMembershipRecursively with a DirectorySearcher filter of "(&(objectClass=" + objectClass + ")(memberOf=" + groupDn + "))", PageSize = 1000, SizeLimit = 0, sorted by sAMAccountName (BR-WCF-036).
  4. When recurse is true, nested groups are expanded depth-first with a visited-group list preventing cycles (BR-WCF-037).
  5. Unless includeDisabled, each user's userAccountControl is converted to binary and the second-from-last bit tested; a set bit means disabled and the user is skipped (BR-WCF-038).
  6. Project sAMAccountName, then .Distinct().OrderBy(x => x).ToArray() (BR-WCF-039).
  7. Return.
  8. On failure: a directory exception is logged by the installed error handler and surfaced as a generic SOAP fault with exception detail included.

Process flow

The following diagram visualizes this process's control flow.

flowchart TD
    A["Log request details"]
    B["Resolve group via ADService"]
    B1{"Group resolved?"}
    B2["Missing group: return null,<br>not an empty array"]
    C["Search directory for group members"]
    D1{"recurse"}
    D["Expand nested groups (recursive)"]
    D2["Nested groups are not expanded"]
    E1{"includeDisabled"}
    E["Filter out disabled accounts"]
    E2["Disabled accounts are not<br>filtered out"]
    F["Deduplicate and sort account names"]
    G["Return."]
    A --> B
    B --> B1
    B1 -->|"No"| B2
    B1 -->|"Yes"| C
    B2 --> G
    C --> D1
    D1 -->|"true"| D
    D1 -->|"false"| D2
    D --> E1
    D2 --> E1
    E1 -->|"false"| E
    E1 -->|"true"| E2
    E --> F
    E2 --> F
    F --> G

Transaction and side effects

Aspect Finding
Unit of work None for this path
Commit point Not applicable
Records written None
Downstream calls Active Directory (supplied domain and ldap path, with an unbounded SizeLimit = 0 paged search)
Shared state touched None
Repeat-call behavior Idempotent read; result reflects current directory state

Logging

Surface Written content
HttpContext.Current.Response.AppendToLog (LogRequestDetails) Writes IIS request-detail log lines when LOG_REQUEST_DETAILS is enabled
ErrorLogErrorHandler → LogService Failure-path exception logging only, carrying method signature, calling user and exception detail; see Faults and error pipeline

Faults and error handling

Failure Fault type the caller receives Produced by Source
Directory exception Generic SOAP fault The ErrorLogErrorHandler installed by [LogErrorBehavior] src/WCF/SAIF.Services.WCF.Host/Services/ADService.cs

Authorization

Requirement Enforced by Source Applies to
None in code IIS authentication on the deployment (see Activation and hosting) src/WCF/SAIF.Services.WCF.Host/Services/Security/SecurityService.cs This operation

Note: Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.

Sources

  • src/WCF/SAIF.Services.WCF.Host/Services/ADService.cs
  • src/WCF/SAIF.Services.WCF.Host/Services/Security/SecurityService.cs