From 79b7ae1612e0e4f8c4dceae5057fcb761a9c9de4 Mon Sep 17 00:00:00 2001 From: Charlie Silverman Date: Wed, 29 Jul 2026 16:52:04 -0700 Subject: [PATCH] Create VM-GIStatus.ps1.ps1 --- vSphere Tools/VM-GIStatus.ps1.ps1 | 208 ++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 vSphere Tools/VM-GIStatus.ps1.ps1 diff --git a/vSphere Tools/VM-GIStatus.ps1.ps1 b/vSphere Tools/VM-GIStatus.ps1.ps1 new file mode 100644 index 0000000..1abbd69 --- /dev/null +++ b/vSphere Tools/VM-GIStatus.ps1.ps1 @@ -0,0 +1,208 @@ +param ( + [string]$vcenter = "", + [string]$folder = "", + [string]$outputfile = "GIStatus.xlsx", + [switch]$savecred, + [switch]$Help = $false, + [Parameter(ValueFromRemainingArguments=$true)] $UnmappedArguments +) + +# Variables +$fileVersion = "1.0.0" +$fileDate = "2026-07-29" +$scriptName = Split-Path -Path $PSCommandPath -Leaf + +# Display Script Banner +Write-Host "--------------------------------------------------" -ForegroundColor White +Write-Host "Check VMs for Network Introspection Service" -ForegroundColor Green +Write-Host "Version $($FileVersion) ($($FileDate))" -ForegroundColor Green +Write-Host "Written by Charlie Silverman" -ForegroundColor Green +Write-Host "--------------------------------------------------" -ForegroundColor White + +if ($UnmappedArguments) { + Write-Warning "Invalid parameters: $UnmappedArguments" + exit +} + +function CheckModuleInstalled($moduleName, $command) { + Write-Host "Checking that package $moduleName is installed..." -NoNewLine + if (-not(get-command $command -erroraction silentlycontinue)) { + Write-Host " Missing" -ForegroundColor Red + if (-not (Get-Module -ListAvailable -Name $moduleName)) { + $response = "" + while (($response -ne "yes") -and ($response -ne "no")) { + $response = (Read-Host "$moduleName module not instaled. Install now? (yes/no)").ToLower() + } + if ($response -eq "no") { + Write-Host "Operation Cancelled." -ForegroundColor Yellow + exit + } + Write-Host "Installing PowerShell module $moduleName..." -NoNewLine + Install-Module -Name $moduleName -Scope CurrentUser -Force + Write-Host " Success" -ForegroundColor Green + } + Write-Host "Loading PowerShell module $moduleName..." -NoNewLine + Import-Module $moduleName + Write-Host " Success" -ForegroundColor Green + } else { + Write-Host " Found" -ForegroundColor Green + } +} + +if ($Help) { + Write-Host "Command Syntax:" -ForegroundColor Green + Write-Host '$scriptName -vcenter [VCURI] -folder [FOLDER] -csvfile [CSVFILE] [-help] [-savecred]' -ForegroundColor Green + Write-Host "" + Write-Host "Command line options:" -ForegroundColor Green + Write-Host "---------------------" -ForegroundColor Green + Write-Host "-vcenter - Specify the URI for the vCenter server" -ForegroundColor Green + Write-Host "-folder - Specify the folder to query. If not specified, all VMs will be processed." -ForegroundColor Green + Write-Host "-outputfile - Specify the path to the CSV file for output. If not specified, the file name." -ForegroundColor Green + Write-Host " ""GIStatus.csv"" will be saved to the current directory." -ForegroundColor Green + Write-Host "-savecred - Save Credentials. If credentials were previously saved and this option is not selected," -ForegroundColor Green + Write-Host " they will be used." -ForegroundColor Green + Write-Host "-help - Show this help information." -ForegroundColor Green + exit +} + +# Check for required PowerShell Modules +CheckModuleInstalled -moduleName "VCF.PowerCLI" -command "connect-viserver" +CheckModuleInstalled -moduleName "ImportExcel" -command "import-excel" + +$quiet = Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false + +if ($vCenter -eq "") { + $vCenter = Read-Host "Enter name of vCenter Server" +} + +if (!(Test-Connection -ComputerName $vcenter -ErrorAction SilentlyContinue)) { + Write-Error "ERROR: Unable to reach vCenter server $vcenter" + exit +} + + +if ($SaveCred) { + $credential = Get-Credential -Message "Enter credentials for vCenter server $vCenter" + $credential | Export-Clixml -path $env:USERPROFILE\kistools-$vcenter.cred + Write-Host "Saving credentials." +} + +if (Test-Path -path $env:USERPROFILE\kistools-$vcenter.cred -PathType Leaf) { + $credentials = Import-Clixml -path $env:USERPROFILE\kistools-$vcenter.cred + Write-Host "Using stored credentials" +} else { + $credentials = Get-Credential -Message "Enter credentials for vCenter server $vCenter" + if (!$credentials) { + Write-Warning "WARNING: No credentials were entered" + } +} + +if (Test-Path -path $outputfile -PathType Leaf -ErrorAction SilentlyContinue) { + Write-Warning "File $outputfile already exists. Overwrite?" -NoNewLine + Write-Host " (Y/N) " -NoNewLine + if ((Read-Host) -eq "Y") { + Remove-Item -Path $outputfile + } else { + Write-Error "Operation Aborted." + exit + } +} + +try { + Write-Host -NoNewLine "Connecting to vCenter $vcenter... " + $vcconn = Connect-VIServer $vcenter -Credential $credentials -ErrorAction SilentlyContinue + Write-Host "Success" -ForegroundColor green +} catch { + Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine + Write-Host + exit +} + +if ($folder) { + try { + Write-Host -NoNewLine "Checking for folder $folder... " + $vmfolder = Get-Folder $folder -ErrorAction SilentlyContinue + + if (!$vmfolder) { + Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine + Write-Host + Write-Error "ERROR: Folder $folder not found. Please try again." + exit + } else { + Write-Host "Success" -ForegroundColor green + } + } catch { + Write-Host "Failure" -ForegroundColor Yellow -BackgroundColor Red -NoNewLine + Write-Host + Write-Error "ERROR: Unable to validate folder." + exit + } + +$vms = $vmfolder | Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" -and $_.Guest.State -eq "Running" } | Sort-Object -Property Name +} else { + $VMs = Get-VM | Where-Object { $_.PowerState -eq "PoweredOn" -and $_.Guest.State -eq "Running" } | Sort-Object -Property Name +} + +$vmresult = @() + +$counter = 0 +foreach ($vm in $VMs) { + $counter ++ + $percent = ($counter / ($VMs.count + 1)) * 100 + Write-Progress -Activity "Querying VMs" -Status "Checking VM $counter of $($VMs.count) - $([Math]::Round($percent))% complete" -PercentComplete $percent + if ($vm.Guest.OSFullName -match "Windows") { + try { + if ($_.ExtensionData.Guest.ToolsVersionStatus -eq "guestToolsNeedUpgrade") { + $note = " - VMware Tools Out of Date" + } + $script = "sc query vnetwfp" + $ProgressPreference = 'SilentlyContinue' + $result = Invoke-VMScript -VM $vm -ScriptText $script -ScriptType bat -WarningAction SilentlyContinue -ErrorAction Stop + $ProgressPreference = 'Continue' + if ($result.ScriptOutput -notmatch "RUNNING") { + $vmresult += [PSCustomObject]@{ + VMName = $vm.Name + OS = $vm.Guest.OSFullName + VMToolsVersion = $vm.ExtensionData.Guest.ToolsVersion + VMToolsStatus = $vm.ExtensionData.Guest.ToolsVersionStatus + Status = "Network Introspection not enabled" + Note = $note + } + } else { + $vmresult += [PSCustomObject]@{ + VMName = $vm.Name + OS = $vm.Guest.OSFullName + VMToolsVersion = $vm.ExtensionData.Guest.ToolsVersion + VMToolsStatus = $vm.ExtensionData.Guest.ToolsVersionStatus + Status = "Network Introspection enabled" + Note = $note + } + } + } catch { + $vmresult += [PSCustomObject]@{ + VMName = $vm.Name + OS = $vm.Guest.OSFullName + VMToolsVersion = $vm.ExtensionData.Guest.ToolsVersion + VMToolsStatus = $vm.ExtensionData.Guest.ToolsVersionStatus + Status = "ERROR" + Note = "Unable to query status$note" + } + } + } +} + +Write-Progress -Activity "Querying VMs" -Completed + +$sheetTitle = "Network Introspection Status For $vcenter" +if ($vmfolder) { + $sheetTitle += " - Folder $folder" +} + +echo $vmresult + +Write-Host "Writing information about $($vmresult.length) VMs to file $outputfile..." -NoNewLine +$exceltable = $vmresult | Export-Excel -path $outputfile -WorksheetName "Network Introspection Status" -PassThru -Autosize -FreezeTopRow ` + -TableName "NIStatus" -TableStyle Medium15 -Title $sheetTitle -TitleBold -TitleSize 22 +$exceltable.Workbook.WorkSheets[1].Tables["NIStatus"].ShowFilter = $false +Close-ExcelPackage $exceltable +Write-Host " Success" -ForegroundColor Green