SIA Doctor — check-domain-controller¶
idsec sia doctor check-domain-controller verifies that SIA connectors can reach domain controllers on the ports required for Windows ZSP-domain-ephemeral flows (Kerberos, LDAP, LDAPS, kpasswd, RDP). In parallel, it probes the LDAPS and RDP server certificates directly and validates them against your tenant-uploaded certificates.
Use this command to diagnose issues with Windows domain-joined target access where SIA connectors need to authenticate users through Active Directory.
How it works¶
The command follows the same two-phase pattern as check-target.
Phase 1 — DC address resolution (when credentials are provided)¶
When a DC entry includes credentials, the doctor opens a WinRM (or SSH) connection to the DC before firing any reachability probes:
- Resolves the DC's private IPs and FQDN (
Get-NetIPAddress,[System.Net.Dns]::GetHostEntry). - These resolved addresses replace the given
hostnamefor all connector→DC reachability checks.
A resolved-dc row appears in the report showing which addresses were found. If the connection fails, the doctor falls back to the given hostname and adds a notice.
When no credentials are provided, checks run against the given hostname directly.
Phase 2 — Reachability and certificate probing (concurrent)¶
Both sub-phases run in parallel under the --timeout-sec deadline.
Connector→DC reachability¶
The doctor calls the SIA reachability API for every (connector, DC address, port) combination in parallel. The same preferred-connector / unroutable-connector optimisations as check-target apply.
Fixed ports checked per DC:
| Protocol | Port | Purpose |
|---|---|---|
| ldap | 389 | LDAP bind (clear-text / SASL) |
| ldaps | 636 | LDAP over TLS |
| kerberos | 88 | Kerberos ticket exchange |
| kpasswd | 464 | Kerberos password change |
| rdp | 3389 | RDP — DCs are Windows hosts |
TLS certificate probing¶
Concurrently, the doctor dials the DC from the SDK host and performs a TLS handshake on:
- LDAPS (port 636) — direct TLS
- RDP (port 3389) — X.224 connection request negotiation, then TLS
The extracted server certificates are validated against the tenant certificate pool. Because DC certificates are typically issued by an internal enterprise CA, it is common to need to upload that CA's root certificate to SIA.
If the DC's FQDN was resolved in Phase 1, the probe first tests the original hostname (which the DC's TLS certificate is issued for) and propagates the trusted / untrusted verdict to the resolved private addresses.
DC object¶
Each entry in --domain-controllers uses this JSON shape. Only hostname is required:
1 2 3 4 5 6 7 | |
| Field | Description |
|---|---|
hostname |
FQDN or IP of the domain controller. Required. |
os_type |
Should be windows for DCs. Enables WinRM-based address resolution. |
username |
WinRM username (domain or local). Enables address resolution. |
password |
WinRM password. |
private_key_path |
SSH private key (if the DC is reachable over SSH — uncommon). |
winrm_protocol |
http or https (default https). |
Kerberos/LDAP/LDAPS/kpasswd ports are not overridable in DC mode — standard ports are always used.
Examples¶
Minimal — local machine as DC (no arguments)¶
idsec sia doctor check-domain-controller
One or more explicit DCs by hostname¶
idsec sia doctor check-domain-controller --domain-controllers '[
{"hostname": "dc01.corp.local"},
{"hostname": "dc02.corp.local"}
]'
DC with WinRM credentials (enables private-address resolution)¶
idsec sia doctor check-domain-controller --domain-controllers '[
{
"hostname": "dc01.corp.local",
"os_type": "windows",
"username": "corp\\admin",
"password": "secret",
"winrm_protocol": "https"
}
]'
The doctor connects over WinRM, resolves the DC's private IPs and FQDN, and then runs connector→DC reachability against those private addresses.
Multiple DCs¶
idsec sia doctor check-domain-controller --domain-controllers '[
{
"hostname": "dc01.corp.local",
"os_type": "windows",
"username": "corp\\admin",
"password": "secret"
},
{
"hostname": "dc02.corp.local",
"os_type": "windows",
"username": "corp\\admin",
"password": "secret"
}
]'
Restrict to specific connectors¶
idsec sia doctor check-domain-controller \
--domain-controllers '[{"hostname": "dc01.corp.local"}]' \
--connector-ids '["CMSConnector_abc123"]'
Disable TLS certificate validation¶
idsec sia doctor check-domain-controller \
--domain-controllers '[{"hostname": "dc01.corp.local"}]' \
--disable-certificate-check
Increase timeout for large environments¶
idsec sia doctor check-domain-controller \
--domain-controllers '[{"hostname": "dc01.corp.local"}]' \
--timeout-sec 120 \
--concurrency-limit 64
Reading the output¶
| Status | Meaning |
|---|---|
pass |
Connector can reach the DC on this port |
fail |
No connector could reach the DC — check network/firewall between connector and DC |
skipped |
Credentials not provided (address resolution skipped) |
| Cert status | Meaning |
|---|---|
trusted |
LDAPS or RDP certificate chains to a tenant-uploaded certificate |
untrusted |
Certificate not trusted — upload the enterprise CA root |
unverified |
Could not probe cert (port unreachable or tenant cert list unavailable) |
A fail on ldap/ldaps/kerberos means connectors cannot perform Active Directory lookups, which will break all ZSP-domain-ephemeral Windows flows (RDP, MSSQL, DB2). A fail on rdp only affects direct RDP connectivity from the connector.
An untrusted LDAPS cert means the connector will reject the DC's certificate during TLS negotiation. Add the issuing CA:
idsec sia certificates create \
--cert-name "corp-root-ca" \
--cert-type PEM \
--file /path/to/corp-root-ca.crt
Flags¶
| Flag | Default | Description |
|---|---|---|
--domain-controllers |
(local hostname) | JSON array of DC objects. |
--connector-ids |
(all) | Restrict which connectors perform reachability checks. |
--disable-certificate-check |
false |
Skip LDAPS and RDP TLS certificate validation. |
--timeout-sec |
30 |
Overall operation timeout in seconds. |
--concurrency-limit |
32 |
Max parallel reachability checks. |