Operations¶
This host publishes exactly one ASMX service class, ADUserServices.clsADUserServices, exposing 19 <WebMethod()> operations for Active Directory user, group, and access-control maintenance across the internal (corp.saif.com) and external (external.saif.com) domains. There is no dispatcher, handler, or delegation layer: each operation is a direct method on the codebehind class, and no operation name is ever overridden — every wire operation name equals its VB method name.
This page is the operation catalog and hub. Each service class's operations are documented in detail on its own page under contracts/.
Operation surface derivation¶
| Aspect | Finding |
|---|---|
| Authoritative surface | <WebMethod()> members on ADUserServices.clsADUserServices |
| SOAP namespace | http://tempuri.org/ (clsADUserServices.asmx.vb line 38 — <System.Web.Services.WebService(Namespace:="http://tempuri.org/")>) |
| Operation naming | Method name — no WebMethod(MessageName:="<name>") override appears anywhere in the file |
| Binding conformance | WsiProfiles.BasicProfile1_1 (clsADUserServices.asmx.vb line 39 — <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>) |
| Metadata document | Framework-generated, retrievable at <service-address>?WSDL; no WSDL is checked into the repository |
Contract-stability finding. The SOAP namespace is the untouched Visual Studio/framework template default, never changed to an organization- or service-specific value. This is a HIGH-severity contract-stability finding — see tech-debt.md TD-01 — because the WSDL target namespace, every message's XML namespace, and every operation's SOAP action all derive from this value, and it is shared with every other unmodified ASMX service. Do not normalize or "correct" this value anywhere in this document set; it is reported exactly as written in source. The SOAP action pattern is <namespace><OperationName>, e.g. http://tempuri.org/GetUserEmail. The deployed host or virtual path is not determinable from the repository — <IISUrl> is empty and <UseIIS>False</UseIIS> in ADUserServices.vbproj*.
ScriptService is commented out and inactive — line 37 reads ' <System.Web.Script.Services.ScriptService()> _, a VB.NET line comment, not a live attribute. There is no JSON/AJAX-callable surface and no system.web.extensions registration anywhere in Web.config. Every one of the 19 <WebMethod()> occurrences is the bare attribute with no arguments — no MessageName, Description, EnableSession, CacheDuration, BufferResponse, or TransactionOption is supplied anywhere. Consequences of this bare usage: EnableSession defaults to False (the inherited Session property is not session-backed for any operation), CacheDuration defaults to 0 (no framework response caching), and there is no authored Description text carried into the WSDL — every operation summary in this document set is derived from the implementation.
WS-I Basic Profile 1.1 is a declaration, not a fully enforced constraint: two constructs on this contract sit uncomfortably with it — the untyped ArrayList returns on GetUserGroups/GetUserResources, which serialize as unconstrained xsd:anyType arrays (see tech-debt.md TD-05), and the ADServiceResponse/HasAccessResponse message types, whose public fields (not properties) form the message body. EmitConformanceClaims is not supplied on the WebServiceBinding attribute, so the framework default False applies and no conformance claim is emitted into the generated WSDL. The base class is System.Web.Services.WebService (clsADUserServices.asmx.vb line 42).
Service class catalog¶
| Service class | .asmx file |
SOAP namespace | Operations | Documentation |
|---|---|---|---|---|
ADUserServices.clsADUserServices |
clsADUserServices.asmx |
http://tempuri.org/ |
19 | Details |
The marker file is src\ADUserServices\clsADUserServices.asmx; the codebehind is src\ADUserServices\clsADUserServices.asmx.vb.
Operation catalog¶
19 <WebMethod()> members compose the operation surface. Eight are gated by the application-layer IP allow-list (CheckAccess().HasAccess); eleven have no access check at all — see authentication-authorization.md.
| Operation | Service class | Input message | Output message | Faults | Auth | Rules |
|---|---|---|---|---|---|---|
HelloWorld |
clsADUserServices |
None | String |
None declared — cannot fail | None in code | — |
AddUser |
clsADUserServices |
13 String parts |
ADServiceResponse |
Sentinel Failure | SoapException outside the two Try blocks |
Access-checked | BR-01, BR-07 |
UnlockAccount |
clsADUserServices |
inUserId |
ADServiceResponse |
Sentinel Failure only — never faults* |
Access-checked | BR-01, BR-07 |
AddUserToGroup |
clsADUserServices |
inUserId, inGroupName |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist/GroupDoesNotExist/UserAlreadyInGroup — never faults |
Access-checked | BR-01, BR-07 |
DeleteUser |
clsADUserServices |
inUserId |
ADServiceResponse |
Sentinel Failure only — never faults |
Access-checked | BR-01, BR-07 |
DeleteUserFromGroup |
clsADUserServices |
inUserId, inGroupName |
ADServiceResponse |
Sentinel Success/GroupDoesNotExist — directory failures are caught and swallowed (see faults.md) |
Access-checked | BR-01, BR-07 |
DoesUserExist |
clsADUserServices |
inUserId, inExternalDomain |
Boolean |
Never faults — False for absent user and for directory failure alike |
None in code | BR-06, BR-07 |
DoesUserHaveResource |
clsADUserServices |
inUserId, inResourceName, inExternalDomain |
ADServiceResponse |
UserDoesNotExist | SoapException — no Try/Catch |
None in code | BR-06, BR-07 |
ChangeUserAccount |
clsADUserServices |
10 String parts |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist — never faults |
Access-checked | BR-01, BR-07 |
ChangeUserPassword |
clsADUserServices |
inUserId, inNewPassword |
ADServiceResponse |
Sentinel Failure only — never faults |
Access-checked | BR-01, BR-07 |
ChangeUserPasswordOrGetException |
clsADUserServices |
inUserId, inNewPassword |
ADServiceResponse |
SoapException — deliberately faulting variant, no Try/Catch |
Access-checked | BR-01, BR-07 |
GetUserEmail |
clsADUserServices |
inUserId, inExternalDomain |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist — never faults |
None in code | BR-06, BR-07 |
GetUserGroups |
clsADUserServices |
inUserId, inExternalDomain |
ArrayList |
Never faults — empty Catch returns empty list on any failure |
None in code | BR-06, BR-07 |
GetUserResources |
clsADUserServices |
inUserId, inProdEnvironment, inExternalDomain |
ArrayList |
Never faults — empty Catch returns empty list on any failure |
None in code | BR-06, BR-07 |
GetUserFAX |
clsADUserServices |
inUserId, inExternalDomain |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist — never faults |
None in code | BR-06, BR-07 |
GetUserLastLogon |
clsADUserServices |
inUserId, inExternalDomain |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist/InfoNotAvailable — never faults |
None in code | BR-06, BR-07 |
GetUserPrinter |
clsADUserServices |
inUserId |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist — never faults; internal domain only, no domain parameter offered |
None in code | BR-06 |
IsUserInGroup |
clsADUserServices |
inUserId, inGroupName, inExternalDomain |
ADServiceResponse |
Sentinel Failure/UserDoesNotExist/GroupDoesNotExist — never faults |
None in code | BR-06, BR-07 |
CheckAccess |
clsADUserServices |
None | HasAccessResponse |
SoapException — no Try/Catch |
None in code — is itself the access-control primitive | BR-02, BR-03, BR-04 |
Dispatch diagram¶
The following diagram visualizes how a caller reaches a handling operation.
flowchart TD
REQ["SOAP request"] --> ASMX{"Marker file match<br>clsADUserServices.asmx"}
ASMX -->|"No match"| NF["No listener at address<br>see faults.md"]
ASMX -->|"Match"| OPSEL{"Operation selected<br>by SOAP action"}
OPSEL -->|"Unknown action"| ACTFAULT["SOAP fault<br>method not recognized"]
OPSEL -->|"8 gated operations"| GATE{"CheckAccess<br>HasAccess?"}
OPSEL -->|"11 ungated operations"| OP["Operation body executes"]
GATE -->|"No"| DENY["ADServiceResponse<br>Failure / Access Denied"]
GATE -->|"Yes"| OP
OP --> SENTINEL["Sentinel response<br>ADServiceResponse / Boolean / ArrayList"]
OP --> FAULT["SoapException<br>see faults.md"]
Operations by process¶
Operations that delegate to a documented processing workflow link to it here.
Coverage¶
| Check | Result |
|---|---|
Service classes with a .asmx marker file |
1 |
Service classes with a contracts/ page |
1 |
<WebMethod()> members across all service classes |
19 |
| Rows in the operation catalog | 19 |
Related documentation¶
- Service index
- Overview
- Architecture
- Activation and hosting
- Faults and error pipeline
- Authentication and authorization
- Dependencies
- Configuration
- Operations and processes
- Business rules
- Operational runbook
- Tech debt
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\ADUserServices\clsADUserServices.asmxsrc\ADUserServices\clsADUserServices.asmx.vb.saifdocgen\state\runs\20260922-101326-aduserservices\analysis\aduserservices-analysis.md.saifdocgen\state\runs\20260922-101326-aduserservices\analysis\aduserservices-security-analysis.md