Windows Server for beginners. Part 2: Disks and network: diskpart, netsh and their PowerShell replacements

All parts of the series “Windows Server for beginners”

In the previous part we configured an address with four cmdlets from the NetTCPIP module. Any guide older than 2012 does the same with a single line of netsh interface ip set address, and leaves disk partitioning to diskpart. Both utilities are still here: they exist on every Windows from XP to Server 2025, they work in the recovery environment, where PowerShell modules may be missing, and they can do a few things nobody ever wrote cmdlets for. So an administrator needs to know both: to read other people's scripts, and to avoid being left without a tool when PowerShell isn't available.

This part is built like a two-way dictionary: what the old utility does, which cmdlet does it now, and where there is no cmdlet.


How Windows sees storage

Before partitioning anything, you need to understand what exactly is being partitioned. Windows has three levels:

 Disk                     a physical or virtual device: Disk 0, Disk 1, …
   └─ Partition           a piece of a disk with a type and a number: Partition 1, 2, …
        └─ Volume         a file system on a partition, with or without a letter: C:, D:, \\?\Volume{…}

A disk has a number (starting from zero), a partition style, a state (Online/Offline) and a read-only attribute. The partition style is the partition table:

  • MBR (Master Boot Record, 1983): a table of four entries in the first sector, 32-bit addresses, meaning disks up to 2 TB. More than four partitions only through an "extended" partition with logical drives inside. Boots in BIOS mode.
  • GPT (GUID Partition Table): 128 partitions by default, disks up to 9.4 ZB, each partition has a GUID identifier and a GUID type, a copy of the table at the end of the disk and checksums. Boots in UEFI mode. This is the standard for everything installed today.

A partition on a GPT disk has a type, and there are four types you'll find on a Windows system disk:

Partition Type GUID Size What's inside
EFI System Partition c12a7328-f81f-11d2-ba4b-00a0c93ec93b 100 MB FAT32, the \EFI\Microsoft\Boot\bootmgfw.efi boot loader and the BCD store
Microsoft Reserved (MSR) e3c9e316-0b5c-4db8-817d-f92df00215ae 16 MB empty; reserved for system use, no file system
Basic data ebd0a0a2-0b84-4a0b-9d6b-3b2b5b4b6a5a… the rest NTFS with Windows, the one that gets the letter C:
Windows RE de94bba4-06d1-4d40-a16a-bfd50179d6ac 600–1000 MB the winre.wim recovery environment

A volume is a file system on top of a partition: NTFS, ReFS, FAT32, exFAT. A volume can have a letter, a mount point in a folder on another volume, or nothing at all (EFI and RE have no letters). For servers the file system is NTFS, except when you need ReFS: it is more resilient to corruption and faster with virtual disks and databases, but it doesn't support compression, quotas or EFS encryption and can't be used for the system volume.

There are also dynamic disks — the Windows 2000 way of building a mirror or RAID-5 from several disks. They are deprecated: their replacement is Storage Spaces, where physical disks are combined into a pool and virtual disks with the required resiliency are carved out of the pool. Simple disks will be enough for this series.


diskpart

diskpart isn't a command but a separate shell with its own prompt. The main thing to understand about it: it works through a context. The select disk 1 command makes disk 1 current, and all subsequent commands — clean, convert, create — apply to it until something else is selected. That is also its main danger: a clean run on the wrong disk wipes the partition table in a second, with no confirmation at all.

A typical session on a new disk:

PS C:\> diskpart

Microsoft DiskPart version 10.0.26100.1150

Copyright (C) Microsoft Corporation.
On computer: DC1

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online           40 GB      0 B        *
  Disk 1    Online          100 GB   100 GB

DISKPART> select disk 1

Disk 1 is now the selected disk.

DISKPART> clean
DISKPART> convert gpt
DISKPART> create partition primary
DISKPART> format fs=ntfs label=Data quick
DISKPART> assign letter=D
DISKPART> list volume

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     C                NTFS   Partition     39 GB  Healthy    Boot
  Volume 1         Recovery     NTFS   Partition    799 MB  Healthy    Hidden
  Volume 2                      FAT32  Partition    100 MB  Healthy    System
  Volume 3     D   Data         NTFS   Partition    100 GB  Healthy

DISKPART> exit

What else diskpart can do, and which of it comes in handy:

Command What it does
list disk / list partition / list volume / list vdisk show the objects of a level
select disk N, select partition N, select volume N or a letter select the context
detail disk / detail partition details: ID, type, attributes, device path
clean / clean all wipe the partition table (fast) / zero out the whole disk
convert gpt / convert mbr change the partition style of an empty disk
create partition efi size=100, create partition msr size=16, create partition primary [size=MB] create a partition of the required type
format fs=ntfs quick label=X, assign letter=X, assign mount=C:\Mount\X, remove letter=X file system and letter
shrink desired=MB, extend [size=MB] resize a partition
online disk, offline disk, attributes disk clear readonly disk state
san policy=OnlineAll how to treat new disks (see below)
set id= and gpt attributes= partition type and its GPT attributes
create vdisk file=C:\x.vhdx maximum=10240 type=expandable, attach vdisk, detach vdisk VHD/VHDX virtual disks without Hyper-V
rescan rescan the bus

diskpart scripts are written to a text file, one command per line, and run with diskpart /s script.txt. This is still how disks are partitioned in deployment scripts and in autounattend.xml.

Another context where you can't do without diskpart is the recovery environment and the installer console (Shift+F10 in the setup window). There's either no PowerShell there or no Storage module, and that is exactly where you need to sort out partitions or recreate the EFI partition after losing the boot loader:

select disk 0
list partition
select partition 1          ← EFI
assign letter=S
exit
bcdboot C:\Windows /s S: /f UEFI

bcdboot copies the boot loader files from the installed Windows to partition S: and recreates the BCD boot configuration. These six lines bring back to life a server that "can't see the disk" after a failed firmware update or a move to another hypervisor.


The Storage module

Since Windows Server 2012, everything diskpart does can be done by the Storage module, with objects and through the pipeline. The same actions on a new disk:

PS C:\> Get-Disk

Number Friendly Name           Serial Number   HealthStatus OperationalStatus Total Size Partition Style
------ -------------           -------------   ------------ ----------------- ---------- ---------------
0      Msft Virtual Disk                       Healthy      Online                 40 GB GPT
1      Msft Virtual Disk                       Healthy      Online                100 GB RAW

PS C:\> Initialize-Disk -Number 1 -PartitionStyle GPT
PS C:\> New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D
PS C:\> Format-Volume -DriveLetter D -FileSystem NTFS -NewFileSystemLabel Data -Confirm:$false

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- ------------ -------------- --------- ------------ ----------------- -------------      ----
D           Data         NTFS           Fixed     Healthy      OK                     99.89 GB  99.98 GB

RAW as the partition style means an empty disk with no table. And here is the same thing in one line for all empty disks of a server, the way it's written in provisioning scripts:

Get-Disk | Where-Object PartitionStyle -eq RAW |
    Initialize-Disk -PartitionStyle GPT -PassThru |
    New-Partition -AssignDriveLetter -UseMaximumSize |
    Format-Volume -FileSystem NTFS -NewFileSystemLabel Data -Confirm:$false

That is the difference in approach: diskpart runs commands against the selected context, while PowerShell passes objects down the pipeline, and each next cmdlet works with what the previous one returned (-PassThru makes Initialize-Disk return the disk; otherwise it returns nothing).

How the other commands map:

diskpart Storage
list disk / list partition / list volume Get-Disk, Get-Partition, Get-Volume; physical disks — Get-PhysicalDisk
detail disk Get-Disk -Number 1 | Format-List *
clean Clear-Disk -Number 1 -RemoveData -RemoveOEM -Confirm:$false
convert gpt Set-Disk -Number 1 -PartitionStyle GPT (empty disks only)
create partition primary size= New-Partition -DiskNumber 1 -Size 20GB
create partition efi New-Partition -GptType '{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}' -Size 100MB
format fs=ntfs quick Format-Volume -FileSystem NTFS (quick by default, full with -Full)
assign letter= / assign mount= Set-Partition -NewDriveLetter E, Add-PartitionAccessPath -AccessPath C:\Mount\Data
shrink / extend Resize-Partition -Size …; limits — Get-PartitionSupportedSize
online disk, attributes disk clear readonly Set-Disk -Number 1 -IsOffline $false -IsReadOnly $false
san policy=OnlineAll Set-StorageSetting -NewDiskPolicy OnlineAll
attach vdisk Mount-DiskImage -ImagePath C:\x.vhdx (works for ISO too)
create vdisk New-VHD from the Hyper-V module; without Hyper-V — diskpart only
rescan Update-HostStorageCache

SAN policy deserves a separate word, because it explains the popular question "I attached a second disk to the server and it's Offline". The policy determines what to do with a disk the system sees for the first time. The Windows Server default is Offline Shared: disks on a shared bus (iSCSI, Fibre Channel, SAS with several hosts) stay Offline so that two servers don't start writing to the same LUN at once, while local ones come online immediately. To check and change it:

PS C:\> Get-StorageSetting | Select-Object NewDiskPolicy

NewDiskPolicy
-------------
OfflineShared

PS C:\> Set-StorageSetting -NewDiskPolicy OnlineAll

On a standalone server OnlineAll is safe and saves you a manual Set-Disk -IsOffline $false for every new disk.

What remains diskpart's domain. GPT subtleties — partition attributes (gpt attributes=0x8000000000000001 makes a partition "required", and Disk Management stops offering to delete it) and set id= to change a partition type — are only partly available in Storage through Set-Partition -GptType and -IsHidden. Creating a VHD without Hyper-V — diskpart only. And the recovery environment: Storage isn't available there. In every other case the module is more convenient.


netsh

netsh (network shell) appeared in Windows 2000 and is built differently from diskpart: it's a tree of contexts, each responsible for its own subsystem and implemented by a separate helper library. The command netsh interface ipv4 show addresses is the interface context, the ipv4 subcontext, the show addresses command. Run without arguments, netsh opens a shell where you can enter contexts as if they were directories:

PS C:\> netsh
netsh>interface ipv4
netsh interface ipv4>show addresses "Ethernet"

Configuration for interface "Ethernet"
    DHCP enabled:                         No
    IP Address:                           192.168.1.10
    Subnet Prefix:                        192.168.1.0/24 (mask 255.255.255.0)
    Default Gateway:                      192.168.1.1
    Gateway Metric:                       256
    InterfaceMetric:                      15

netsh interface ipv4>exit

The contexts you'll run into on servers:

Context Responsible for Replaced by
interface ipv4, interface ipv6 addresses, routes, DNS servers, MTU, protocol parameters NetTCPIP, DnsClient
interface tcp global TCP parameters: window auto-tuning, ECN, RSS Get-NetTCPSetting, Set-NetTCPSetting
interface portproxy TCP port forwarding no replacement
advfirewall Windows Firewall with Advanced Security and IPsec NetSecurity
http HTTP.sys: certificates on ports, URL reservations no replacement outside IIS
winhttp system proxy for services no replacement
trace traffic capture and component tracing to ETL pktmon
wlan Wi-Fi profiles not needed on servers
winsock, interface ip reset stack reset no replacement
dhcpclient, dnsclient client parts Get-NetIPInterface, Clear-DnsClientCache
nps, ras, routing, branchcache, lan server roles role modules (NPS, RemoteAccess, …)
dhcp, wins old server contexts removed: DhcpServer, dnscmd

netsh has two useful features that standalone commands lack. Any command can be run on another machine with the -r name switch (it works over RPC, in a domain — with Kerberos; the equivalent of -ComputerName and -CimSession in cmdlets). And many set commands have store=persistent / store=active: apply permanently or only until reboot, which is handy for experiments with MTU or routes when there's a risk of cutting yourself off from the server.


PowerShell network modules

Four modules replace netsh interface and advfirewall, with around two hundred cmdlets between them. The dozen you need:

NetAdapter — the physical and virtual adapter, layer 2:

Get-NetAdapter                                      # list, state, speed
Get-NetAdapter Ethernet | Get-NetAdapterAdvancedProperty   # Jumbo Packet, RSS, VLAN ID, offloads
Set-NetAdapterAdvancedProperty Ethernet -DisplayName 'Jumbo Packet' -DisplayValue '9014 Bytes'
Get-NetAdapterBinding Ethernet                      # which protocols are bound (ms_tcpip6 is IPv6: leave it alone)
Restart-NetAdapter Ethernet
Get-NetAdapterStatistics Ethernet                   # bytes, packets, errors

NetTCPIP — addresses, routes, layer 3 interfaces, connections:

Get-NetIPAddress -AddressFamily IPv4                # equivalent of netsh int ipv4 show addresses
Get-NetIPInterface                                  # DHCP on/off, metric, MTU (NlMtu) per interface and family
Set-NetIPInterface Ethernet -AddressFamily IPv4 -NlMtuBytes 1400   # netsh int ipv4 set subinterface mtu=
Get-NetRoute -AddressFamily IPv4                    # route print
New-NetRoute -DestinationPrefix 10.10.0.0/16 -InterfaceAlias Ethernet -NextHop 192.168.1.254
Get-NetNeighbor -AddressFamily IPv4                 # arp -a; for IPv6 — the NDP neighbor table
Get-NetTCPConnection -State Listen                  # netstat -an
Get-NetIPv6Protocol                                 # global IPv6 parameters

For a server with IPv6 from Router Advertisement, two Set-NetIPv6Protocol parameters are useful: -UseTemporaryAddresses Disabled turns off temporary addresses (nobody needs a server that changes its address once a day), and -RandomizeIdentifiers Disabled makes it build the interface identifier from the MAC address so the address is predictable. These are the equivalents of netsh interface ipv6 set privacy state=disabled and set global randomizeidentifiers=disabled.

DnsClient — the client side of DNS:

Get-DnsClientServerAddress                          # who is configured on each interface
Set-DnsClientServerAddress Ethernet -ServerAddresses 192.168.1.10, 192.168.1.11
Get-DnsClient                                       # suffixes, DNS registration per interface
Set-DnsClientGlobalSetting -SuffixSearchList corp.example.com, example.com
Resolve-DnsName dc1.corp.example.com -Type A        # nslookup with objects as output
Clear-DnsClientCache                                # ipconfig /flushdns
Register-DnsClient                                  # ipconfig /registerdns

NetSecurity — the firewall and IPsec:

Get-NetFirewallProfile                              # netsh advfirewall show allprofiles
Set-NetFirewallProfile -Profile Public -DefaultInboundAction Block
New-NetFirewallRule -DisplayName 'App 8080' -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow -Profile Domain
Get-NetFirewallRule -DisplayGroup 'Remote Desktop' | Enable-NetFirewallRule
Get-NetFirewallRule -Enabled True -Direction Inbound | Get-NetFirewallPortFilter | Where-Object LocalPort -eq 445
Get-NetFirewallRule -Direction Inbound -Enabled True -Action Allow | Format-Table DisplayName, Profile, Program

The same rule in netsh: netsh advfirewall firewall add rule name="App 8080" dir=in action=allow protocol=TCP localport=8080 profile=domain. One to one; the difference is that Get-NetFirewallRule returns objects, and their port, address and program filters live in separate objects, fetched with Get-NetFirewallPortFilter, Get-NetFirewallAddressFilter and Get-NetFirewallApplicationFilter. It's inconvenient until you get used to it, and very convenient afterwards: one query for "all rules that open 445 to the outside" across a hundred servers.

The network profile of an interface is a separate cmdlet, Get-NetConnectionProfile. On a standalone server the network often ends up Public, and half of the management rules are closed in that profile; you can switch it to Private with Set-NetConnectionProfile -InterfaceAlias Ethernet -NetworkCategory Private. The Domain profile can't be assigned by hand: an interface gets it on its own when it can see a domain controller.


What only netsh can still do

Port forwarding. netsh interface portproxy makes Windows listen on a port and forward connections to another address and port, including from IPv4 to IPv6 and back. There is no cmdlet, and apparently there won't be.

PS C:\> netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=192.168.1.20 connectport=80
PS C:\> netsh interface portproxy show all

Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         8080        192.168.1.20    80

It works thanks to the IP Helper service (iphlpsvc); if the service is disabled, the rules exist but nothing gets forwarded. A firewall rule for port 8080 has to be added separately. It comes in handy when you need to temporarily expose a service from another machine or forward a port into WSL.

HTTP.sys. The web server in Windows is built into the kernel: the HTTP.sys driver accepts connections, and IIS, WinRM, WSUS and ASP.NET Core services with the HttpSys server are its clients. Certificates are bound to ports at the HTTP.sys level, and the right to listen on a URL without administrator rights is granted there too:

netsh http show sslcert
netsh http add sslcert ipport=0.0.0.0:8443 certhash=3f1a…c9e2 appid='{12345678-0000-0000-0000-000000000001}'
netsh http add urlacl url=http://+:8080/ user='CORP\svc-app'
netsh http show urlacl

For IIS sites the WebAdministration module does this, but a service outside IIS (and WinRM over HTTPS, which we'll set up in the part about Remoting, is exactly that case) can only be configured here.

Proxy for services. Windows has two sets of proxy settings: WinINET — the per-user one, the one in the browser settings — and WinHTTP — the system one, used by Windows Update, WinRM, the WSUS client, Defender and services running under accounts without a profile. The second is set only with netsh:

netsh winhttp show proxy
netsh winhttp set proxy proxy-server="proxy.corp.example.com:3128" bypass-list="*.corp.example.com;<local>"
netsh winhttp reset proxy

A server that "can't see Windows Update" on a network with a mandatory proxy is cured with this command or by importing the user settings: netsh winhttp import proxy source=ie.

Stack reset. netsh winsock reset rebuilds the Winsock catalog, into which antivirus software, VPN clients and other layered service providers hook themselves; netsh interface ipv4 reset and ipv6 reset return the protocol settings to factory defaults. Both commands are a last resort for "the network is there but nothing works" after removing a badly written agent, and both require a reboot. The second one also wipes static addresses on all interfaces, so on a remote server it is only run from the hypervisor console.

Firewall export and import. netsh advfirewall export C:\fw.wfw saves the entire firewall policy, including IPsec rules, to a binary file, and import restores it. NetSecurity has Copy-NetFirewallRule between stores and GPO objects, but it can't give you the whole thing as a file in one step.

Traffic capture. tcpdump exists on Windows only as third-party ports — WinDump on top of the Npcap driver and the commercial tcpdump for Windows — and they require installing a capture driver on the server. There are two built-in ways to capture packets without installing anything.

The first is netsh trace, available since Windows 7. It writes an ETL file with packets and events of network components:

netsh trace start capture=yes tracefile=C:\Temp\dns.etl maxsize=200 persistent=no
Resolve-DnsName www.example.com
netsh trace stop

The ETL file opens in Microsoft Network Monitor or Message Analyzer, or is converted to pcapng with Microsoft's etl2pcapng utility from GitHub and opened in Wireshark. The persistent=yes parameter continues the capture after a reboot, which is invaluable for "at system startup" problems.

The second is pktmon, available since Windows Server 2019 and Windows 10 1809, and it's more convenient: it supports filters and converts to pcapng by itself.

PS C:\> pktmon filter add -p 53
PS C:\> pktmon start --capture --pkt-size 0
Logger Parameters:
    Logger name:          PktMon
    Logging mode:         Circular
    Log file:             C:\Temp\PktMon.etl
    Max file size:        512 MB
    Memory buffers:       64 MB
Collected Data:
    Packet counters, packet capture
Capture Type:
    All packets

PS C:\> Resolve-DnsName www.example.com | Out-Null
PS C:\> pktmon stop
Flushing logs...
Merging metadata...
Log file: C:\Temp\PktMon.etl (No events lost)

PS C:\> pktmon etl2pcap C:\Temp\PktMon.etl --out C:\Temp\dns.pcapng
Processing...
Packets total:       4
Packet drop count:   0
Packets formatted:   4
Formatted file:      C:\Temp\dns.pcapng

pktmon filter add -p 53 means port 53 only, --pkt-size 0 means whole packets, not the first 128 bytes. Real time works too: pktmon start --capture --log-mode real-time prints packets to the console, like tcpdump without the -w flag. The resulting pcapng opens in Wireshark on a workstation, and from there it's all as in the networking series. In the parts about Kerberos and replication, this is exactly how we'll capture the exchanges.


A hands-on look

Who is listening on the server's ports is a question that comes up every time a "port is in use" or a "service doesn't respond". netstat -ano shows the PID; Get-NetTCPConnection gives objects you can attach the process name to:

PS C:\> Get-NetTCPConnection -State Listen |
    Select-Object LocalAddress, LocalPort, OwningProcess, @{n='Process'; e={(Get-Process -Id $_.OwningProcess).ProcessName}} |
    Sort-Object LocalPort -Unique | Format-Table -AutoSize

LocalAddress LocalPort OwningProcess Process
------------ --------- ------------- -------
0.0.0.0            135           916 svchost
0.0.0.0            445             4 System
0.0.0.0           3389          1204 svchost
0.0.0.0           5985             4 System
::                47001            4 System
0.0.0.0          49664           728 lsass
0.0.0.0          49665          1000 svchost

Four ports you'll find on any server: 135 is the RPC Endpoint Mapper, through which RPC services find each other (we'll deal with it in the part about how AD works); 445 is SMB; 5985 and 47001 are WinRM (the second is an internal listener for local subscriptions); 3389 is RDP, which we enabled in the previous part. The System process with PID 4 on 445 and 5985 is the kernel drivers srv2.sys and HTTP.sys, not user processes. lsass on 49664 is the Local Security Authority listening on a dynamic RPC port; once the server becomes a controller, it will also get 88 (Kerberos), 389 and 636 (LDAP), 3268 and 3269 (global catalog), 53 (DNS), 464 (Kerberos password change) and 9389 (AD Web Services).

The routing table:

PS C:\> Get-NetRoute -AddressFamily IPv4 | Where-Object NextHop -ne '0.0.0.0' | Format-Table DestinationPrefix, NextHop, InterfaceAlias, RouteMetric, ifMetric

DestinationPrefix NextHop     InterfaceAlias RouteMetric ifMetric
----------------- -------     -------------- ----------- --------
0.0.0.0/0         192.168.1.1 Ethernet                 0       15

Routes with NextHop 0.0.0.0 are local subnets and the host's own addresses; there are many of them and they are uninteresting. There is one default route; the route metric plus the interface metric gives the total cost, and when there are several interfaces and traffic goes "the wrong way", these sums are exactly what you compare. If you want the old view, route print is still there.

And the whole disk as the system sees it, from the physical device to the volume:

PS C:\> Get-PhysicalDisk | Format-Table DeviceId, FriendlyName, MediaType, BusType, Size, HealthStatus
PS C:\> Get-Disk 0 | Get-Partition | Format-Table PartitionNumber, Type, GptType, Size, DriveLetter, IsBoot, IsSystem

PartitionNumber Type      GptType                                Size DriveLetter IsBoot IsSystem
--------------- ----      -------                                ---- ----------- ------ --------
1               System    {c12a7328-f81f-11d2-ba4b-00a0c93ec93b} 100 MB                False True
2               Reserved  {e3c9e316-0b5c-4db8-817d-f92df00215ae}  16 MB                False False
3               Basic     {ebd0a0a2-0b84-4a0b-9d6b-3b2b5b4b6a5a}  39 GB C             True False
4               Recovery  {de94bba4-06d1-4d40-a16a-bfd50179d6ac} 799 MB                False False

These are the four partitions we talked about at the beginning. IsSystem is the partition with the boot loader, IsBoot is the partition with Windows; Microsoft's terminology names them exactly the opposite of what you'd expect, and it's worth memorizing once.


We have a server, and we can read its disks and network at any level. Time to get to what all this was for. But before running Install-ADDSForest, it's worth understanding what exactly this command will create: a forest, a domain, directory partitions, a global catalog, SYSVOL and five protocols that hold it all together.

Next — Part 3: how Active Directory works. Forest, tree, domain and OU; what directory partitions are and why there are four of them; the global catalog; SYSVOL; and an overview of the LDAP, Kerberos, NTLM, SMB and RPC protocols — what each of them does in a domain and when it comes into play.

Only registered users can leave a comment.

Sign in or register to leave a comment.