Remote-access clients on a VPN pool can end up talking to a domain controller on the far side of the world, and there are two ways to fix that: describe the pool as an Active Directory subnet tied to the site holding the right controllers, or pin the client or application to one specific controller. The first is a topology statement DC Locator can act on. The second is a per-application override that ignores the topology entirely. They cost different things, and reaching for the faster one today is how a directory team ends up maintaining both.

What each approach actually changes

A subnet object is a directory record that says which site an address range belongs to. With the Active Directory module and an existing site, the operation is small enough to preview:

New-ADReplicationSubnet -Name "10.90.0.0/24" -Site "Remote-Access-Hub" -WhatIf
Get-ADReplicationSubnet -Filter * | Select-Object Name,Site

-WhatIf previews the directory write. It does not create the object and it does not test whether a client in that range can reach anything, which is the part people expect it to do. DC Locator reads the site model when it resolves service records, so an accurate subnet object changes what the client is offered.

Pinning works at a different layer. A fixed controller name in an application config, an LDAP string with a host in it, or a registry value that names a preferred server all remove discovery from the path. The application talks to that controller until someone changes the setting, and failover is whatever that application implements.

Where subnet mapping wins

Mapping the pool describes network location once, for every client that uses DC Locator. When the pool grows from one /24 to three, the model changes in two or three objects instead of in an application inventory. That is the whole advantage, and it is large when the client population is not under your control.

The catch is that the object has to match the address the controller actually sees. If the VPN gateway translates every client to a hub address, adding the untranslated pool describes a network location that no controller ever observes. Decide early whether the design preserves the client source address, and if it does not, map the translated range instead of the pool you configured on the VPN server.

A second limit: the site model is a preference and a topology statement. It does not make a controller reachable, and it does not grant a user anything. Routes and firewall policy do the reachability; account policy does the authorization.

Where pinning wins

Pinning is the right answer when discovery cannot work: a legacy application that resolves a controller by a name you cannot change, a filter that permits exactly one controller address, or a fixed set of servers where the controller is part of the application design. In those cases the pin is documentation of a real constraint rather than a shortcut.

Its cost is the opposite of mapping. A pinned name does not follow the pool, does not fail over unless the application knows how, and does not survive a controller rename or decommission without an inventory sweep. It also hides topology problems, because every client that pins looks healthy while the site model quietly rots.

Replacing the domain's ordinary address records with one preferred server is not a third option. It breaks every consumer that expects the normal discovery set, and it still does not control how a directory-aware client selects a site.

Choose on three conditions

Ask them in this order and the decision usually makes itself. First, does the application use DC Locator at all, or does it already carry a controller address? Second, does the controller see the pool address, or a translated one? Third, how often does the pool change compared with how many places a pin would need to be updated?

Directory-aware applications plus source-preserving routing plus a pool that changes: map the subnet. An application that cannot discover, or a filter that admits one address: pin it, and write down why. Everything else is a case for fixing the topology rather than adding another override.

Verify from the VPN client and keep the contracts separate

Test from the actual remote path, not from a LAN workstation that already sits in the site. The client's own view is the only one that matters:

nltest /dsgetsite
nltest /dsgetdc:corp.example.com /force
echo %LOGONSERVER%

If the reported site is the one you mapped, the object is matching. If the client reports no site, the address it presents does not fall inside any subnet object, which usually means a translation or a stale prefix. Then check that the chosen controller is the one you intended before assuming the mapping failed, because clients cache discovery results and failover can legitimately select another controller.

Keep the three contracts in one document: the pool and its subnet objects, the controllers reachable from the VPN path, and the policy that decides what a signed-in user may do. A site is not a firewall rule and not a containment boundary, and the next pool change will silently detach remote users from the directory's network model unless the mapping, the routes and the documented alternatives move together.

Nuŋlɔɖi siwo ku ɖe eŋu