GinShell.Azure/Public/Get-GsAzureVmFullInfo.ps1

function Get-GsAzureVmFullInfo {
    param (
        [string[]]$VmName,
        [string]$ResourceGroupName
    )

    try {
        Write-GsLog -Message "Fetching Azure VM details..." -Type Info

        $allVms = if ($ResourceGroupName) {
            Get-AzVM -ResourceGroupName $ResourceGroupName
        }
        else {
            Get-AzVM
        }

        $filteredVms = if ($VmName) {
            $allVms | Where-Object { $_.Name -in $VmName }
        }
        else {
            $allVms
        }

        if (-not $filteredVms -or $filteredVms.Count -eq 0) {
            Write-GsLog -Message "No matching VMs found." -Type Warning
            return
        }

        $vmDetailsList = foreach ($vm in $filteredVms) {
            $vmStatus = Get-AzVM -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Status

            # Get disk info
            $osDiskName = $vm.StorageProfile.OSDisk.Name
            $dataDiskNames = $vm.StorageProfile.DataDisks.Name
            $allDiskNames = @($osDiskName) + $dataDiskNames
            $disks = $allDiskNames | ForEach-Object {
                Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $_
            }

            # Get NICs
            $nicIds = $vm.NetworkProfile.NetworkInterfaces.Id
            $nics = $nicIds | ForEach-Object {
                Get-AzNetworkInterface -ResourceId $_
            }

            # Build NIC and IP details
            $nicDetails = foreach ($nic in $nics) {
                $ipConfigs = $nic.IpConfigurations | ForEach-Object {
                    [PSCustomObject]@{
                        PrivateIpAddress = $_.PrivateIpAddress
                        PublicIpAddress  = if ($_.PublicIpAddress) {
                            (Get-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name ($_.PublicIpAddress.Id.Split('/')[-1])).IpAddress
                        }
                        else { $null }
                        Subnet           = $_.Subnet.Id.Split('/')[-1]
                        Vnet             = $_.Subnet.Id.Split('/')[-3]
                    }
                }

                [PSCustomObject]@{
                    NicName   = $nic.Name
                    IpConfigs = $ipConfigs
                    Nsg       = if ($nic.NetworkSecurityGroup) {
                        (Get-AzNetworkSecurityGroup -ResourceGroupName $vm.ResourceGroupName -Name ($nic.NetworkSecurityGroup.Id.Split('/')[-1])).Name
                    }
                    else { $null }
                }
            }

            [PSCustomObject]@{
                Name           = $vm.Name
                ResourceGroup  = $vm.ResourceGroupName
                Location       = $vm.Location
                VmSize         = $vm.HardwareProfile.VmSize
                OSType         = $vm.StorageProfile.OSDisk.OsType
                ComputerName   = $vm.OsProfile.ComputerName
                ProvisionState = $vmStatus.ProvisioningState
                PowerState     = ($vmStatus.Statuses | Where-Object { $_.Code -like 'PowerState/*' }).DisplayStatus
                Disks          = $disks
                Nics           = $nicDetails
            }
        }

        return $vmDetailsList
    }
    catch {
        Write-GsLog -Message "Failed to retrieve VM details: $($_.Exception.Message)" -Type Error
        return
    }
}