For a hostname to resolve into its IP address, there are several DNS servers that may be queried. Assuming caching doesn't happen, it goes from whoever made the request (the client), the recursive DNS, the root DNS, the TLD DNS and finally the authoritative name server.

Do I have the order right? Are requests forwarded or does the server just reply with IP address of the server on the next level that should be contacted by the client? For example does the recursive name server do the actually querying on the root server or does it just pass the IP address of the root server along ? I'm guessing it's the first for caching purposes. Also, what stages can caching happen at, for example would the root server have a cached response from the TLD server? Since there's only 13 unique root servers, what is the point of having that level instead of just going directly to the TLD server?
['https://superuser.com/questions/1620729', 'https://superuser.com', 'https://superuser.com/users/699180/']
To start with, the type `[Microsoft.Update.Session]` is not really a built-in Powershell object, but part of the [windows update agent (WUA) API](https://docs.microsoft.com/en-us/windows/win32/wua_sdk/searching--downloading--and-installing-updates). As such, it doesn't have any built-in help files or examples powershell can show you, but it is searcheable on the Microsoft site.

The linked MS doc has some good examples of how to use the api to do different things with windows update, and it can mostly be directly converted for use in Powershell.

I happen to have used this before, so here are some basics in powershell:

```
# Create a new update session, and search for updates
$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Example Client ID"
$updateSearcher = $updateObject.CreateUpdateSearcher()

# Search for updates using a simple search filter, and save the results to a variable:
$searchResults = $updateSearcher.Search("IsInstalled=0")

# If there are updates available, download them:
if ($searchResults.Updates -and $searchResults.Updates.count -gt 0){
    $count=$searchResults.Updates.count
    Write-Output ( "Found " + $searchResults.Updates.Count + " Updates" )
    $updateDownloader = $updateObject.CreateUpdateDownloader()
    $updateDownloader.Updates = $searchResults.Updates
    Write-Output "Downloading..."
    $updateDownloader.Download()

    # Then install the updates:
    $updateInstaller = $updateObject.CreateUpdateInstaller()
    $updateInstaller.Updates = $searchResults.Updates
    Write-Output "Installing..."
    $result = $updateInstaller.Install()

    # Then output the result
    Write-Output ("Installation Result: " + $Result.ResultCode)
    Write-Output ("Reboot Required: " + $Result.RebootRequired)
}
else { Write-Output "No updates found. Exiting..." }

```

As far as searching for specific updates, you'll want to add your filters to the `$UpdateSearcher.`[Search()](https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-iupdatesearcher-search) method. Looks like this can have type='Software' or type='Driver' for example.

Note that the WUA API has a bug/feature that generally **requires** it to be run locally on a machine instead of started remotely, though you can get around this by creating a scheduled task that runs your script.

And finally, to actually answer your question - As a general rule, `Get-Member $MyObject` and `Get-Help $MyCommand` will help you through discovering most built-in Powershell capabilities.
The easiest is to use the `Get-Member` cmdlet, like:

```
$Updates | Get-Member

```

in this case it is most likely a COM object, but it should still show you the Methods and Properties