$esxNamesFile = 'C:\esxNames.txt'
$csvReport = 'C:\report.csv'
$domainName = 'xyz-abc.local' # Must be FQDN domainname
$domainAdmin = 'Administrator'
$domainAdminPswd = 'Secret1!'
$roleName = 'Admin'
$groupName = 'virtualadmin' # Only group, not domain
# Connect vCenters (repeat for all vCenters you need)
Connect-VIServer -Server xyz
$report = @()
# Read target ESXi nodes
foreach($esxName in (Get-Content -Path $esxNamesFile)){
# Read root password
$pswd = Read-Host -Prompt "Enter root password for ESXi node $($esxName)"
# Place ESXi node in maintenance mode
Set-VMHost -VMHost $esxName -State Maintenance -Confirm:$false
$esx = Get-VMHost -Name $esxName
while($esx.State -ne 'maintenance'){
sleep 5
$esx = Get-VMHost -Name $esxName
}
# Join AD
$esxSrv = Connect-VIServer -Server $esxName -User root -Password $pswd
$adJoin = Get-VMHostAuthentication -VMHost $esxName -Server $esxSrv |
Set-VMHostAuthentication -Domain $domainName -JoinDomain -Username $domainAdmin -Password $domainAdminPswd -Confirm:$false
# Give group Admin permission
$role = Get-VIRole -Server $esxSrv -Name $roleName
$account = Get-VIAccount -Domain $domainName -Id $groupName -Group
New-VIPermission -Principal $account -Role $role -Entity $esx -Confirm:$false
# Take ESXi node out of maintenance mode
Set-VMHost -VMHost $esxName -State Connected -Confirm:$false
$esx = Get-VMHost -Name $esxName
while($esx.State -ne 'connected'){
sleep 5
$esx = Get-VMHost -Name $esxName
}
# Add to report
$report += New-Object PSObject -Property @{
ESXi = $esxName
Domain = $adJoin.Domain
}
Disconnect-VIServer -Server $esxSrv -Confirm:$false
}
$report | Export-Csv -Path $csvReport -UseCulture -NoTypeInformation