So you are about to document your network and os environment? You don’t want to purchase 3rd party software? You want to list all server roles from all servers in your network? Here you go … with PowerShell, what else? 😉
What can I expect from this blog post? Take a look at the picture below. If this is what you are looking for, read on …
Windows Server supports the installation of so called features and roles. Features are only locally relevant. Roles are network roles, for example DHCP, DNS and so on.
You can copy & paste the code right here, or you can download the entire script you will find at the end of this post and in my downloads section.
Code: Retrieve all Server Roles
Here it is. Copy and paste the lines into PowerShell ISE or Visual Studio Code and pull the trigger, usually hit F5.
By the way: This script was tested in PowerShell 5.1 and PowerShell 7.
# .SYNOPSIS # This script collects all installed Server Roles and Features # from all domain-joined Windows Servers. # .DESCRIPTION # The result is displayed in the console and a report will be # saved in $HOME\ServerRoles"Date".txt. # The file will open automatically. # .NOTES # Run this script with administrative privileges # on a domain-controller of your domain. # Supported PowerShell versions: PowerShell 5.1, PowerShell 7 # .AUTHOR # Patrick Gruenauer | Microsoft MVP PowerShell [2018-2020] # .WEB # https://sid-500.com ############################ CODE ############################### ### Retrieving all Servers by Name $ErrorActionPreference = "SilentlyContinue" $servers = (Get-ADComputer -Properties operatingsystem ` -Filter 'operatingsystem -like "*server*" -and enabled -eq "true"').Name ### Collection Point $result = @() ### Ping all Member-Server and if ping is successful run # Get-WindowsFeature foreach ($item in $servers) { $test = Test-Connection $item -Count 1 ### Providing PowerShell 7 and 5.1 compatibility in terms of return code If ($test.Status -eq 'Success' -or $test.StatusCode -eq '0') { $roles = Get-WindowsFeature -ComputerName $item | Where-Object InstallState -EQ 'Installed' ### Write into the collection point $result += New-Object -TypeName PSObject -Property ([ordered]@{ 'Server' = $item 'Roles' = $roles.Name -join "`r`n" ### Escape Character CarriageReturn (`r) + NewLine (`n) } ) } } ### Generating Outputs # Collecting Point: Console Output Write-Output $result | Format-Table -Wrap # Text File Output $date = Get-Date -Format MM.dd.yyyy $result | Format-Table -Wrap | Out-File "$HOME\ServerRoles$date.txt" Write-Warning "Output file ServerRoles$date.txt generated in $HOME ... Opening file ..." # Opening File Start-Process $HOME\"ServerRoles$date.txt"
As mentioned, copy the code above into your PowerShell editor of your choice or download the script in the Downloads section of my website.
For retrieving server roles on individual servers see Windows Server: List all installed Roles and Features using PowerShell
Have fun documenting!
Categories: Cyber Security, PowerShell, Windows Server
I would also suggest doing it as follows if you only want to get the roles without features
Get-WindowsFeature -ComputerName $item | Where-Object { ( $_.InstallState -EQ ‘Installed’ ) -and ($_.FeatureType -EQ ‘Role’) }
LikeLike
Hey Patrick, it looks like the script only works on 2012/R2 and newer since 2008 servers don’t natively recognize the get-WindowsFeature cmdlet. Do you have a recommendation on how we could modify the script to include 2008 servers? Or maybe a way we could modify the script to run after pulling 2012 and newer inventory. Thanks!
LikeLike
No idea. Check WinRM on 2008 servers.
LikeLike
I have 6 servers, both with installed functions, but only three servers appeared in the search.
LikeLike
Check WinRM settings
LikeLike