Introduction
Maintaining compliance with frameworks like NIST 800-53, CIS Benchmarks, and internal security baselines is a critical responsibility. Manual validation introduces errors and slows down audits. PowerCLI allows you to automate configuration checks and generate exportable reports for compliance validation.
In this article, you will:
- Audit host service status and lockdown mode
- Validate NTP, DNS, and time zone settings
- Check VM configuration against policy
- Generate CSV-based audit trails
- Identify non-compliant settings for remediation
Step 1: Audit Host Services
Get-VMHost | Get-VMHostService | Select VMHost, Key, Label, Running, Policy
Export services audit:
Get-VMHost | Get-VMHostService | Select VMHost, Key, Running, Policy | Export-Csv "C:\Reports\Host_Services_Audit.csv" -NoTypeInformation
Compare against baseline expectations (e.g., SSH should be disabled).
Step 2: Check Lockdown Mode and DCUI Access
Get-VMHost | Select Name, LockdownMode
DCUI status:
Get-VMHost | Get-VMHostService | Where-Object {$_.Key -eq "DCUI"}
Best practice: DCUI should be disabled in production.
Step 3: Validate Time Configuration
Get-VMHost | Get-VMHostNtpServer
Get-VMHost | Get-VMHostService | Where-Object {$_.Key -eq "ntpd"}
Confirm NTP service is set to start and running.
DNS validation:
Get-VMHost | Get-VMHostNetwork | Select VMHost, DnsAddress
Step 4: Scan VMs for Insecure Configurations
VM with no tools or outdated tools
Get-VM | Where-Object {$_.ExtensionData.Guest.ToolsStatus -ne "toolsOk"}
VM with snapshots older than 7 days
Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-7)}
VM without annotation or documentation
Get-VM | Where-Object {$_.Notes -eq $null}
Step 5: Report Insecure or Non-Compliant Configurations
Compile report:
$report = Get-VMHost | Select Name, LockdownMode, @{N="SSH Running";E={($_ | Get-VMHostService | Where-Object {$_.Key -eq "TSM-SSH"}).Running}}, @{N="NTP Servers";E={($_ | Get-VMHostNtpServer).NtpServer}}
$report | Export-Csv "C:\Reports\Compliance_Audit.csv" -NoTypeInformation
Diagram: Compliance Workflow with PowerCLI

Use Case: Quarterly Compliance Report Delivery
Build quarterly job to:
- Check SSH and NTP on all hosts
- Validate VM notes, snapshots, and tools status
- Export compliance package to CSV
- Deliver via secure email or shared drive
Automate with Windows Task Scheduler or a PowerShell script runner.
Troubleshooting
| Issue | Solution |
|---|---|
| SSH or DCUI status incorrect | Manually validate host profile vs actual service state |
| Missing data in CSV | Ensure all script objects are fully populated before export |
| NTP returns empty | Add fallback logic to check for service status and DNS availability |
| Compliance standard mapping unclear | Tag each script section with compliance ID (e.g., CIS 1.1.1, NIST AC-17) |
What’s Next
In the next article, we will look at:
- Multi-vCenter management using PowerCLI
- Consolidated queries and distributed action models