The Definitive IT Infrastructure Assessment Guide for Modern Enterprises

In an era defined by rapid technological shifts, an aging or inefficient IT infrastructure can become a significant liability, manifesting as performance bottlenecks, security vulnerabilities, prohibitive operational costs, and stalled innovation. To navigate these challenges effectively and chart a clear path forward, a comprehensive IT infrastructure assessment guide is not just recommended—it's imperative. This guide provides a CLI-first framework for senior IT administrators and architects to systematically evaluate their environment, uncover critical insights, and prepare for strategic initiatives like cloud migration, security hardening, or a full infrastructure revamp. By the end, you'll possess the practical commands and strategic thinking required to conduct a thorough assessment, driving impactful change within your organization.
Prerequisites
- Administrator-level access to all target servers (Windows and Linux).
- An active Azure subscription with 'Reader' and 'Security Reader' roles (at minimum) for assessment.
- Azure CLI and Azure PowerShell modules installed and authenticated on your workstation.
- PowerShell 7.x or later on Windows machines for best scripting practices.
- Network connectivity to all on-premises infrastructure components.
- Basic understanding of networking, operating systems, and cloud concepts.
Step 1: Define Scope, Objectives, and Tools
Before executing any commands, clearly define what your assessment aims to achieve. Are you focusing on cloud migration readiness, identifying security gaps, or optimizing performance? Without clear objectives, you risk collecting irrelevant data or missing critical insights. Establish the boundaries of your assessment (e.g., all production servers, specific applications, network segments). This step also involves gathering necessary access credentials and ensuring your workstation is configured with the required CLI tools.
# Example: Authenticate Azure CLI
az login
# Example: Authenticate Azure PowerShell
Connect-AzAccount
az login: Initiates an interactive browser login for Azure CLI.Connect-AzAccount: Initiates an interactive browser login for Azure PowerShell.
Opinionated: Always start with a small, representative scope if this is your first large-scale assessment. Learn, refine your process, then expand. A spreadsheet or CMDB is essential here to track assets and progress, along with a secure password management solution for credentials.
Portal alternative: While core authentication is CLI-driven, you'll manage permissions and review subscription details in the Azure portal under "Subscriptions" and "Access control (IAM)".
Expected confirmation: Successful authentication to Azure and clear documentation of your assessment scope and objectives.
Step 2: Inventory Hardware & Software Assets
The foundation of any infrastructure assessment is a comprehensive understanding of what you own and operate. This step involves discovering all computing resources, their specifications, operating systems, and key installed software. This baseline inventory is crucial for subsequent analysis, including performance, security, and cloud migration suitability.
On-premises Windows Servers:
# Get basic system information
Get-CimInstance -ClassName Win32_ComputerSystem | Select-Object Name, Manufacturer, Model, NumberOfProcessors, TotalPhysicalMemory, Domain, Roles | Format-Table -AutoSize
# List installed software (Note: not all software registers in this location)
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, InstallDate, Publisher | Where-Object {$_.DisplayName -ne $null} | Sort-Object DisplayName | Format-Table -AutoSize
Get-CimInstance -ClassName Win32_ComputerSystem: Retrieves detailed information about the local computer system.Select-Object Name, ...: Filters the properties to display specific hardware and OS details.Format-Table -AutoSize: Formats the output as a table, automatically adjusting column widths.Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*: Lists installed software by querying the registry's uninstall key.Where-Object {$_.DisplayName -ne $null}: Filters out entries without a display name (often partial or system components).
On-premises Linux Servers:
# Get basic system information
lscpu && free -h && df -h --total && uname -a
# To list installed packages (example for Debian/Ubuntu based systems):
dpkg -l | grep -v '^ii' | awk '{print $2, $3}' | sort # lists installed package name and version
# For RedHat/CentOS based systems:
rpm -qa --qf '%{NAME} %{VERSION}\n' | sort # lists installed package name and version
lscpu: Displays CPU architecture information.free -h: Shows human-readable memory usage.df -h --total: Reports disk space usage for all filesystems, including a total.uname -a: Prints system information (kernel name, version, architecture).dpkg -l | grep -v '^ii': Lists installed Debian/Ubuntu packages and filters out uninstalled ones.rpm -qa --qf '%{NAME} %{VERSION}\n': Lists all installed Red Hat/CentOS packages with name and version.
Azure Virtual Machines:
az vm list --query "[].{Name:name, OS:storageProfile.osDisk.osType, Size:hardwareProfile.vmSize, ResourceGroup:resourceGroup, Location:location, PowerState:powerState, Tags:tags}" -o table
az vm list: Retrieves a list of all virtual machines in your subscription.--query "[].{...}": Uses JMESPath to project custom output fields, including important tags for categorization.-o table: Formats the output as a readable table.
Portal alternative: For Windows, Server Manager or `msinfo32`. For Azure, navigate to "Virtual machines" in the Azure portal for an overview.
Expected confirmation: A populated asset inventory (e.g., spreadsheet, CMDB entry) detailing hardware specs, OS versions, and key software for all in-scope systems.
Step 3: Assess Performance & Resource Utilization
Understanding how your infrastructure performs under typical and peak loads is critical for identifying bottlenecks, assessing scalability, and pinpointing opportunities for optimization or rightsizing. This step involves collecting CPU, memory, disk I/O, and network utilization metrics over a period to establish baselines and detect anomalies. Remember that short-term snapshots (like the CLI commands below) are good for quick checks, but long-term monitoring is needed for comprehensive analysis.
On-premises Windows Servers:
# Collect key performance counters over a short period (e.g., 1 minute)
$counters = @(
'\Processor(_Total)\% Processor Time',
'\Memory\Available MBytes',
'\LogicalDisk(C:)\% Free Space',
'\LogicalDisk(C:)\Avg. Disk Queue Length',
'\Network Interface(*)\Bytes Total/sec'
)
Get-Counter -Counter $counters -SampleInterval 5 -MaxSamples 12 | Select-Object -ExpandProperty CounterSamples | Format-Table -AutoSize
Get-Counter -Counter $counters: Collects data for specified performance counters.-SampleInterval 5: Collects data every 5 seconds.-MaxSamples 12: Collects 12 samples, for a total of 60 seconds of data.Select-Object -ExpandProperty CounterSamples: Expands the `CounterSamples` property for easier viewing.
On-premises Linux Servers:
top -b -n 1 | head -n 5 # Quick snapshot of CPU and memory
iostat -xh 1 5 # Detailed disk I/O stats (requires sysstat package) sampled over 5 seconds
free -h -s 5 -c 3 # Memory usage every 5 seconds, 3 times
top -b -n 1: Runs `top` in batch mode (non-interactive) and exits after one iteration.head -n 5: Displays only the first 5 lines of `top`'s output, showing summary CPU and memory.iostat -xh 1 5: Provides extended disk statistics (`-x`), human-readable (`-h`), sampled every 1 second for 5 samples.free -h -s 5 -c 3: Displays memory usage in human-readable format, sampled every 5 seconds for 3 times.
Azure Virtual Machines:
# Get VM resource ID for monitoring
$vm_id = az vm show -g <YOUR_RESOURCE_GROUP> -n <YOUR_VM_NAME> --query id -o tsv
# Get CPU and Network In/Out metrics for the last 24 hours, aggregated hourly
az monitor metrics list --resource $vm_id --metric "Percentage CPU" "Network Read Total" "Network Write Total" "Disk Write Bytes/sec" "Disk Read Bytes/sec" --start-time "$(Get-Date -UFormat '%Y-%m-%dT%H:00:00Z' -Date (Get-Date).AddHours(-24))" --end-time "$(Get-Date -UFormat '%Y-%m-%dT%H:00:00Z')" --interval PT1H -o table
az vm show -g ... -n ... --query id -o tsv: Retrieves the full resource ID of a specific VM.az monitor metrics list --resource $vm_id: Queries Azure Monitor for metrics related to the specified resource.--metric "Percentage CPU" ...: Specifies the metrics to retrieve (CPU, network, disk I/O).--start-time "..." --end-time "...": Defines the time range for metric collection. PowerShell's `Get-Date` is used for dynamic timestamps.--interval PT1H: Sets the aggregation granularity to 1 hour (PT1H = Period Time 1 Hour).
Portal alternative: Windows Performance Monitor (perfmon.exe), Azure Monitor via the Azure portal dashboard, or directly on a VM's "Monitoring" blade.
Expected confirmation: Raw performance data collected over a specified period, enabling identification of average utilization, peak loads, and potential resource constraints. This data forms the basis for rightsizing recommendations.
Step 4: Evaluate Network Configuration & Connectivity
A stable and secure network is the backbone of any IT infrastructure. This step focuses on understanding the network topology, evaluating bandwidth and latency, identifying open ports, and assessing firewall rules. Poor network performance or misconfigurations can significantly impact application responsiveness and create severe security risks. Focus on critical application flows.
On-premises Windows Systems:
# Get network adapter details
Get-NetAdapter | Select-Object Name, LinkSpeed, Status, MacAddress, PromiscuousMode | Format-Table -AutoSize
# Get IP configuration and DNS servers
Get-NetIPConfiguration | Select-Object InterfaceAlias, IPv4Address, IPv6Address, DNSServer | Format-Table -AutoSize
# Test connectivity to a target service (e.g., RDP port)
Test-NetConnection -ComputerName <TARGET_IP_OR_HOSTNAME> -Port 3389 -InformationLevel Detailed
Get-NetAdapter: Retrieves basic information about network adapters.Get-NetIPConfiguration: Provides IP address, DNS server, and other network configuration details.Test-NetConnection -ComputerName ... -Port ...: Tests network connectivity to a specific host and port, useful for verifying firewall rules and service availability.
On-premises Linux Systems:
ip a && netstat -tuln # Show network interfaces and listening TCP/UDP ports
# Test connectivity (e.g., to a DNS server or web server)
ping -c 4 <TARGET_IP_OR_HOSTNAME>
traceroute <TARGET_IP_OR_HOSTNAME>
nslookup <HOSTNAME_TO_RESOLVE>
ip a: Displays network interface addresses.netstat -tuln: Shows TCP and UDP listening sockets numerically.ping -c 4: Sends 4 ICMP echo requests to test basic connectivity.traceroute: Traces the route packets take to a network host.nslookup: Queries internet domain name servers.
Azure Network Components:
# List Network Interfaces and their IPs
az network nic list --query "[].{Name:name, PrivateIP:ipConfigurations[0].privateIpAddress, PublicIP:ipConfigurations[0].publicIpAddress.ipAddress, RG:resourceGroup, DNS:ipConfigurations[0].dnsSettings.dnsServers, VNet:ipConfigurations[0].subnet.id}" -o table
# Show effective security rules for a VM's NIC
az network nsg list-effective-security-groups --resource-group <VM_RESOURCE_GROUP> --vm <VM_NAME> --query "[0].networkInterfaces[0].effectiveSecurityRules" -o json
# Test IP Flow (simulate traffic through NSGs)
az network diagnostic check-ip-flow --resource-group <VM_RESOURCE_GROUP> --vm-name <VM_NAME> --direction Outbound --protocol TCP --local-port 8080 --destination-port 80 --destination-ip <TARGET_IP> --query '{Access:access, RuleName:ruleName}' -o table
az network nic list: Lists all network interfaces and their associated IP configurations.az network nsg list-effective-security-groups: Shows the combined effective security rules (NSGs, ASGs) applied to a VM's network interface, crucial for understanding allowed traffic.az network diagnostic check-ip-flow: Simulates a 5-tuple flow (source IP, destination IP, source port, destination port, protocol) to determine if it's allowed or denied by NSGs.
Portal alternative: Windows Network and Sharing Center, Azure Portal for Virtual Networks, Network Security Groups, and Network Interfaces. Use Azure Network Watcher for more advanced diagnostic tools like IP flow verify.
Expected confirmation: A clear picture of IP addressing, DNS configurations, link speeds, open ports, and effective firewall rules for critical systems. This helps map out potential network chokepoints and security gaps.
Step 5: Assess Security Posture
Security is paramount. This step focuses on identifying potential vulnerabilities, misconfigurations, and compliance deviations. It's about understanding who has access, what services are exposed, and if systems are being regularly patched and monitored. While a full penetration test is outside this guide's scope, initial CLI-based checks can reveal common weaknesses that often lead to more significant issues.
On-premises Windows Systems:
# List all services that start automatically but are not running (potential misconfigurations or disabled security agents)
Get-WmiObject -Class Win32_Service | Where-Object {$_.StartMode -eq "Auto" -and $_.State -ne "Running"} | Select-Object Name, DisplayName, StartMode, State | Format-Table -AutoSize
# Check for open TCP/UDP ports and associated processes (requires admin rights)
netstat -ano | Select-Object -Unique LocalAddress, LocalPort, State, OwningProcess | Where-Object {$_.LocalPort -ne $null} | Sort-Object LocalPort | Format-Table -AutoSize
# Basic user and group enumeration
Get-LocalUser | Select-Object Name, Enabled, PasswordRequired, Description | Format-Table -AutoSize
Get-LocalGroup | Select-Object Name, Description | Format-Table -AutoSize
Get-WmiObject -Class Win32_Service: Retrieves information about Windows services.netstat -ano: Displays active connections, listening ports, and the process ID (PID) associated with each.Get-LocalUser/ `Get-LocalGroup`: Enumerates local user accounts and groups, vital for assessing local privilege management.
On-premises Linux Systems:
ss -tuln # More efficient than netstat for showing listening sockets
cat /etc/passwd | cut -f1 -d: | sort # List all system users
find / -type f -perm /002 -print 2>/dev/null # Find world-writable files (potential security risk)
# Check sudoers file for broad permissions (CAUTION: this might require specific permissions and careful handling)
cat /etc/sudoers # Review manually for broad ALL=(ALL) ALL permissions
ss -tuln: Lists TCP and UDP listening sockets.cat /etc/passwd | cut -f1 -d:: Extracts usernames from the password file.find / -type f -perm /002: Searches for regular files that are world-writable.cat /etc/sudoers: Displays the sudoers file, which defines what users can run commands as root.
Azure Security Posture (via Defender for Cloud):
# List unhealthy or unconfigured security assessments/recommendations
az security assessment list --query "[?status.code=='Unhealthy' || status.code=='NotApplicable'].{DisplayName:displayName, Status:status.code, Resource:resourceDetails.id, Description:description, Severity:status.severity}" -o table
# Check if Defender for Cloud agents are auto-provisioned across subscriptions
az security auto-provisioning-setting list -o table
# List all JIT VM Access Policies for VMs (Just-in-Time VM Access)
az security jit-policy list --query "[].{Name:name, Location:location, VirtualMachines:virtualMachines[].id}" -o table
az security assessment list: Retrieves a list of security assessments (recommendations) from Azure Security Center (now Defender for Cloud).--query "[?status.code=='Unhealthy' ...}": Filters for assessments with 'Unhealthy' or 'NotApplicable' status, indicating issues or unconfigured settings.az security auto-provisioning-setting list: Verifies if auto-provisioning of security agents (e.g., Log Analytics agent) is enabled, which is crucial for comprehensive monitoring.az security jit-policy list: Lists Just-in-Time VM access policies, which are critical for securing management ports on Azure VMs.
Portal alternative: Windows Security Center, Azure Defender for Cloud dashboard in the Azure portal for security recommendations and secure score.
Expected confirmation: A prioritized list of security findings, including vulnerable services, open ports, excessive user privileges, and non-compliant Azure resources. This forms the basis for security hardening efforts.
Step 6: Review Data Management & Disaster Recovery
Data is the lifeblood of any organization. This step evaluates your current backup strategies, disaster recovery (DR) plans, and data integrity measures. An effective DR strategy ensures business continuity in the face of outages, while robust data management prevents loss and corruption. Assess RTO (Recovery Time Objective) and RPO (Recovery Point Objective) against business requirements for each critical workload.
On-premises Windows Servers:
# List logical disks and their free space (indicates potential backup drive space issues or storage constraints)
Get-WmiObject -Class Win32_Volume | Select-Object Caption, FileSystem, Capacity, FreeSpace, Label | Format-Table -AutoSize
# Check for Windows Server Backup history (if used and installed)
Get-WmiObject -Namespace "root\Windows\Backup" -Class WBSummary | Select-Object LastBackupTime, BackupStatus, NumberOfBackups
Get-WmiObject -Class Win32_Volume: Gathers details about logical disk volumes.Get-WmiObject -Namespace "root\Windows\Backup" -Class WBSummary: Retrieves summary information from Windows Server Backup, if configured.
On-premises Linux Systems:
mount # Show mounted filesystems
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT # List block devices and their mount points
crontab -l | grep -i 'backup' # Check cron jobs for backup scripts
# For specific backup solutions, consult their CLI tools (e.g., 'duplicity --list-current-backups')
mount: Lists currently mounted filesystems.lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT: Provides a tree-like list of block devices and their attributes.crontab -l | grep -i 'backup': Searches the current user's cron jobs for entries containing 'backup'.
Azure Backup and Recovery:
# List all Recovery Services vaults in a subscription
az backup vault list --query "[].{Name:name, Location:location, ResourceGroup:resourceGroup}" -o table
# List all backup jobs for a specific vault and resource group
az backup job list --resource-group <VAULT_RESOURCE_GROUP> --vault-name <VAULT_NAME> --query "[].{Name:properties.entityFriendlyName, Operation:properties.operationName, Status:properties.status, Start:properties.startTime, End:properties.endTime}" -o table
# List protected items within a vault (VMs, databases, etc.)
az backup item list --resource-group <VAULT_RESOURCE_GROUP> --vault-name <VAULT_NAME> --query "[].{Name:name, ProtectionStatus:properties.protectionStatus, ItemType:properties.workloadType, Policy:properties.policyName}" -o table
az backup vault list: Enumerates all Azure Recovery Services vaults.az backup job list: Provides a history of backup and restore jobs within a specified vault.az backup item list: Lists all items configured for protection (e.g., Azure VMs, SQL databases) within a specific vault.
Portal alternative: Windows Disk Management, Azure Backup Center in the Azure portal, or within individual VM blades for backup status and configurations.
Expected confirmation: Documentation of current backup schedules, retention policies, storage locations, and a preliminary assessment of DR readiness based on collected data, identifying gaps against business RTO/RPO objectives.
Step 7: Evaluate Cloud Readiness & Optimization (Azure Focus)
As SkyCore Solutions specializes in Cloud Migration (Azure), this step is crucial. It involves identifying applications and workloads suitable for migration, assessing existing cloud resources for optimization, and recognizing opportunities to leverage Azure services. The goal is to move beyond a simple lift-and-shift mentality and embrace cloud-native best practices for long-term benefits.
On-premises systems for Azure Migration Suitability:
While direct CLI commands can't fully assess migration suitability without a dedicated tool like Azure Migrate, you can identify basic characteristics that influence strategy:
# For Windows: Identify non-domain joined servers or specific service dependencies
Get-WmiObject -Class Win32_ComputerSystem | Select-Object Name, DomainRole, PartOfDomain | Format-Table -AutoSize
Get-Service | Where-Object {$_.DisplayName -match "SQL Server|SAP|Oracle"} | Select-Object DisplayName, Status, StartType | Format-Table -AutoSize
# For Linux: Check for specific kernel versions or hardware dependencies that might pose migration challenges
uname -r
DomainRole: Indicates if a server is a domain controller, member server, etc., impacting migration strategy (e.g., AD DS migration, AAD Connect).Get-Service ... -match "SQL Server|SAP|Oracle": Helps identify common business-critical application services, which often require careful migration planning or re-platforming to PaaS.uname -r: Reports the kernel release, which can highlight very old OS versions potentially unsupported in the cloud.
Existing Azure Infrastructure Optimization:
# Identify stopped/deallocated VMs that might be incurring storage costs unnecessarily
az vm list --query "[?powerState=='Deallocated' || powerState=='Stopped'].{Name:name, ResourceGroup:resourceGroup, Location:location, PowerState:powerState, Size:hardwareProfile.vmSize}" -o table
# Get Azure Advisor cost recommendations
az advisor recommendation list --query "[?category=='Cost'].{Impact:impact, ShortDescription:shortDescription, Resource:resourceId, Category:category, Severity:resourceMetadata.resourceRecommendation.category}" -o table
# Get Azure Advisor performance recommendations
az advisor recommendation list --query "[?category=='Performance'].{Impact:impact, ShortDescription:shortDescription, Resource:resourceId, Category:category, Severity:resourceMetadata.resourceRecommendation.category}" -o table
# List all app services to identify potential scaling issues or unused plans
az webapp list --query "[].{Name:name, ResourceGroup:resourceGroup, Location:location, AppServicePlan:appServicePlanId}" -o table
az vm list --query "[?powerState=='Deallocated' || powerState=='Stopped']": Finds VMs that are deallocated or stopped. While deallocated VMs don't incur compute costs, their associated storage often does.az advisor recommendation list: Retrieves recommendations from Azure Advisor, which suggests optimizations for cost, performance, reliability, operational excellence, and security.--query "[?category=='Cost']": Filters recommendations to show only cost-related suggestions, like rightsizing VMs or deleting unused resources.az webapp list: Lists all Azure App Services, useful for reviewing web application deployments and their underlying service plans.
Portal alternative: Azure Migrate for on-premises assessment, Azure Advisor dashboard for cloud optimization recommendations, and reviewing individual resource blades in the Azure portal for configuration and metrics.
Expected confirmation: A preliminary list of on-premises workloads suitable for Azure migration, alongside identified opportunities for cost and performance optimization within your existing Azure environment. This enables the formation of a cloud adoption strategy.
Step 8: Synthesize Findings and Develop Recommendations
This final phase is where the raw data transforms into actionable intelligence. No CLI command can perform this step; it requires human expertise, critical thinking, and a deep understanding of business objectives. Review all collected data from the previous steps, looking for patterns, interdependencies, and significant deviations from best practices or desired states. This is the stage where the 'consultant' truly adds value.
Create a comprehensive report that:
- Summarizes the current state of the infrastructure (strengths, weaknesses, technical debt).
- Highlights key findings across performance, security, network, data management, and cloud readiness, often presented as a SWOT analysis.
- Provides clear, prioritized recommendations with estimated effort, cost, and potential benefits (e.g., ROI for cloud migration, risk reduction for security hardening).
- Aligns recommendations with the initial assessment objectives (e.g., reduce OpEx by 20%, improve security posture to X score, enable cloud adoption for Y applications).
- Includes a roadmap for implementation, distinguishing between quick wins and long-term strategic initiatives.
Opinionated: Prioritize recommendations based on their business impact and risk reduction, not just technical complexity or ease of implementation. A critical security vulnerability or a system risking major downtime should always take precedence over minor performance tweaks. Transparency about risks, costs, and benefits is key for executive buy-in.
Expected confirmation: A structured assessment report with a prioritized list of actionable recommendations for infrastructure improvement, cloud migration, and security hardening, ready for executive review and strategic planning.
When to bring in a consultant
While this guide provides a robust framework for an in-house IT infrastructure assessment, the sheer complexity of modern, hybrid environments, coupled with the need for specialized expertise in areas like advanced security hardening, complex Azure migrations, or large-scale infrastructure overhauls, can quickly overwhelm internal teams. If you lack the bandwidth, specific skill sets, or an unbiased external perspective to interpret findings and build a strategic roadmap that aligns with your business goals, it’s often more efficient and effective to engage a specialized consulting firm. SkyCore Solutions excels in these complex scenarios, translating assessment data into clear, executable strategies to optimize your IT landscape.
Book a free consultation