gpt4 book ai didi

azure - 使用 Powershell 查询 Azure AD 以查找哪些用户可以访问 Azure 中的不同资源

转载 作者:行者123 更新时间:2023-12-02 06:43:27 25 4
gpt4 key购买 nike

概述

我希望有一种方法来查询 Azure AD,并返回分配给 Azure 中不同资源组的 Azure AD 组的列表。

当前解决方案

目前,我有一个作为服务主体运行的 powershell 脚本,该脚本通过 Azure 进行身份验证,然后获取当前订阅。在此基础上搜索登录用户并返回该用户分配到的所有安全组。然后根据 AD 组分配到的所有资源组进行检查,返回登录用户可以访问的资源组中的 VM 列表。

这确实有效,但运行需要大约 10 分钟。我们每个订阅有 100 个资源组,速度很慢。

我已粘贴下面的代码,并删除了所有私有(private)信息。

问题

  • 了解一种使脚本运行得更快的方法 - 最多 30 秒。
  • 是否有更有效的方法来运行专门为此目的而设计的脚本或命令。

我正在使用 Az Powershell 2.4.0 库来创建代码。

function userLogin($azureAplicationId, $azureAppPassword) 
{
$azureTenantId= ""
$azurePassword = ConvertTo-SecureString $azureAppPassword -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Connect-AzAccount -Credential $psCred -TenantId $azureTenantId -ServicePrincipal
}

function userRGAccessCheck($RG)
{
$resoruceGroupChoice = Read-Host -Prompt "Enter Resource Group Name "
}

function userRTAccessCheck($RName)
{
$resoruceNameChoice = Read-Host -Prompt "Enter VM Name "
}


$subAccess = Read-Host -Prompt "Enter Subscription, Press (1) OR (2): `n(1) Microsoft Azure Enterprise Non-Production `n(2) Microsoft Azure Enterprise Production`n"

if ($subAccess -eq 1)
{

$azureAplicationId =""
$azureAppPassword = ""
userLogin -azureAplicationId $azureAplicationId -azureAppPassword $azureAppPassword
#userRGAccessCheck -RG $reresoruceGroupChoice

} elseif ($subAccess -eq 2)
{

$azureAplicationId =""
$azureAppPassword = ""
userLogin -azureAplicationId $azureAplicationId -azureAppPassword $azureAppPassword
#userRGAccessCheck -RG $reresoruceGroupChoice
#userRTAccessCheck -RName $resoruceNameChoice

} else
{
Write-Host "Please Enter 1 OR 2"
}


# Arrays for app
$groupArray = @()
$ADAccessGroupArray = @()
$resourceGroupArray = @()


$userObjectID = "USER_OBJECT_ID"

# Get AD User Groups and list of resource groups
$groupArray += (Get-AzADGroup -SearchString 'SS_*' | Select-Object -ExpandProperty Id)


foreach($group in $groupArray)
{
if(Get-AzADGroupMember -GroupObjectId $group | Where-Object {$_.Id -eq $userObjectID})
{
$ADAccessGroupArray += $group
Write-Host "User has access to group: " $group
} else
{
Write-Host "User does not have access to group: " $group
}
}


# Get a list of resource groups
$resourceGroupArray += Get-AzResourceGroup | Select-Object -ExpandProperty ResourceGroupName


# Check if the AD group has been assigned to the resource group
foreach ($resourceGroupName in $resourceGroupArray)
{

foreach ($ADAccessGroup in $ADAccessGroupArray)
{
if(Get-AzRoleAssignment -ResourceGroupName $resourceGroupName | Where-Object {$_.ObjectId -eq $ADAccessGroup})
{
Write-Host "User has access to group: " $resourceGroupName

}
}
}

$groupArray = $null
$ADAccessGroupArray = $null
$resourceGroupArray = $null

提前致谢

最佳答案

我做了一些修改,应该会有帮助。

function userLogin($azureAplicationId, $azureAppPassword) 
{
$azureTenantId= ""
$azurePassword = ConvertTo-SecureString $azureAppPassword -AsPlainText -Force
$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)
Connect-AzAccount -Credential $psCred -TenantId $azureTenantId -ServicePrincipal
}

function userRGAccessCheck($RG)
{
$resoruceGroupChoice = Read-Host -Prompt "Enter Resource Group Name "
}

function userRTAccessCheck($RName)
{
$resoruceNameChoice = Read-Host -Prompt "Enter VM Name "
}


$subAccess = Read-Host -Prompt "Enter Subscription, Press (1) OR (2): `n(1) Microsoft Azure Enterprise Non-Production `n(2) Microsoft Azure Enterprise Production`n"

if ($subAccess -eq 1)
{

$azureAplicationId =""
$azureAppPassword = ""
userLogin -azureAplicationId $azureAplicationId -azureAppPassword $azureAppPassword
#userRGAccessCheck -RG $reresoruceGroupChoice

} elseif ($subAccess -eq 2)
{

$azureAplicationId =""
$azureAppPassword = ""
userLogin -azureAplicationId $azureAplicationId -azureAppPassword $azureAppPassword
#userRGAccessCheck -RG $reresoruceGroupChoice
#userRTAccessCheck -RName $resoruceNameChoice

} else
{
Write-Host "Please Enter 1 OR 2"
}


# Arrays for app
$groupArray = @()
$ADAccessGroupArray = @() -as [System.Collections.Arraylist] # Using Arraylist type
$resourceGroupArray = @()


$userObjectID = "USER_OBJECT_ID"

# Get AD User Groups and list of resource groups
$groupArray = (Get-AzADGroup -SearchString 'SS_*' | Select-Object -ExpandProperty Id) # Removed += because it is unnecessary


foreach($group in $groupArray)
{
if((Get-AzADGroupMember -GroupObjectId $group).where({$_.Id -eq $userObjectID},'First')) # Used where method
{
$null = $ADAccessGroupArray.Add($group) # Add group to arraylist and suppress output. Removed += because it is a slow operation here.
Write-Host "User has access to group: " $group
} else
{
Write-Host "User does not have access to group: " $group
}
}


# Get a list of resource groups
$resourceGroupArray = Get-AzResourceGroup | Select-Object -ExpandProperty ResourceGroupName # Removed += because it is unnecessary


# Check if the AD group has been assigned to the resource group
foreach ($resourceGroupName in $resourceGroupArray)
{

if((Get-AzRoleAssignment -ResourceGroupName $resourceGroupName).where({$_.ObjectId -in $ADAccessGroupArray},'First')) # used where method
{
Write-Host "User has access to group: " $resourceGroupName

}
}

$groupArray = $null
$ADAccessGroupArray = $null
$resourceGroupArray = $null

我向我更改的行添加了注释。以下是更改摘要:

  1. 我将 $ADAccessGroupArray 设置为数组列表类型。这样我们就可以访问固有的 Add() 方法来更新它。如果我们使用不可变的数组,则必须创建一个新数组来添加更多条目。更新数组的一种方法是使用 += ,随着数组大小的增长,这是一种非常低效的操作。
    • 通常,+= 并不是最有效的方法。有时这是一个可以忽略不计的操作,但我会避免它,除非你知道它可以忽略不计。
    • 我从其他数组分配中删除了 += ,因为当您将变量设置为返回数组的命令输出时,它们不是必需的。结果将是一个不带 += 的数组。在某些情况下,您的命令返回一个值,而您的变量可能不会成为数组。有多种方法可以使用 , 一元运算符或提前声明数组来解决此问题。
  2. 我替换了 Where-Object 以支持 where() 方法。 where-object(和 where())不仅会在执行任何操作之前等待 LHS 操作完成,还会在返回之前枚举所有管道项一个结果。使用 where() 方法,我们可以访问模式。在这两种情况下,我都使用 'First' 模式,以便 where() 一旦找到第一个条件匹配就会停止处理。如果您有一个包含 1000 个对象的列表并且匹配项位于该列表的上半部分,这将非常有用。
  3. 我删除了 $resourceGroupArray foreach 循环中嵌套的 foreach 循环。这可以通过更新下一个 where() 条件以使用 -in 运算符来实现。 -in 允许您在集合中查找一项,这就是您对每个组所做的操作。因此,我们减少了从 ResourceGroups x GroupsResourceGroupsGet-AzRoleAssignment 调用次数。这里应该可以节省大量时间。

关于azure - 使用 Powershell 查询 Azure AD 以查找哪些用户可以访问 Azure 中的不同资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57005804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com