Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure/Powershell/获取具有订阅名称的VM IP_Azure_Powershell - Fatal编程技术网

Azure/Powershell/获取具有订阅名称的VM IP

Azure/Powershell/获取具有订阅名称的VM IP,azure,powershell,Azure,Powershell,我有一个脚本,可以输出订阅的所有VM IP。我要解决的问题是在输出中获取订阅名称。目前,脚本会遍历所有订阅并返回VM名称、资源组、内部/外部IP等。但无论我尝试什么,都无法获得同时返回订阅名称的输出。我可以用订阅标题填充字段,但字段为空 我的最终目标是让所有具有公共地址的虚拟机用于审核NSG规则,但也包括订阅名称 有什么想法吗 $reportName = "AzVMIPs.csv" Get-AzSubscription | Select-AzSubscription | Fo

我有一个脚本,可以输出订阅的所有VM IP。我要解决的问题是在输出中获取订阅名称。目前,脚本会遍历所有订阅并返回VM名称、资源组、内部/外部IP等。但无论我尝试什么,都无法获得同时返回订阅名称的输出。我可以用订阅标题填充字段,但字段为空

我的最终目标是让所有具有公共地址的虚拟机用于审核NSG规则,但也包括订阅名称

有什么想法吗

$reportName = "AzVMIPs.csv"
Get-AzSubscription | Select-AzSubscription | ForEach-Object {$_ 
$report = @()
$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) { 
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress 
    $vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id 
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPAddress = $publicIp.ipaddress
            } 
        } 
        $info.OsType = $vm.StorageProfile.OsDisk.OsType 
        $info.VMName = $vm.Name 
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.Region = $vm.Location 
        $info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3] 
        $info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1] 
        $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress 
        $report+=$info 
    } 
$report | Export-CSV "$home\$reportName" -NoTypeInformation -Append
}

谢谢,

我稍微修改了代码,它还报告了订阅名称。请自己试一试

$reportName = "D:\AzVMIPs.csv"
Get-AzSubscription | Select-AzSubscription | ForEach-Object {$_ 
$report = @()

$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) { 
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, SubscriptionName 
    $vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id 
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPAddress = $publicIp.ipaddress
            } 
        } 
        $info.OsType = $vm.StorageProfile.OsDisk.OsType 
        $info.VMName = $vm.Name
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.Region = $vm.Location 
        $info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3] 
        $info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1] 
        $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress
        $info.SubscriptionName = (Get-AzContext).Name
        $report+=$info
        } 
        
$report | Export-CSV "D:\1.CSV" -NoTypeInformation -Append
}
谢谢,
Manu

我稍微修改了代码,它还报告了订阅名称。请自己试一试

$reportName = "D:\AzVMIPs.csv"
Get-AzSubscription | Select-AzSubscription | ForEach-Object {$_ 
$report = @()

$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) { 
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, SubscriptionName 
    $vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id 
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPAddress = $publicIp.ipaddress
            } 
        } 
        $info.OsType = $vm.StorageProfile.OsDisk.OsType 
        $info.VMName = $vm.Name
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.Region = $vm.Location 
        $info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3] 
        $info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1] 
        $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress
        $info.SubscriptionName = (Get-AzContext).Name
        $report+=$info
        } 
        
$report | Export-CSV "D:\1.CSV" -NoTypeInformation -Append
}
谢谢,
Manu

如果要在报告中获取订阅名称,请参考以下脚本

$reportName = "AzVMIPs.csv"
(Get-AzSubscription)|ForEach-Object{
 
 Select-AzSubscription $_

$report = @()
$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) { 
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, SubscriptionName
    $vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id 
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPAddress = $publicIp.ipaddress
            } 
        } 
        $info.OsType = $vm.StorageProfile.OsDisk.OsType 
        $info.VMName = $vm.Name 
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.Region = $vm.Location 
        $info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3] 
        $info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1] 
        $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress
        $info.SubscriptionName=$_.Name 
        $report+=$info 
    } 
$report | Export-CSV "$home\$reportName" -NoTypeInformation -Append

}

如果要在报告中获取订阅名称,请参考以下脚本

$reportName = "AzVMIPs.csv"
(Get-AzSubscription)|ForEach-Object{
 
 Select-AzSubscription $_

$report = @()
$vms = Get-AzVM
$publicIps = Get-AzPublicIpAddress 
$nics = Get-AzNetworkInterface | ?{ $_.VirtualMachine -NE $null}
foreach ($nic in $nics) { 
    $info = "" | Select-Object VmName, ResourceGroupName, Region, VirturalNetwork, Subnet, PrivateIpAddress, OsType, PublicIPAddress, SubscriptionName
    $vm = $vms | ? -Property Id -eq $nic.VirtualMachine.id 
    foreach($publicIp in $publicIps) { 
        if($nic.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPAddress = $publicIp.ipaddress
            } 
        } 
        $info.OsType = $vm.StorageProfile.OsDisk.OsType 
        $info.VMName = $vm.Name 
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.Region = $vm.Location 
        $info.VirturalNetwork = $nic.IpConfigurations.subnet.Id.Split("/")[-3] 
        $info.Subnet = $nic.IpConfigurations.subnet.Id.Split("/")[-1] 
        $info.PrivateIpAddress = $nic.IpConfigurations.PrivateIpAddress
        $info.SubscriptionName=$_.Name 
        $report+=$info 
    } 
$report | Export-CSV "$home\$reportName" -NoTypeInformation -Append

}

Azure资源图ARG也可以使用。它的主要优点是,它可以非常快地输出租户内所有订阅中的所有VM。例如,对于跨越数百个订阅的数千个虚拟机,获得输出文件只需几秒钟

下面的脚本将正确报告多个vmNic和每个vmNic的多个IP配置。如果从本地Powershell会话或云Shell运行,请确保首先安装了Az.ResourceGraph模块

针对我的测试租户运行的示例报告:

脚本将仅以当前形式报告租户中的前5000个VM。对于没有此类限制的版本,包括能够跨1000多个Azure订阅进行报告的版本,可以使用该脚本,只需将ARG查询替换为下面所示的查询即可

至于构建一个非常相似的Azure资源图查询,就像脚本中使用的查询一样——一开始可能看起来很神秘——本文将对此进行详细描述


Azure资源图ARG也可以使用。它的主要优点是,它可以非常快地输出租户内所有订阅中的所有VM。例如,对于跨越数百个订阅的数千个虚拟机,获得输出文件只需几秒钟

下面的脚本将正确报告多个vmNic和每个vmNic的多个IP配置。如果从本地Powershell会话或云Shell运行,请确保首先安装了Az.ResourceGraph模块

针对我的测试租户运行的示例报告:

脚本将仅以当前形式报告租户中的前5000个VM。对于没有此类限制的版本,包括能够跨1000多个Azure订阅进行报告的版本,可以使用该脚本,只需将ARG查询替换为下面所示的查询即可

至于构建一个非常相似的Azure资源图查询,就像脚本中使用的查询一样——一开始可能看起来很神秘——本文将对此进行详细描述


非常感谢。这是干净的,效果很好。后续问题-如何对excel中的列进行排序,以便首先使用子名称、资源组,然后使用VM等进行输出?更改脚本中$info的顺序似乎不会影响输出。@LæntsM。请尝试更改信息=|。。。as$info=|选择对象订阅名、资源组名、VmName、区域、虚拟网络、子网、PrivateIpAddress、OsType、PublicIPAddress。此外,请注意,请在尝试之前删除原始csv文件。因为您在命令Export CSVThank中添加了-Append!这是干净的,效果很好。后续问题-如何对excel中的列进行排序,以便首先使用子名称、资源组,然后使用VM等进行输出?更改脚本中$info的顺序似乎不会影响输出。@LæntsM。请尝试更改信息=|。。。as$info=|选择对象订阅名、资源组名、VmName、区域、虚拟网络、子网、PrivateIpAddress、OsType、PublicIPAddress。此外,请注意,请在尝试之前删除原始csv文件。因为您在命令Export csvt中添加了-Append!这真是太棒了!我选择另一个答案只是因为订阅名称在输出中更干净,并且没有包含子ID或我的公司用户名。谢谢!这真是太棒了!我选择了另一个答案,只是因为订阅名称在输出中更清晰,并且没有包含子ID或我的公司用户名。